Средний код размытия - PullRequest
       11

Средний код размытия

0 голосов
/ 28 марта 2011
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 ]

1 голос
/ 29 марта 2011

Я думаю, это должно быть либо int pixelPosition = j*a.width + i;, либо int pixelPosition = i*a.height + j;

Предположим, ваше изображение 100х10, что означает, что в нем 1000 элементов.Если вы смотрите на элемент (50,5), то i = 50 и j = 5, исходный код говорит pixelPosition = i*a.width + j;, что означает pixelPosition = 50 * 100 + 5 = 5005, что находится за пределами диапазона.Если вы посмотрите на свой код, вы всегда используете (i +/- 1) * width + (j +/- 1), поэтому все будет в порядке для строк, где я меньше высоты, но все остальное будет внеrange.

Следующая проблема - усреднение красного, зеленого и синего.Вам следует либо преобразовать в серый, либо в другую переменную цветового пространства, а не объединять цвета.

Следующая проблема - ошибка округления.Каждая сумма будет усечена, когда значения RGB малы.Используйте тип с плавающей запятой, а затем приведите его на последнем шаге.

Следующая проблема находится в последней строке:

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

aBlur похоже на размытие в оттенках серого.входного изображения, но я не знаю, как устанавливается цветовое пространство, давайте предположим, что это RGB.Вы копируете исходный пиксель и добавляете в цветную версию размытия?

Предположим, исходный пиксель равен (150,150,150), а усредненное значение, которое вы получаете, равно 170. Если функция color (170) составляет пиксель (170,170,170)) тогда сумма оригинала и среднего будет (320 320 320).Так что теперь значение пикселя далеко от размытой версии оригинала.

Я подозреваю, что эта строка должна быть

aBlur.pixels[pixelPosition] = color(total);
0 голосов
/ 28 марта 2011

Я написал довольно подробное описание того, как делать ядра размытия (и свертку в целом) здесь:

Как гауссово размытие изображения без использования встроенных гауссовых функций?

...