Ich weiß, dass diese Frage für die Programmierung möglicherweise nicht sehr relevant ist, aber wenn ich die Theorie hinter der Bildverarbeitung nicht verstehe, kann ich nie etwas in die Praxis umsetzen.
Wenn ich es richtig verstanden habe, werden Gaußsche Filter mit einem Bild zur Rauschreduzierung gefaltet, da sie einen gewogenen Durchschnitt der Nachbarschaft eines Pixels berechnen und bei der Kantenerkennung sehr nützlich sind, da Sie eine Unschärfe anwenden und das Bild gleichzeitig durch ableiten können einfach mit der Ableitung einer Gaußschen Funktion falten.
Aber kann mir jemand erklären oder mir einige Hinweise geben, wie sie berechnet werden?
Zum Beispiel spricht Cannys Kantendetektor von einem 5x5-Gauß-Filter, aber wie haben sie diese bestimmten Zahlen erhalten? Und wie sind sie von einer kontinuierlichen Faltung zu einer Matrixmultiplikation gekommen?
Antworten:
Damit dieser Vorgang funktioniert, müssen Sie sich vorstellen, dass Ihr Bild als Vektor umgeformt wird. Dann wird dieser Vektor links von ihm mit der Faltungsmatrix multipliziert, um das unscharfe Bild zu erhalten. Beachten Sie, dass das Ergebnis auch ein Vektor mit derselben Größe wie die Eingabe ist, dh ein Bild mit derselben Größe.
Jede Zeile der Faltungsmatrix entspricht einem Pixel im Eingabebild. Es enthält das Gewicht der Beiträge aller anderen Pixel im Bild zum unscharfen Gegenstück des betrachteten Pixels.
Nehmen wir ein Beispiel: Box-Unschärfe mit einer Größe von Pixel auf einem Bild mit einer Größe von 6 × 6 Pixel. Das umgeformte Bild ist eine Spalte mit 36 Wählungen, während die Unschärfematrix die Größe 36 × 36 hat .3 × 3 6 × 6 36 × 36
Eine visuelle Darstellung eines eng verwandten Prozesses (Faltung + Subtraktion) finden Sie in diesem Blog-Beitrag (aus meinem persönlichen Blog).
quelle
Für Anwendungen auf Bilder oder Faltungsnetzwerke, um die Matrixmultiplikatoren in modernen GPUs effizienter zu verwenden, werden die Eingaben normalerweise in Spalten einer Aktivierungsmatrix umgeformt, die dann mit mehreren Filtern / Kerneln gleichzeitig multipliziert werden können.
Schauen Sie sich diesen Link aus Stanfords CS231n an und scrollen Sie zum Abschnitt "Implementierung als Matrixmultiplikation", um weitere Informationen zu erhalten.
Der Prozess funktioniert, indem alle lokalen Patches auf einem Eingabebild oder einer Aktivierungszuordnung, die mit dem Kernel multipliziert werden, genommen und durch eine allgemein als im2col bezeichnete Operation in eine Spalte einer neuen Matrix X gestreckt werden. Die Kernel werden auch gestreckt, um die Zeilen einer Gewichtsmatrix W zu füllen, so dass bei der Ausführung der Matrixoperation W * X die resultierende Matrix Y alle Ergebnisse der Faltung aufweist. Schließlich muss die Y-Matrix erneut umgeformt werden, indem die Spalten durch eine Operation namens cal2im wieder in Bilder umgewandelt werden.
quelle
Die Faltung im Zeitbereich entspricht der Matrixmultiplikation im Frequenzbereich und umgekehrt.
Das Filtern entspricht der Faltung im Zeitbereich und damit der Matrixmultiplikation im Frequenzbereich.
Die 5x5-Karten oder -Masken stammen aus der Diskretisierung der Canny / Sobel-Operatoren.
quelle
Ich habe eine Funktion geschrieben, die dies in meinem StackOverflow Q2080835 GitHub Repository löst (siehe
CreateImageConvMtx()
).Eigentlich kann die Funktion jeder Faltung Form unterstützen Sie möchten -
full
,same
undvalid
.Der Code lautet wie folgt:
Ich habe auch eine Funktion zum Erstellen einer Matrix für die Bildfilterung erstellt (ähnliche Ideen wie bei MATLAB
imfilter()
):Der Code wurde gegen MATLAB validiert
imfilter()
.Der vollständige Code ist in meinem GitHub-Repository StackOverflow Q2080835 verfügbar .
quelle