C++ 一种平面拟合图像处理算法的超神秘逻辑误差

C++ 一种平面拟合图像处理算法的超神秘逻辑误差,c++,image-processing,bmp,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整除时,它是完美的,但当它不是时,图片破裂。图片本身与原始图片相同,但有一条带颜色对比度的对角线穿过图片。该程序应使像素颜色从中

所以我有一个图像处理程序,我使用线性回归算法找到一个最适合所有点的平面(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维图片整除,它完美地复制了一张新图片。因此,我怀疑在对齐方面存储和写入读取数据是否有问题。(仅供参考,这张图片是灰度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;
int img_row=行长度;
int img_col=col_长度;
int i=0;
浮动*pfAmultX=新浮动[img_行];
对于(int x=0;x=250){
数据.数据[i]=255;
}
否则如果(温度<0){
数据.数据[i]=0;
}
}
}
删除[]pfAmultX;
根据VS调试器模式,img_行、img_列是正确的

如果有任何帮助,我将不胜感激。我已经试着找到这个bug好几个小时了,我的老板告诉我,在找到这个bug之前我不能回家

算法之前(1400 x 1100,有效) 之后

之前(1490 x 1170,演示问题) 之后

更新: 经过广泛的测试,我把这个问题归结为x坐标的问题

这是因为当我对1400x1100使用较大的A或B值或两者(C值始终为0.999)时,它不会创建对角线

但是,对于另一幅图像,较大的B值不会创建对角线,但相当小的-avg a值会创建对角线


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

最终我找到了解决方案。这是一个问题,因为位图中的填充。当x上的维度不可被4整除时,它将使用填充,这将丢弃所有的x坐标。这也是我的问题ant我从bmp头中收到的行值与尺寸相同,但实际上并不相同。我必须在我必须做的地方进行编辑:4*(行值从bmp头+3)/4。

你能发布四张图片吗:1)之前,2)没有显示错误后(尺寸可被100整除),3)之前,4)显示错误后?我想,但我不能,因为我需要至少10个声誉…将它们上传到像imgur这样的网站,并从您的问题链接到它们。我可以编辑它们以直接显示在那之后。在算法之前(1400 x 1100)在之前(1490 x 1170)之后在你确定常数A、B和C的地方有可能出现错误吗?例如,在你的问题中,图1和图2的A、B和C是什么?听起来像一个讨厌的错误:)是的。我在凌晨3:40回家,只回家,因为我看了8个小时后,老板和我一起看了2个小时就发现了它,但没有运气……这是BMP文件的一个众所周知的问题。对不起,我之前没有看到这个问题。