2013-06-13 17 views
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是x,y平面中的像素位置。

当图片的尺寸可以被100整除时,它的完美但不是图片断裂时。图片本身与原图相同,但有一条对角线与颜色对比度横跨图片。该程序应该使中心的像素颜色一致。

我试图运行图片mod_val = 0不能被100维图片整除,并且它完美地复制了一张新图片。所以我怀疑存储和写入读取数据的对齐方面存在问题。 (这张图片是灰度8 bit.bmp)

我试过改变A,B,C值,但对角线保持不变。对角线内图像碎片的颜色会发生变化。

当我运行1400 x 1100图片时,它完全符合上面写的mod_val方程,这是最令人困惑的部分。

我花了很多时间寻找舍入误差。他们几乎都是漂浮物。我用于破坏图像的尺寸为1490 X 1170

这里是代码的gragment其中i认为一个错误正在发生:

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; 

的img_row,img_col根据VS调试模式

是正确的

任何帮助将不胜感激。我一直试图找到这个错误现在好几个小时,我的老板告诉我,我不能回家,直到我找到这个bug .....

算法之前(1400 x 1100,工程) 嗯,我归结问题的东西: imgur.com/pBCBzdH imgur.com/KiG6Jx2

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

更新后与广泛的测试后的x坐标。

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

但是,对于其他图像,大B值不会创建对角线,但会产生相当小的 - avg A值会创建对角线。

还有什么,当我测试一张图片,其中x不能被100分,但y可以被10整除时,答案是正确的。

+0

你可以张贴四张图片:1)之前,2)没有显示错误后(尺寸可以被100除尽), 3)之前,4)显示错误之后? – Patashu

+0

我想但我不能,因为我需要改变10声望.... – user2427671

+0

将它们上传到像imgur这样的网站,并从您的问题链接到它们。之后我可以编辑它们直接显示。 – Patashu

回答

1

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

+0

听起来像一个讨厌的bug :) – Patashu

+0

它是。我在凌晨3点40分回家,只能回家,因为我看了8次后没有运气,因此我的老板在和我一起看了2个小时后才发现它。 – user2427671

+0

这是一个众所周知的问题与BMP文件。对不起,我以前没有看到这个问题。 –