2009-11-15 681 views
15

我需要在Matlab中測試一些基本的圖像處理技術。我需要測試和比較兩種類型的濾波器:均值濾波器和中值濾波器。用於在Matlab中平滑圖像的平均濾波器

要使用中值濾波來平滑圖像,圖像處理工具箱中有一個很棒的功能medfilt2。是否有任何類似的平均過濾器功能?或者如何使用filter2函數來創建平均過濾器?

對我來說最重要的事情之一是有可能設置過濾器的半徑。即對於中值濾波,如果我想[3×3]半徑(面罩),我只是用

imSmoothed = medfilt2(img, [3 3]); 

我想實現的均值濾波類似的東西。

回答

27
h = fspecial('average', n); 
filter2(h, img); 

參見doc fspecialh = fspecial('average', n)返回的平均濾波器。 n是一個1×2的向量,指定h中的行數和列數。

+0

大,這是我需要什麼。並發現了一些其他有趣的過濾器,如果我能我會接受這個答案兩次:D非常感謝! – Gacek 2009-11-15 17:50:11

5
I = imread('peppers.png'); 
H = fspecial('average', [5 5]); 
I = imfilter(I, H); 
imshow(I) 

注意,過濾器可使用filter2被應用於強度圖像(2D矩陣),而在多的二維圖像(RGB圖像或3D基體)用於imfilter

同樣在Intel處理器上,imfilter可以使用Intel Integrated Performance Primitives(IPP)庫來加速執行。

+3

您不能爲中值濾波設計內核,因爲它是非線性卷積:對於每個NxN鄰域,計算不僅涉及產品和總和。 – Amro 2009-11-15 23:15:27

+0

圖像分割中的平均內核的好處是什麼?我讀了一些他們說的平均內核和高斯內核類似的論文。平均內核通過一維卷積運行會比高斯內核快,對嗎? – user8264 2014-08-01 03:20:42

+0

兩者都具有*模糊*圖像的效果,區別在於它們如何合併附近的像素。平均內核取相鄰像素的平均值,所有像素的權重相同。高斯核函數將採用加權平均值,以便在離開中心點時權重從鄰近中間的像素提供更多權重,並減輕權重(權重來自正態分佈「鐘形曲線」)。將fspecial('average',[7 7])的輸出與'fspecial('gaussian',[7 7],1)的輸出進行比較。1)'(都返回一個歸一化內核,總和爲'1') – Amro 2014-08-01 09:16:53

6

我看到好的答案已經給出,但我認爲這可能是一個很好的方法來執行平均過濾在MATLAB中使用沒有特殊功能或工具箱。這對於理解過程如何工作也非常有用,因爲您需要明確設置卷積內核。平均過濾器內核是幸運的很簡單:

I = imread(...) 
kernel = ones(3, 3)/9; % 3x3 mean kernel 
J = conv2(I, kernel, 'same'); % Convolve keeping size of I 

注意,對於彩色圖像,你將不得不將此應用到每一個圖像中的通道。

+0

謝謝。但在imfilter文檔中,據說在大多數情況下它使用conv2。所以閱讀這個文檔給了我相同的結論。無論如何感謝:) – Gacek 2009-11-16 14:54:41

2

和卷積通過乘法定義變換域:

conv2(x,y) = fftshift(ifft2(fft2(x).*fft2(y))) 

,如果一個通道被認爲是...更多渠道這必須做每道

0
f=imread(...); 

h=fspecial('average', [3 3]); 
g= imfilter(f, h); 
imshow(g); 
+2

以什麼方式這個答案不同於[這一個](http://stackoverflow.com/a/1738390/1714410)? – Shai 2013-10-23 11:02:24