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;
}
答案 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?