平均模糊代码错误

时间:2011-03-28 17:26:50

标签: image-processing processing

PImage toAverageBlur(PImage sourceImg)

{

    PImage newImg = new PImage(sourceImg.width, sourceImg.height);
    float r0,r1,r2,r3,r4,r5,r6,r7,r8;
    float b0,b1,b2,b3,b4,b5,b6,b7,b8;
    float g0,g1,g2,g3,g4,g5,g6,g7,g8;
    float total;

    newImg.loadPixels();
    for(int i = 1; i < sourceImg.width-1; i++)
    {
      for(int j = 1; j < sourceImg.height-1; j++)
      {
        int pixelPosition = i*sourceImg.width + j;



         r1 = red(sourceImg.pixels[((i)*sourceImg.width)+(j-1)]);
         b1 = blue(sourceImg.pixels[((i)*sourceImg.width)+(j-1)]);
         g1 = green(sourceImg.pixels[((i)*sourceImg.width)+(j-1)]);
         float sumOne = (r1+b1+g1)/9;


         r2 = red(sourceImg.pixels[((i)*sourceImg.width)+(j+1)]);
         b2 = blue(sourceImg.pixels[((i)*sourceImg.width)+(j+1)]);
         g2 = green(sourceImg.pixels[((i)*sourceImg.width)+(j+1)]);
         float sumTwo = (r2+b2+g2)/9;


         r3 = red(sourceImg.pixels[((i-1)*sourceImg.width)+(j-1)]);
         b3 = blue(sourceImg.pixels[((i-1)*sourceImg.width)+(j-1)]);
         g3 = green(sourceImg.pixels[((i-1)*sourceImg.width)+(j-1)]);
         float sumThree = (r3+b3+g3)/9;


         r4 = red(sourceImg.pixels[((i-1)*sourceImg.width)+(j)]);
         b4 = blue(sourceImg.pixels[((i-1)*sourceImg.width)+(j)]);
         g4 = green(sourceImg.pixels[((i-1)*sourceImg.width)+(j)]);
         float sumFour = (r4+b4+g4)/9;


         r5 = red(sourceImg.pixels[((i-1)*sourceImg.width)+(j+1)]);
         b5 = blue(sourceImg.pixels[((i-1)*sourceImg.width)+(j+1)]);
         g5 = green(sourceImg.pixels[((i-1)*sourceImg.width)+(j+1)]);
         float sumFive = (r5+b5+g5)/9;


         r6 = red(sourceImg.pixels[((i+1)*sourceImg.width)+(j-1)]);
         b6 = blue(sourceImg.pixels[((i+1)*sourceImg.width)+(j-1)]);
         g6 = green(sourceImg.pixels[((i+1)*sourceImg.width)+(j-1)]);
         float sumSix = (r6+b6+g6)/9;


         r7 = red(sourceImg.pixels[((i+1)*sourceImg.width)+(j)]);
         b7 = blue(sourceImg.pixels[((i+1)*sourceImg.width)+(j)]);
         g7 = green(sourceImg.pixels[((i+1)*sourceImg.width)+(j)]);
         float sumSeven = (r7+b7+g7)/9;


         r8 = red(sourceImg.pixels[((i+1)*sourceImg.width)+(j+1)]);
         b8 = blue(sourceImg.pixels[((i+1)*sourceImg.width)+(j+1)]);
         g8 = green(sourceImg.pixels[((i+1)*sourceImg.width)+(j+1)]);
         float sumEight = (r8+b8+g8)/9;

         r0 = red(sourceImg.pixels[pixelPosition]);
         b0 = blue(sourceImg.pixels[pixelPosition]);
         g0 = green(sourceImg.pixels[pixelPosition]);
         float sumZero = (r0+b0+g0)/9;

         total = sumOne+sumTwo+sumThree+sumFour+sumFive+sumSix+sumSeven+sumEight+sumZero;

         newImg.pixels[pixelPosition] =  color(total);


      }
    }
   newImg.updatePixels();
    return newImg;
}

2 个答案:

答案 0 :(得分:1)

我认为它应该是int pixelPosition = j*a.width + i;int pixelPosition = i*a.height + j;

假设您的图像是100x10,这意味着有1000个元素。如果您正在查看元素(50,5)然后i = 50且j = 5,则原始代码显示pixelPosition = i*a.width + j;,这意味着pixelPosition = 50 * 100 + 5 = 5005,这超出了范围。如果你看一下你的代码,你总是使用(i +/- 1)* width +(j +/- 1),所以对于我小于高度但其他一切都不会出现的行,一切都会好的。范围。

下一个问题是平均红色,绿色和蓝色。您应该转换为灰色或其他颜色空间变量不合并颜色。

下一个问题是舍入错误。当RGB值很小时,每个总和都将被截断。使用浮点类型,然后在最后一步中投射它。

下一个问题是在最后一行:

aBlur.pixels[pixelPosition] = a.pixels[pixelPosition] + color(total);

aBlur似乎是它应该是输入图像的灰度模糊,但我不知道如何设置颜色空间,让我们假设它是RGB。您复制原始像素并添加模糊版本的模糊?

假设原始像素是(150,150,150),你得到的平均值是170.如果函数颜色(170)产生一个像素(170,170,170),那么原始像素和平均值的总和将是(320,320,320)。所以现在像素值远远不是原版的模糊版本。

我怀疑这条线应该是

aBlur.pixels[pixelPosition] = color(total);

答案 1 :(得分:0)

我在这里写了一个非常全面的描述如何模糊内核(以及一般的卷积):

How do I gaussian blur an image without using any in-built gaussian functions?