Gauss 3x3 FilterMatrix Anwendung



  • Hey Leute,

    ich habe ein kleine Klasse zur Bildverarbeitung in c++ geschrieben und ein paar Filter bereits implementiert. Zur Zeit bin ich am Gauss Filter dran, aber Wikipedia flasht mich da ein wenig weg mit dem ganzen mathematischen Zeugs
    😮

    Mir persönlich reicht die Anwendung. Diese Matrix habe ich gefunden.

    (1 2 1)
    (2 4 2) * 1 / 16
    (1 2 1)

    Da mich die ganzen Unis mit ihren super komplizierten Erläuterungen nun ziemlich verwirrt haben bin ich verunsichert ob der GaussFilter in der Bildbearbeitung nun wirklich nur die Anwendung dieser Matrix auf mein Bild ist.

    Bsp.:

    Grauwert Bild:

    50 60 60
    90 10 60
    90 60 60

    Nach Anwendung des Filters
    Grauwert Bild:

    50 60 60
    90 53 60
    90 60 60

    Ich hoffe ihr könnt mir die Zweifel nehmen oder mich aufklären nachdem mich das Internet derart verwirrt hat 😃

    Mfg. Kromat



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ja stimmt



  • Danke für deine schnelle Antwort 😉

    Eine Frage hätte ich noch. Werden die neu errechneten Pixel in einen Buffer geschmissen, der später auf das Originalbild übertragen wird, oder wird die Operation direkt auf dem Originalbild angewendet, sodass die transformierten Pixel Einfluss haben auf die Transformation benachberter Pixel wenn die Maske verschoben wird?



  • Kromat schrieb:

    [...], sodass die transformierten Pixel Einfluss haben auf die Transformation benachberter Pixel wenn die Maske verschoben wird?

    Nein. Diesen Einfluss wollen wir nicht haben.

    Was Du mit dem Gaussfilter machst ist so eine Art Mittelung mit einer distanzabhaengigen Gewichtung.

    ...Die Matrix, die Du da gezeigt hast, ist eine sehr vereinfachte Variante eines Gaussfilters. Der kann auch wesentlich groesser sein.



  • Okay danke, das hab ich bisher immer falsch gemacht. Das werde ich dann nachher mal umschreiben. ( Lediglich bei den Operationen Dilatation und Erosion ist mir aufgefallen, dass das Prinzip ohne Buffer nicht funktioniert als plötzlich alles Schwarz bzw. Weiß war 😃 )



  • Die Formel zur Erstellung eines 2D Gauss-Kernels:
    h(x,y)=ex2+y22σ22πσ2h(x,y) = \frac{e^{-\frac{x^2+y^2}{2\sigma^2}}}{2\pi\sigma^2}
    h ist die Funktion zur Berechnung der Kernel-Werte.
    x|y ist die Kernel-Koordinate (Abstand zur Mitte).
    e ist die Eulersche Zahl.
    σ\sigma ist Sigma, die geschätzte Abweichung.
    π\pi ist Pi.

    Der resultierende Kernel muss normalisiert werden.

    Ein Beispiel:
    Wir haben einen 3x3 Kernel mit σ=1\sigma = 1 und möchten den oberen, linken Wert berechnen.
    h(-1,-1) = \frac{e^{-\frac{(-1)^2+(-1)^2}{2\*1^2}}}{2\*\pi*1^2} = 0.058549831524319
    Wiederholen wir das mit den restlichen Werten, ergibt dies folgenden Kernel:

    0.0585498315243190.0965323526300540.0585498315243190.0965323526300540.15915494309190.0965323526300540.0585498315243190.0965323526300540.058549831524319\begin{matrix} 0.058549831524319 & 0.096532352630054 & 0.058549831524319 \\ 0.096532352630054 & 0.1591549430919 & 0.096532352630054 \\ 0.058549831524319 & 0.096532352630054 & 0.058549831524319 \end{matrix}

    Die Summe der Werte ergibt 0.77948367970939. Multiplizieren wir alle Werte mit 10.77948367970939\frac{1}{0.77948367970939} ergibt sich folgender Kernel:

    0.0751136079541110.123841403152970.0751136079541110.123841403152970.204179955571660.123841403152970.0751136079541110.123841403152970.075113607954111\begin{matrix} 0.075113607954111 & 0.12384140315297 & 0.075113607954111 \\ 0.12384140315297 & 0.20417995557166 & 0.12384140315297 \\ 0.075113607954111 & 0.12384140315297 & 0.075113607954111 \end{matrix}

    Die Summe der Werte beträgt nun 1.

    Kannst ja mal hier mit den Parametern rumspielen 😉



  • Das ist geil 🙂 danke ... hab mir gleich mal nen 5x5 kernel gebastelt und hab im internet mit den ergebnissen von som script verglichen. funzt perfekt.

    Was ich noch nicht ganz verstehe, ist wie man von diesen kleinen Werten auf die Matrix

    1 2 1
    2 4 2
    1 2 1

    kommt. Hab Probeweise den mittleren Wert durch 4 geteilt und die Matrix dann anschließend mit dem konstanzen Faktor multipliziert den ich rausbekommen hab. Allerdings wichen alle Werte weit davon ab. (Bsp. wert für (x-1)(y) war dann ca. 2.4)



  • 121242121\begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{matrix}

    Dies ist nur ein sehr grobes Beispiel, welches schon eher als Radial-Filter bezeichnet werden könnte. Wie du in dem Wikipedia Artikel bereits nachlesen kannst, ist diese Matrix aus 1D-Gauß-Filtern zusammengesetzt worden (dank der Eigenschaft der Separierbarkeit), welche selbst bereits auf Ganzzahlen gerundet wurden, es kann also nicht genaues bei rauskommen.





  • Super, ich konnte eure Ausführugen alle gut nachvollziehen 🙂
    Danke für den kleinen Crashkurs



  • Kromat schrieb:

    Was ich noch nicht ganz verstehe, ist wie man von diesen kleinen Werten auf die Matrix

    1 2 1
    2 4 2
    1 2 1

    kommt.

    Du hast das 1/16 als multiplikator vergessen. 4/16 = 0.25 , 2/16 = 0.125 und 1/16 = 0.0625. Vergleichst du das mit der Matrix, kommt das schon ziemlich gut hin.


Log in to reply