2013-02-05 3 views
0

Я пытаюсь сделать функцию в Matlab, которая размывает мое изображение. Я использую демо-версию Matlabs peppers.png.Matlab Blur Filter, используя функцию

Вот моя функция:

function g = myfilter(f, h) 

    f = double(f); %convert to double 
    g = zeros(size(f)); %new array (size of f) 
    a = (size(h, 1) - 1)/2; %padding on edges 

    for row = (a + 1) : (size(f,1) - a) 
     for col = (a + 1) : (size(f,2) - a) 

      gxy = 0; %running sum 

      for m = -a:a 
       for n = -a:a 

        gxy = gxy + f(row - m, col - n) + h(m + a+1, n + a+1); 
       end 
      end 

      g(row, col) = gxy; 
     end 
    end 

    g = uint8(g); %convert back to int 

Вот мои команды:

>> img = imread('peppers.png'); 
    >> imshow(img) 
    >> imgGray = rgb2gray(img); 
    >> imshow(imgGray) 
    >> 
    >> filt1 = (1/9)*ones(3) 

     filt1 = 

     0.1111 0.1111 0.1111 
     0.1111 0.1111 0.1111 
     0.1111 0.1111 0.1111 

    >> test = myfilter(imgGray, filt1); 
    >> imshow(test) 

Он успешно преобразует цветное изображение в серый и применяет фильтр.

К сожалению, фильтр просто создает почти полное белое изображение (слишком яркое) ... Я просто не понимаю, почему ... Он должен принимать среднее значение для каждого пикселя с использованием фильтра 3x3 ... Есть что-нибудь Очевидно, вам, ребята, почему это происходит?

ответ

0

Простая арифметическая опечатка.

gxy = gxy + f(row-m, col-n) + h(m+a+1, n+a+1);

Должно быть: gxy = gxy + f(row-m, col-n) * h(m+a+1, n+a+1);.

Он отлично работает и теперь создает размытое изображение.

Вместо того, чтобы умножать f и h, они суммировались в коде выше, который не соответствует фильтру изображения пространственной области, который определяется двумерной сверткой. Matlab корректно выполнял функцию, однако вводил аномалии (или неожиданные результаты), хотя фильтр правильно работал с другим арифметическим оператором.

Проблема решена.

2

Вам необходимо увидеть функцию conv2 MATLAB. Следующая функция для двумерной свертки была извлечена из conv2 и отлично подходит для вашего фильтра.

function c = myfilter(a, b) 
[ma, na] = size(a); 
[mb, nb] = size(b); 
c = zeros(ma+mb-1, na+nb-1); 
    for i = 1:mb 
     for j = 1:nb 
      r1 = i; 
      r2 = r1 + ma - 1; 
      c1 = j; 
      c2 = c1 + na - 1; 
      c(r1:r2,c1:c2) = c(r1:r2,c1:c2) + b(i,j) * a; 
     end 
    end 
c = uint8(c) 
Смежные вопросы