所以我有这个图像处理程序,我使用线性回归算法找到最适合所有点的平面(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是x,y平面中的像素位置。
当图片的尺寸可以被100整除时,它的完美但是当它不是图片破裂时。图片本身与原件相同,但有一条对角线,颜色对比度穿过图片。该程序应该使像素颜色从中心均匀。
我尝试运行图片,其中mod_val = 0,因为100维图片不能分割,它可以完美地复制新图片。所以我怀疑在对齐方面存储和写入读取数据存在问题。 (fyi这张图片是灰度8 bit.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是正确的
非常感谢任何帮助。我一直试图找到这个bug好几个小时了,我的老板告诉我,在找到这个bug之前我不能回家......
算法前的(1400 x 1100,有效)
后
之前(1490 x 1170,演示问题)
后
更新: 好吧,经过大量测试后,我已将问题归结为x坐标。
这是因为当我为1400x1100使用大的A或B值或两者(C值总是〜.999)时,它不会创建对角线。
然而,对于另一个图像,大B值不会创建对角线,但是相当小 - 平均A值会创建对角线。
更重要的是,当我测试一张图片,其中x不可分辨100但y可以被10整除。答案是正确的。
答案 0 :(得分:1)
最后我找到了解决方案。由于填充了位图,这是一个问题。当x上的维度不能被4整除时,它将使用填充,这会抛弃所有的x坐标。这也意味着我从bmp头部收到的row_value与维度相同但实际上并不完全相同。我不得不做一个我必须做的编辑:4 *(row_value_from_bmp_header + 3)/ 4。