2013-02-05 65 views
0

我想在Matlab中製作一個模糊我的圖像的函數。我正在使用Matlabs演示圖像peppers.png使用函數的Matlab模糊濾波器

這裏是我的功能:

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);

它工作正常,現在創建一個模糊的圖像。

而不是乘以fh,它們在上面的代碼中被合併,不符合由2D卷積定義的空間域圖像過濾器。 Matlab正在正確執行函數,但是引入了異常(或意外的結果),即使過濾器正確地使用了不同的算術運算符。

問題解決。

2

您需要查看MATLAB的conv2函數。下面的二維卷積函數已經從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)