Question

dans une application donnée j'applique un masque de calcul de la moyenne des images d'entrée pour réduire le bruit, puis un masque Laplacien pour améliorer les petits détails. Tout le monde sait si j'obtenir les mêmes résultats si j'inverser l'ordre de ces opérations dans Matlab?

Était-ce utile?

La solution

convoluer avec un noyau Laplacien est similaire à l'aide d'une seconde information dérivée des changements d'intensité. Étant donné que ce dérivé est sensible au bruit, nous lissons souvent l'image avec une gaussienne avant d'appliquer le filtre Laplacien.


Voici un exemple de Matlab semblable à ce que @belisarius affiché:

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

entrer image description ici

Autres conseils

Disons que vous avez deux filtres F1 et F2, et une I d'image. Si vous passez votre image à travers les deux filtres, vous obtiendrez une réponse qui a été défini comme

X = ((I * F1) * F2)

Où j'emploie ici * pour représenter convolution .

Par la règle associative de convolution, c'est le même que.

X = (I * (F1 * F2))

à l'aide commutatif, on peut dire que

X = (I * (F2 * F1)) = ((I * F2) * F1)

Bien sûr, cela est dans le domaine continu agréable de mathématiques, de faire ces choses sur un moyen de la machine, il y aura des erreurs d'arrondi et certaines données peuvent être perdues. Vous devriez aussi penser si vos filtres sont FIR , sinon le concept de la pensée sur le filtrage numérique mises en chantier de convolution sorta pour décomposer comme votre filtre ne peut pas se comporter vraiment la façon dont vous le voulais.


EDIT

La convolution discrète est définie comme

conv2 utilise une simple mise en œuvre formelle de l'équation de convolution à deux dimensions en forme spatiale

afin d'ajouter des zéros sur les bords de vos données ne change rien au sens mathématique.

Comme certaines personnes ont des pointes, vous obtiendrez des réponses différentes numériquement, mais cela est prévu chaque fois que nous traitons de calcul des données réelles. Ces variations devraient être faibles et limitées aux composants à faible énergie de la sortie de la convolution (i.e.: les arêtes).

Il est également important d'examiner comment l'opération de convolution fonctionne. Deux ensembles de convolution données de X de longueur et Y de longueur se traduira par une réponse qui est X+Y-1 en longueur. Il y a une magie dans les coulisses en cours pour des programmes tels que Matlab et Mathematica pour vous donner une réponse qui est de X de longueur ou Y.

Donc, en ce qui concerne @belisarius post, il semblerait que nous vraiment dire la même chose.

Numériquement les résultats ne sont pas les mêmes, mais les images sont assez semblables.

Exemple de Mathematica:

Modifier

En réponse à un commentaire de @thron dans sa réponse au sujet de la commutation de filtres linéaires et un rembourrage, suffit de considérer les opérations suivantes.

Bien que la commutation d'un filtre gaussien et Laplacien sans rembourrage est vrai:

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

Faire la même chose avec rembourrage, conduisent à une différence au niveau des bords:

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}
*)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top