所以我有这个图像处理程序,我使用线性回归算法来找到一个最适合所有点的平面(x,y,z:z 是像素颜色强度(0-255)
简单地说,我有这张照片?X ?方面。我运行这个算法,我得到了这些 A、B、C 值。(3 个浮点值)
然后我去程序中的每个像素,并用 mod_val 减去像素值,其中
mod_val = (-A * x -B * y ) / C
A,B,C 是常数,而 x,y 是 ax,y 平面中的像素位置。
当图片的维度可以被 100 整除时,它是完美的,但当它不是图片时,它就会破裂。图片本身与原始图片相同,但有一条带有颜色对比的对角线穿过图片。该程序应该使像素颜色从中心均匀。
我尝试运行 mod_val = 0 的图片,因为它不能被 100 维图片整除,它完美地复制了一张新图片。所以我怀疑在对齐方面存储和写入读取数据存在问题。(仅供参考,这张图片是灰度 8 位.bmp)
我尝试更改 A、B、C 值,但对角线保持不变。对角线内的图像片段的颜色会发生变化。
当我运行 1400 x 1100 图片时,它与上面写的 mod_val 方程完美配合,这是最令人困惑的部分。
我花了很多时间寻找舍入错误。它们几乎都是花车。我用于破坏图片的尺寸是 1490 x 1170。
这是我认为发生错误的代码片段:
int img_row = row_length;
int img_col = col_length;
int i = 0;
float *pfAmultX = new float[img_row];
for (int x = 0; x < img_row; x++)
{
pfAmultX[x] = (A * x)/C;
}
for (int y = 0; y < img_col; y++)
{
float BmultY = B*y/C;
for (int x = 0; x < img_row; x++, i++)
{
modify_val = pfAmultX[x] + BmultY;
int temp = (int) data.data[i];
data.data[i] += (unsigned char) modify_val;
if(temp >= 250){
data.data[i] = 255;
}
else if(temp < 0){
data.data[i] = 0;
}
}
}
delete[] pfAmultX;
根据 VS 调试器模式,img_row、img_col 是正确的
任何帮助将不胜感激。我已经尝试找到这个错误好几个小时了,我的老板告诉我,在我找到这个错误之前我不能回家......
算法之前(1400 x 1100,工作) 之后
之前(1490 x 1170,演示问题) 之后
更新:经过广泛的测试,我已经将问题归结为 x 坐标。
这是因为当我对 1400x1100 使用较大的 A 或 B 值或两者(C 值始终为 ~.999)时,它不会创建对角线。
但是,对于另一张图像,较大的 B 值不会创建对角线,但相当小的平均 A 值会创建对角线。
更重要的是,当我测试一张 x 可被 100 整除但 y 可被 10 整除的图片时,答案是正确的。