Frage

In einer bestimmten Anwendung wende ich eine Mittelungsmaske auf Eingabebilder an, um das Rauschen zu reduzieren, und dann eine Laplace -Maske, um kleine Details zu verbessern. Jemand weiß, ob ich die gleichen Ergebnisse erzielen würde, wenn ich die Reihenfolge dieser Operationen in MATLAB umkehrt?

War es hilfreich?

Lösung

Das Einbacken mit einem Laplace -Kernel ähnelt der Verwendung zweiter Ableitungsinformationen über die Intensitätsänderungen. Da dieses Derivat für Rauschen empfindlich ist, glätten wir das Bild häufig mit einem Gaußschen, bevor wir den Laplace -Filter anwenden.


Hier ist ein Matlab -Beispiel ähnlich was @belisarius Gesendet:

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

enter image description here

Andere Tipps

Nehmen wir an, Sie haben zwei Filter F1 und F2, und ein Bild I. Wenn Sie Ihr Bild über die beiden Filter übergeben, erhalten Sie eine Antwort, die als definiert wurde

X = ((I * F1) * F2)

Wo hier ich benutze * zu repräsentieren Faltung.

Nach der assoziativen Faltungsregel ist dieselbe wie.

X = (I * (F1 * F2))

Mit der Kommunikation können wir das sagen

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

Dies liegt natürlich in der netten kontinuierlichen Domäne der Mathematik. Wenn Sie diese Dinge auf einer Maschine tun, wird es Rundfehler geben und einige Daten können verloren gehen. Sie sollten auch darüber nachdenken, ob Ihre Filter sind TANNE, Ansonsten kann das gesamte Konzept, über die digitale Filterung zu denken, wenn sich Faltung irgendwie zusammenschließt, da Ihr Filter nicht wirklich so verhalten kann, wie Sie es wollten.


BEARBEITEN

Die diskrete Faltung wird definiert als

conv2 uses a straightforward formal implementation of the two-dimensional convolution equation in spatial form

Das Hinzufügen von Nullen an den Kanten Ihrer Daten ändert nichts in mathematischer Sinne.

Wie einige Leute betont haben, erhalten Sie numerisch unterschiedliche Antworten, dies wird jedoch immer dann erwartet, wenn wir uns mit der Berechnung der tatsächlichen Daten befassen. Diese Variationen sollten gering und auf die niedrigen Energiekomponenten der Ausgabe der Faltung beschränkt sein (dh die Kanten).

Es ist auch wichtig zu überlegen, wie der Faltungsoperation funktioniert. Zwei Datensätze der Länge einbinden X und Länge Y wird zu einer Antwort führen, die heißt X+Y-1 in Länge. Für Programme wie Matlab und Mathematica gibt es einige Magie hinter den Kulissen, die Ihnen eine Antwort geben, die von Länge ist X oder Y.

In Bezug auf @belisarius 'Post scheint es, dass wir wirklich dasselbe sagen.

Numerisch sind die Ergebnisse nicht gleich, aber die Bilder sehen ziemlich ähnlich aus.

Beispiel in Mathematica:

enter image description here

Bearbeiten

Als Antwort auf @Thron -Kommentar in seiner Antwort über die Kommutierung linearer Filter und Polsterung sollten Sie einfach die folgenden Operationen in Betracht ziehen.

Während die Kommutierung eines Gaußschen und Laplace -Filters ohne Polsterung wahr ist:

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

Wenn Sie dasselbe mit Polsterung tun, führen Sie einen Unterschied an den Rändern:

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}
*)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top