平面拟合图像处理算法的超级神秘逻辑误差

时间:2013-06-13 06:19:35

标签: c++ image-processing bmp

所以我有这个图像处理程序,我使用线性回归算法找到最适合所有点的平面(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,有效) imgur.com/pBCBzdHimgur.com/KiG6Jx2

之前(1490 x 1170,演示问题) imgur.com/zSRUdJiimgur.com/eXvef88

更新: 好吧,经过大量测试后,我已将问题归结为x坐标。

这是因为当我为1400x1100使用大的A或B值或两者(C值总是〜.999)时,它不会创建对角线。

然而,对于另一个图像,大B值不会创建对角线,但是相当小 - 平均A值会创建对角线。

更重要的是,当我测试一张图片,其中x不可分辨100但y可以被10整除。答案是正确的。

1 个答案:

答案 0 :(得分:1)

最后我找到了解决方案。由于填充了位图,这是一个问题。当x上的维度不能被4整除时,它将使用填充,这会抛弃所有的x坐标。这也意味着我从bmp头部收到的row_value与维度相同但实际上并不完全相同。我不得不做一个我必须做的编辑:4 *(row_value_from_bmp_header + 3)/ 4。