2009-11-15 6 views
15

Ho bisogno di testare alcune tecniche di elaborazione delle immagini di base in Matlab. Ho bisogno di testare e confrontare soprattutto due tipi di filtri: filtro medio e filtro mediano.Filtro medio per uniformare le immagini in Matlab

Per uniformare l'immagine utilizzando il filtraggio mediano, esiste una grande funzione medfilt2 dalla casella degli strumenti di elaborazione delle immagini. Esiste una funzione simile per il filtro medio? O come utilizzare la funzione filter2 per creare il filtro medio?

Una delle cose più importanti per me è avere la possibilità di impostare il raggio del filtro. Cioè per filtro mediano, se voglio la [3 x 3] raggio (maschera), mi basta usare

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

Vorrei realizzare qualcosa di simile per il filtro media.

risposta

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

Vedi doc fspecial: h = fspecial('average', n) restituisce un filtro di media. n è un vettore 1-by-2 che specifica il numero di righe e colonne in h.

+0

Grande, che è quello di cui avevo bisogno. E ho trovato altri filtri interessanti lì, se potessi accettare questa risposta due volte: D Molte grazie! – Gacek

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

noti che i filtri possono essere applicati alle immagini di intensità (matrici 2D) utilizzando filter2, mentre sulle immagini multidimensionali (immagini RGB o matrici 3D) imfilter viene utilizzato.

Anche sui processori Intel, imfilter è possibile utilizzare la libreria Intel Integrated Performance Primitives (IPP) per accelerare l'esecuzione.

+3

Non è possibile progettare un kernel per il filtraggio mediano perché è una convoluzione non lineare: per ogni quartiere NxN i calcoli coinvolgono più di semplici prodotti e somme. – Amro

+0

Qual è il vantaggio del kernel medio nella segmentazione dell'immagine? Ho letto un po 'di carta che hanno detto che il kernel medio e il kernel gaussiano sono simili. E il kernel medio funzionerà più velocemente del kernel gaussiano con la convoluzione 1D, giusto? – user8264

+0

Entrambi hanno l'effetto di * sfocare * un'immagine, la differenza sta nel modo in cui incorporano i pixel vicini. Un kernel medio prende il valore medio dei pixel nel vicinato, con tutti i pixel a parità di peso. Un kernel gaussiano assumerà una media ponderata tale da dare più peso ai pixel nel mezzo del quartiere e meno peso man mano che ci si allontana dal centro (i pesi sono derivati ​​dalla distribuzione normale "curva a campana"). Confronta l'output di 'fspecial ('average', [7 7])' contro 'fspecial ('gaussian', [7 7], 1.1) '(entrambi restituiscono un kernel normalizzato che somma a' 1') – Amro

6

Vedo che sono già state fornite buone risposte, ma ho pensato che sarebbe stato utile dare un modo per eseguire il filtraggio medio in MATLAB senza utilizzare funzioni speciali o toolbox. Questo è anche molto utile per capire esattamente come funziona il processo, in quanto è necessario impostare esplicitamente il kernel della convoluzione. Il kernel del filtro media è fortunatamente molto semplice:

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

Si noti che per le immagini a colori si dovrebbe applicare questo per ciascuno dei canali nell'immagine.

+0

Grazie. Ma nella documentazione di imfilter si dice che usi conv2 nella maggior parte dei casi. Quindi leggere il documento mi ha portato alle stesse conclusioni. Grazie comunque :) – Gacek

2

e la circonvoluzione è definito attraverso una moltiplicazione in trasformare dominio:

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

se un canale è considerato ... per più canali questo deve essere fatto ogni canale

0
f=imread(...); 

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

in che modo questa risposta è diversa da [questa] (http://stackoverflow.com/a/1738390/1714410)? – Shai