2009-11-15 10 views
15

Potrzebuję przetestować podstawowe techniki przetwarzania obrazów w programie Matlab. Muszę przetestować i porównać szczególnie dwa typy filtrów: filtr średni i filtr medianowy.Średni filtr do wygładzania obrazów w programie Matlab

Aby wygładzić obraz przy użyciu filtrowania median, dostępna jest wspaniała funkcja medfilt2 z przybornika do przetwarzania obrazu. Czy istnieje jakaś podobna funkcja dla średniego filtra? Albo jak użyć funkcji filter2, aby utworzyć filtr średniej?

Jedną z najważniejszych rzeczy dla mnie jest możliwość ustawienia promienia filtra. To znaczy. za filtrem mediany, jeśli chcę [3 x 3] promienia (maskę), wystarczy użyć

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

chciałbym osiągnąć coś podobnego do średniej filtra.

Odpowiedz

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

Zobacz doc fspecial: h = fspecial('average', n) powraca filtr uśredniający. n to wektor 1 na 2 określający liczbę wierszy i kolumn w h.

+0

wielki, to czego potrzebowałem. I znalazłem tam kilka innych interesujących filtrów, gdybym mógł, dwa razy przyjmuję tę odpowiedź: D Wielkie dzięki! – Gacek

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

Należy zauważyć, że filtry mogą być zastosowane do zdjęcia intensywność (2D) za pomocą matryc filter2, a na zdjęciach wielowymiarowych (obrazy macierzy RGB i 3D) imfilter używany.

Również na procesorach Intel, imfilter może użyć biblioteki Intel Integrated Performance Primitives (IPP), aby przyspieszyć wykonanie.

+3

Nie można zaprojektować jądra do filtrowania mediany, ponieważ jest to splot nieliniowy: dla każdego sąsiedztwa NxN obliczenia obejmują więcej niż tylko produkty i sumy. – Amro

+0

Co jest zaletą przeciętnego jądra w segmentacji obrazu? Czytałem trochę papieru, który powiedział, że średnie jądro i jądro gaussowskie są podobne. A przeciętne jądro będzie działało szybciej niż jądro gaussowskie dzięki splotowi 1D, prawda? – user8264

+0

Obie mają efekt * rozmywania * obrazu, różnica polega na tym, że zawierają one pobliskie piksele. Średnie jądro pobiera średnią wartość pikseli w sąsiedztwie, przy czym wszystkie piksele mają taką samą wagę. Jądro Gaussa będzie miało średnią ważoną, tak że przy większej wartości pikseli w środku otoczenia i mniejszej wadze, gdy odsuniesz się od środka (ciężary pochodzą z rozkładu normalnego "krzywa w kształcie dzwonu"). Porównaj wyjście 'fspecial ('average', [7 7])' przeciw 'fspecial ('gaussian', [7 7], 1.1) '(oba zwracają znormalizowane jądro, które sumuje się do' 1') – Amro

6

Widzę, że dobre odpowiedzi już zostały podane, ale pomyślałem, że byłoby miło po prostu podać sposób, aby wykonać średnie filtrowanie w MATLAB-ie bez specjalnych funkcji lub skrzynek narzędziowych. Jest to również bardzo dobre dla zrozumienia, jak dokładnie działa ten proces, ponieważ jest to wymagane do jawnego ustawienia jądra splotu. Średni kernel filtr jest na szczęście bardzo proste:

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

Należy pamiętać, że w przypadku obrazów kolorowych trzeba by zastosować to do każdego z kanałów w obrazie.

+0

Dzięki. Ale w dokumentacji imfilter mówi się, że używa conv2 w większości przypadków. Czytanie dokumentu doprowadziło mnie do tych samych wniosków. Dzięki i tak :) – Gacek

2

i splot jest określona poprzez pomnożenie w przekształcić domenę:

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

jeśli jeden kanał jest uważany za ... więcej kanałów To musi być zrobione każdy kanał

0
f=imread(...); 

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

w jaki sposób ta odpowiedź różni się od [this one] (http://stackoverflow.com/a/1738390/1714410)? – Shai