Gaußsche Unschärfe - Standardabweichung, Radius und Kerngröße

18

Ich habe einen Gaußschen Fragment-Shader in GLSL implementiert. Ich verstehe die Hauptkonzepte dahinter: Faltung, Trennung von x und y durch Linearität, mehrere Durchgänge zur Vergrößerung des Radius ...

Ich habe noch ein paar Fragen:

  • Wie ist die Beziehung zwischen Sigma und Radius?

    Ich habe gelesen, dass Sigma dem Radius entspricht. Ich verstehe nicht, wie Sigma in Pixeln ausgedrückt wird. Oder ist "radius" nur ein Name für Sigma, der nicht mit Pixeln zusammenhängt?

  • Wie wähle ich Sigma?

    Angenommen, ich verwende mehrere Durchgänge, um das Sigma zu erhöhen. Wie wähle ich ein gutes Sigma aus, um das gewünschte Sigma für einen bestimmten Durchgang zu erhalten? Wenn das resultierende Sigma gleich der Quadratwurzel der Summe der Quadrate der Sigmas ist und Sigma gleich dem Radius ist, wie kann man dann auf einfache Weise den gewünschten Radius ermitteln?

  • Was ist die richtige Größe für einen Kernel und in welcher Beziehung steht er zu Sigma?

    Ich habe gesehen, dass die meisten Implementierungen einen 5x5-Kernel verwenden. Dies ist wahrscheinlich eine gute Wahl für eine schnelle Implementierung mit anständiger Qualität. Gibt es jedoch einen weiteren Grund, eine andere Kernelgröße zu wählen? Wie hängt Sigma mit der Kernelgröße zusammen? Sollte ich das beste Sigma finden, damit Koeffizienten außerhalb meines Kernels vernachlässigbar sind und sich nur normalisieren?

LodeRunner
quelle

Antworten:

21

Wie ist die Beziehung zwischen Sigma und Radius? Ich habe gelesen, dass Sigma dem Radius entspricht. Ich verstehe nicht, wie Sigma in Pixeln ausgedrückt wird. Oder ist "radius" nur ein Name für Sigma, der nicht mit Pixeln zusammenhängt?

Hier spielen drei Dinge eine Rolle. Die Varianz ( ), der Radius und die Anzahl der Pixel. Da es sich um eine zweidimensionale Gaußfunktion handelt, ist es sinnvoll, stattdessen von der Kovarianzmatrix zu sprechen . Wie dem auch sei, diese drei Konzepte sind schwach miteinander verwandt.σ2Σ

Zunächst wird der 2-D-Gauß durch die Gleichung gegeben:

g(z)=1(2π)2|Σ|e12(zμ)TΣ1 (zμ)

Wobei ein Spaltenvektor ist, der die und Koordinate in Ihrem Bild enthält. Also ist , und ist ein Spaltenvektor, der den Mittelwert Ihrer Gaußschen Funktion in und Richtung . x y z = [ x y ] μ x y μ = [ μ x μ y ]zxyz=[xy]μxyμ=[μxμy]

Beispiel:

Nehmen wir nun an, wir setzen die Kovarianzmatrix und . Ich werde auch die Anzahl der Pixel auf x einstellen . Außerdem wird mein 'Gitter', in dem ich dieses PDF auswerte , sowohl in als auch in von bis gehen . Dies bedeutet, dass ich eine Rasterauflösung von . Das ist aber völlig willkürlich. Mit diesen Einstellungen erhalte ich das Bild der Wahrscheinlichkeitsdichtefunktion auf der linken Seite. Nun, wenn ich die "Varianz" (wirklich die Kovarianz) so ändere, dass μ = [ 0 0 ] 100 100 - 10 10 x y 10 - ( - 10 )Σ=[1001]μ=[00]1001001010xyΣ=[ 9 0 0 9 ]10(10)100=0.2Σ=[9009] und alles andere gleich, ich bekomme das Bild rechts.

Bildbeschreibung hier eingeben

Die Anzahl der Pixel ist für beide gleich, x , aber wir haben die Varianz geändert. Angenommen, wir machen stattdessen dasselbe Experiment, verwenden jedoch stattdessen x Pixel, aber ich habe immer noch einen Wert zwischen und . Dann hat mein Gitter eine Auflösung von . Wenn ich die gleichen Covarianzen wie zuvor verwende, erhalte ich Folgendes:100 20 20 - 10 10 10 - ( - 10 )1001002020101010(10)20=1

Bildbeschreibung hier eingeben

So müssen Sie das Zusammenspiel dieser Variablen verstehen. Wenn Sie den Code mögen, kann ich das auch hier posten.

Wie wähle ich Sigma?

Die Wahl der Varianz / Kovarianz-Matrix Ihres Gauß-Filters ist stark anwendungsabhängig. Es gibt keine "richtige" Antwort. Das ist so, als würde man fragen, welche Bandbreite man für einen Filter wählen soll. Auch dies hängt von Ihrer Anwendung ab. In der Regel möchten Sie einen Gauß-Filter so auswählen, dass Sie eine beträchtliche Anzahl von Hochfrequenzkomponenten in Ihrem Bild auf Null setzen. Eine Sache, die Sie tun können, um ein gutes Maß zu erhalten, ist, die 2D-DFT Ihres Bildes zu berechnen und ihre Koeffizienten mit Ihrem 2D-Gauß-Bild zu überlagern. Hier erfahren Sie, welche Koeffizienten stark bestraft werden.

Wenn Ihr Gauß-Bild beispielsweise eine so breite Kovarianz aufweist, dass es viele Hochfrequenzkoeffizienten Ihres Bildes umfasst, müssen Sie seine Kovarianzelemente verkleinern.

Tarin Ziyaee
quelle
1
Diese Bilder wären besser, wenn sie eine sequentielle Farbkarte verwenden würden. Jet ist das Schlimmste.
Endolith
@endolith "Besser" hängt von der Anwendung ab. Ich verwende keinen Jet, wenn eine visuelle Kontrastunterscheidung erforderlich ist. (Heiß ist besser). Hier liegt die Nachricht jedoch in der Größe des Gaußschen, sodass Jet keinen Schaden anrichtet. Vielen Dank für den Link.
Tarin Ziyaee
2
Dies ist eine gut durchdachte und wirklich gut visualisierte Antwort! Nehmen Sie zum Beispiel das Bild oben links. Es ist klar, dass diese Kombination aus Varianz und Kernelgröße verschwenderisch wäre, da es sich um einen 100x100-Kernel handelt, bei dem nur die mittleren 30x30 (~ 9%) ungleich Null sind.
Adam Smith
4

Der Parameter Sigma reicht aus, um die Gaußsche Unschärfe aus einer kontinuierlichen Sicht zu definieren. In der Praxis sind Bilder und Faltungskerne jedoch diskret. Wie wählt man eine optimale diskrete Approximation des kontinuierlichen Gaußschen Kernels?

Die diskrete Approximation ist näher am kontinuierlichen Gaußschen Kernel, wenn ein größerer Radius verwendet wird. Dies kann jedoch zu Lasten der zusätzlichen Berechnungsdauer gehen.

Idealerweise würde man einen Wert für Sigma auswählen und dann einen Radius berechnen, der es ermöglicht, den entsprechenden kontinuierlichen Gaußschen Kern genau darzustellen. Für einen gegebenen Approximationsfehler muss der Radius umso größer sein, je größer das Sigma ist.

Interessanterweise kann dies sehr kompliziert werden, um es richtig zu machen. Wenn Sie die Gaußsche Matrix konstruieren, ist dies die beste Lösung, um den kontinuierlichen Kernel abzutasten, oder gibt es bessere Näherungen? Wie normalisiere ich den berechneten diskreten Kernel, um das Abschneiden zu berücksichtigen? etc.

Als Referenz bietet die Funktion Gaußsche Matrix in Mathematica verschiedene Möglichkeiten zur Berechnung einer diskreten Gaußschen Matrix, z. B. unter Verwendung der diskreten Bessel-Approximation. Standardmäßig ist der Radius 2 * Sigma, was bedeutet, dass bei Sigma 1 die Matrix 5x5 ist.

Matthias Odisio
quelle
Das ist eine ziemlich alte Frage. Aber würde ein Radius von 2 * Sigma nicht zu einer Matrix führen, die 9x9 ist?
Delusional Logic
@DelusionalLogic mit Sigma = 1, Radius = 2, also hat die Matrix die Größe 4, benötigt aber eine ungerade Größe, also die Größe 5x5. Zumindest verstehe ich das so ..
Micka
Wenn der Radius 2 ist, erweitert die Nachbarschaft das mittlere Pixel um 2 Pixel nach links, 2 Pixel nach rechts usw. Es ist nur die Konvention, die Mathematica verwendet.
Matthias Odisio
2

Es stellt sich heraus, dass die Zeilen des Pascalschen Dreiecks sich recht gut einem Gaußschen annähern und den praktischen Vorteil haben, dass sie ganzzahlige Werte haben, deren Summe eine Potenz von 2 ist (wir können diese Werte genau als Ganzzahlen, Festpunktwerte oder Gleitkommazahlen speichern ). Nehmen wir zum Beispiel an, wir möchten einen 7x7-Gauß-Kernel konstruieren. Dazu können wir die 7. Zeile des Pascal-Dreiecks wie folgt verwenden:

Bildbeschreibung hier eingeben

Beachten Sie, dass dieser Filter den geringsten Einfluss auf die Ecken hat, während der Wert für die ganze Zahl erhalten bleibt. Sie können den Mittelwert 20/64 verwenden, um das entsprechende Standardabweichungs-Sigma zu bestimmen, das in diesem Fall 64 / (20 * sqrt (2 * pi)) = 1,276 für den angenäherten Gaußschen Wert ist. Sie können den Gaußschen Wert grafisch darstellen, um zu sehen, dass dies eine hervorragende Anpassung ist.

Ein guter Ausgangspunkt für die Bestimmung einer vernünftigen Standardabweichung für einen Gaußschen Kern ist also das Pascalsche Dreieck (auch bekannt als Binomialkoeffizienten ) - für ein (N + 1) x (N + 1) -Filter, das der obigen Konstruktionsverwendung entspricht

Bildbeschreibung hier eingeben

Wolfram Alphas Gaußsche Matrix [3] verwendet nur r / 2 = 1,5. Seltsamerweise liefert GaussianMatrix [{3,1.276}] nicht den gleichen 2D-Filter wie meine und ist für x, y zwischen -3 und 3 nicht der folgende:

Bildbeschreibung hier eingeben

Ich bin mir nicht sicher warum nicht? Mein 2D-Filter passt hervorragend.

wcochran
quelle