media maschera e maschera laplacian nell'elaborazione delle immagini
-
27-10-2019 - |
Domanda
in una data applicazione applico una maschera media di immagini in ingresso per ridurre il rumore, e quindi una maschera Laplaciana per migliorare piccoli dettagli. Qualcuno sa se vorrei ottenere gli stessi risultati se invertire l'ordine di queste operazioni in Matlab?
Soluzione
convolvendo con un kernel Laplaciano è simile ad usare secondo le informazioni derivata sulle variazioni di intensità. Poiché questo derivato è sensibile al rumore, spesso ammorbidisce l'immagine con una gaussiana prima di applicare il filtro laplaciano.
Ecco un esempio MATLAB simile a quello che @belisarius pubblicato:
f='http://upload.wikimedia.org/wikipedia/commons/f/f4/Noise_salt_and_pepper.png';
I = imread(f);
kAvg = fspecial('average',[5 5]);
kLap = fspecial('laplacian',0.2);
lapMask = @(I) imsubtract(I,imfilter(I,kLap));
subplot(131), imshow(I)
subplot(132), imshow( imfilter(lapMask(I),kAvg) )
subplot(133), imshow( lapMask(imfilter(I,kAvg)) )
Altri suggerimenti
Diciamo che avere due filtri F1
e F2
, ed un I
immagine. Se si passa la vostra immagine attraverso i due filtri, si otterrebbe una risposta che è stata definita come
X = ((I * F1) * F2)
Dove qui sto usando *
per rappresentare circonvoluzione .
Con la regola associativa di convoluzione, questo è lo stesso.
X = (I * (F1 * F2))
utilizzando commutativa, possiamo dire che
X = (I * (F2 * F1)) = ((I * F2) * F1)
Naturalmente, questo è nel bel dominio continuo di matematica, facendo queste cose su un mezzo di macchine ci saranno errori di arrotondamento e alcuni dati potrebbero andare persi. Si dovrebbe anche pensare se i filtri sono FIR , altrimenti l'intero concetto di pensare filtraggio digitale come inizia convoluzione SortA per abbattere il tuo filtro non può davvero comportarsi nel modo si voleva che.
Modifica
La convoluzione discreta è definito come
quindi l'aggiunta di zeri ai bordi di voi i dati non cambia nulla in un senso matematico.
Come alcune persone hanno le punte, si ottengono risposte diverse numericamente, ma questo è previsto ogni volta che abbiamo a che fare con il calcolo dei dati effettivi. Queste variazioni devono essere piccole e limitato ai componenti a bassa energia di uscita della spira (cioè: i bordi).
E 'anche importante considerare come l'operazione di convoluzione sta lavorando. Convolvendo due insiemi di dati di lunghezza X
e lunghezza Y
si tradurrà in una risposta che viene X+Y-1
in lunghezza. C'è un po 'dietro le quinte magia in corso per programmi come MATLAB e Mathematica per darvi una risposta che è di X
lunghezza o Y
.
Quindi, per quanto riguarda @belisarius' posto, sembrerebbe che stiamo davvero dire la stessa cosa.
numericamente i risultati non sono gli stessi, ma le immagini sembrano piuttosto simili.
Esempio in Mathematica:
Modifica
In risposta a @thron commento nella sua risposta circa la commutazione dei filtri lineari e imbottiture, basta considerare le seguenti operazioni.
Mentre la commutazione di un filtro gaussiano e Laplacian senza imbottitura è vero:
list = {1, 3, 5, 7, 5, 3, 1};
gauss[x_] := GaussianFilter[ x, 1]
lapl[x_] := LaplacianFilter[x, 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
*)
Fare la stessa cosa con imbottitura, comporta una differenza ai bordi:
gauss[x_] := GaussianFilter[ x, 1, Padding -> 1]
lapl[x_] := LaplacianFilter[x, 1, Padding -> 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{4.68233,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.68233}
{4.58295,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.58295}
*)