2015-07-01 5 views
2

Я пишу фильтр Gaussian Blur с матрицей 3x3 (ядро) и используя QImage в качестве внешней библиотеки. Ядро вычисляется так, как должно быть. После того, как ядро ​​инициализации и вычислил я приношу unsigned int Matrix в программу:Как правильно развернуть Gaussian Blur?

typedef std::vector<std::vector<unsigned int> > uintMatrix; // For copying pixels value 

В main.cpp он инициализируется как:

uintMatrix tmpPxMat(image.width(); std::vector<unsigned int> (image.height(), 0)); 

Я использую его в качестве временного хранилища для значений размытых пикселей.

Затем я использую мой алгоритм размытия изображения:

// Blur Pixels 
for(int x = 0; x < image.width(); x++) 
    for(int y = 0; y < image.height(); y++) { 
     // To avoid edge cases don't process them, I'll fix it soon 
     if(x == 0 || x == image.height()-1 || y == 0 || y == image.width()-1) 
      continue; 
     // 3x3 Matrix 
     tmpPxMat[x][y] += kernel[0][0] * image.pixel(x-1, y-1) + 
          kernel[0][1] * image.pixel(x, y-1) + 
          kernel[0][2] * image.pixel(x+1, y-1); 

     tmpPxMat[x][y] += kernel[1][0] * image.pixel(x-1, y) + 
          kernel[1][1] * image.pixel(x, y) + 
          kernel[1][2] * image.pixel(x+1, y); 

     tmpPxMat[x][y] += kernel[2][0] * image.pixel(x-1, y+1) + 
          kernel[2][1] * image.pixel(x, y+1) + 
          kernel[2][2] * image.pixel(x+1, y+1); 
    } 

Затем я скопировать результат из tmpPxMat[][] к происхождения изображения:

// Copy blurred values to the image 
for(int x = 0; x < image.width(); x++) 
     for(int y = 0; y < image.height(); y++) 
      image.setPixel(x, y, tmpPxMat[x][y]); 

И сохранить его:

image.save("/home/john/Pictures/blurred", "PNG", 100); 

Но в конце я получаю не тот результат, которого я ждал. Вот что я получаю:

До/После:

Origin/Blurred

Извините за длинное описание вопроса, но я сжимаю его так же, как я мог.

+0

У вас нет проблем с отливом? Гауссовское ядро ​​должно быть матрицей с плавающей точкой, результатом которой является свертка, сохраняемая как int. – Miki

+0

Каковы цвета изображения, представленные в текстуре? – jaggedSpire

+3

Ваше выходное изображение окрашено, но ваша обработка, похоже, не обрабатывает три канала данных цвета (RGB), так вы используете обработку оттенков серого на цветных изображениях? –

ответ

3

Я предполагаю, что uintMatrix представляет собой двухмерный массив из 32-битных ints и что вы упаковали в него красные, зеленые и синие каналы.

Если это так, это ваша проблема. Вам нужно размыть каждый канал независимо.

+0

Да, ты совершенно прав. Отлично работает. Итак, ты мой герой сегодня, я боролся с реализацией этого фильтра в течение нескольких дней. Является ли сила размытия зависеть от размера ядра?Если я увеличу его до 5х5, будет ли он более близок? – pushandpop

+1

@pushandpop - да, это будет. Чем больше размер, тем больше размытие. Экспериментируйте с разными размерами и убедитесь сами! – rayryeng