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?

È stato utile?

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

entrare descrizione dell'immagine qui

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

CONV2 utilizza una semplice applicazione formale dell'equazione convoluzione bidimensionale in forma spaziale

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:

entrare descrizione dell'immagine qui

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}
*)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top