3

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

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

更新:经过广泛的测试,我已经将问题归结为 x 坐标。

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

但是,对于另一张图像,较大的 B 值不会创建对角线,但相当小的平均 A 值会创建对角线。

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

4

1 回答 1

1

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

于 2013-06-14T04:30:56.647 回答