Laplacian of Gaussian

manuk

Grünschnabel
Hallo.

Ich bin neu hier und hätte auch gleich eine Frage. Ich versuche gerade eine Kernelmaske für den Laplacian of Gaussian zu erstellen. Nur leider glückt mir das nicht.
Ich hätte die Formel aus dem Wikipediaeintrag genommen. http://de.wikipedia.org/wiki/LoG

und wie folgt in Java implementiert.

public double laplacian_of_gaussian(int x, int y, double sigma)
{
return ((-1/(Math.PI*Math.pow(sigma, 4)))*Math.exp(-(Math.pow(x,2)+Math.pow(y,2))/
(2*Math.pow(sigma, 2)))*((1-(Math.pow(x,2)+Math.pow(y, 2))/(2*Math.pow(sigma, 2)))));
}

Nach der Erzeugung der Kernelmaske steht im Wikipediaeintrag sollte ich diese normalisieren auf. Ich hab nur keine Ahnung wie ich das machen sollte.

Bedeutet dies, dass ich den größten Wert aus meiner Masek raus suche und diesen als 1 ansehe und die restlichen Werte dividiere.

Ich hoffe ich hab euch jetzt nicht verwirrt, mit meiner konfusen Fragestellungen.

Danke schon mal

mfg Manu
 
Hallo,

mal ein Versuch:
ich denke du musst hier die Werte der Matrix addieren und dann wieder alle Werte der Matrix durch die entstandene Summe teilen. Addierst du dann wieder alle Werte auf hast du als Summe 1. Anschließend kannst du diese Werte mit 255 multiplizieren.

//Edit cool dann lag ich ja doch richtig :)

Gruß Tom
 
Zuletzt bearbeitet:
Hallo,

ich habe vor etwas längerer Zeit mal ein Gauß Filter Plugin für ImageJ programmiert:

http://people.fh-landshut.de/~skreyer/Gauss_Filter.java

Im Konstruktor der Klasse Gauß_FIlter /* edit: ähm sorry ich meinte nat. in der Methode fillKernels die wiederum vom Konstruktor aufgerufen wird*/ steht:
1.) Wie man die Kernelmaske für eine Gauß'sche Glockenfunktion erzeugt. (das müsste man dann nur noch auf die Formel des LoG übertragen) und
2.) Was normalisieren bedeutet und wie man das implementiert.


Gruß,
RedWing
 
Zuletzt bearbeitet:
Hallo.

Danke danke für eure Antworten. Ich hab mir jetzt die Freiheit heraus genommen und einen Teil deines Codes übernommen, um meine Laplacian of Gaussian Formel zu testen.
Hab die Formel wieder aus Wikipedia genommen: http://de.wikipedia.org/wiki/LoG

und wiefolgt umgesetzt:

kernel2D[y + half_kernelsize]
[x + half_kernelsize] = (-1 / (Math.PI * forth_sigma))
* Math.exp(-(((x * x) + (y * y)) / (sqr_sigma_double)))*(1-(((x * x) + (y * y))/sqr_sigma_double));

Wobei mit falschen Englisch ich forthsigma als sigma*sigma*sigma*sigma bezeichnet habe.

Das Ergebnis deiner kernel2D Maske habe ich mit 255 mulitpliziert und dann mit der Maske auf der Wikipediaseite verglichen. Irgendwie stimmen die Werte überhaupt nicht überein. Ahja ich habe half_kernelsize auf 3 gesetzt um einen 7x7 Kernel zu bekommen.

Entschudligt bitte diese dummen Fragen aber irgendwie stehe ich gerade auf der Leitung.

Danke für alles

Manu.
 
//Edit cool dann lag ich ja doch richtig :)

Definitly ;), wobei ich allerdings grad am überlegen bin was die Normalisierung beim LoG überhaupt für einen Sinn macht. Daß man einen Gaußkernel auf 1 normalisiert kann ich mir noch durchaus vorstellen da der Gaußkernel "flache Signale" möglichst unverändert lassen soll, jedoch die scharfen Konturen mit der Umgebung verschmelzen soll.
Anders beim LoG:
Dort sollte der Kernel in der Summe doch möglichst 0 ergeben um ein konstantes Signal nach der Faltung zu eliminieren oder irre ich mich da? Was macht dann die Normalisierung auf 1 für einen Sinn?

Gruß,
RedWing
 
Hallo.

Danke danke für eure Antworten. Ich hab mir jetzt die Freiheit heraus genommen und einen Teil deines Codes übernommen, um meine Laplacian of Gaussian Formel zu testen.
Hab die Formel wieder aus Wikipedia genommen: http://de.wikipedia.org/wiki/LoG

und wiefolgt umgesetzt:

kernel2D[y + half_kernelsize]
[x + half_kernelsize] = (-1 / (Math.PI * forth_sigma))
* Math.exp(-(((x * x) + (y * y)) / (sqr_sigma_double)))*(1-(((x * x) + (y * y))/sqr_sigma_double));

Wobei mit falschen Englisch ich forthsigma als sigma*sigma*sigma*sigma bezeichnet habe.

Das Ergebnis deiner kernel2D Maske habe ich mit 255 mulitpliziert und dann mit der Maske auf der Wikipediaseite verglichen. Irgendwie stimmen die Werte überhaupt nicht überein. Ahja ich habe half_kernelsize auf 3 gesetzt um einen 7x7 Kernel zu bekommen.

Entschudligt bitte diese dummen Fragen aber irgendwie stehe ich gerade auf der Leitung.

Danke für alles

Manu.
Ja, ich hab jetzt auch ne Weile rumprobiert und bin ebenfalls nicht auf das Ergebniss der Wiki Seite gekommen ... Das Problem ist auch das die Summe der Koeffizienten vor dem Normalisieren keinen positiven Wert einnimmt und somit die Normalisierung alles andere als einen LoG Kernel hervorbringt...
Was willst du denn mit diesem LoG machen, Kanten detektieren? Evtl. probierst dus erstmal ohne Normierung und schaust dir das Ergebnis an. Irgendwie ist das auf Wikipedia recht schwammig bzw gar nicht umschrieben was man mit der Normalisierung einer Ableitungsfunktion erreichen soll (siehe Post weiter oben).
Die Berechnung sollte auf alle Fälle passen.

Gruß,
RedWing
 
Hallo.

Danke für deine Antwort und deine Mühen. Ich soll das Ergebnis des LoG als Standardbelegung für einen anderen Algorithmus hernehmen. An den möchte ich jetzt lieber gar nicht denken :-(. Wenn mir der LoG schon solche Schwierigkeiten bereitet.
Also auch ohne Normalisierung ist das Ergebnis der Werte nicht wirklich besser.
Hätte jetzt zur Sicherheit diese Seite noch aus Referenz hergenommen und die Werte verglichen.

http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm

Irgendwie kenn ich mich echt nicht mehr aus. Ich mein mit dieser Formel berechnet man doch die Maske?

//EDIT: Das mit der Normalisierung sehe ich auch so. Hätte niemals Normalisiert, wenn es dort nicht gestanden wäre.

Danke für Alles

Manu
 
Zuletzt bearbeitet:
Wir können ja einfach mal vergleichen. Wenn ich Sigma = 0.6 habe und die Größe des Kernel 5 beträgt komm ich auf folgende Matrix:

Code:
3.711502567189025E-4 0.014074160399106212 0.04325530228329883 0.014074160399106212 3.711502567189025E-4
0.014074160399106212 0.27148699979126983 0.23816825804571573 0.27148699979126983 0.014074160399106212
0.04325530228329883 0.23816825804571573 -2.456094800800854 0.23816825804571573 0.04325530228329883
0.014074160399106212 0.27148699979126983 0.23816825804571573 0.27148699979126983 0.014074160399106212
3.711502567189025E-4 0.014074160399106212 0.04325530228329883 0.014074160399106212 3.711502567189025E-4

Die Maske stimmt mit der in meinem Bildverarbeitungsskript überein. Außerdem kann man ihr auch den Mexikanischen Hut ansehen...
Welche Matrix bekommst du bei obigen Parametern?

Gruß,
RedWing
 
Hallo.

Danke danke für deine Hilfe. Hab es jetzt hinbekommen, dass ich die gleichen Werte habe wie du. Danke danke. Werd mich gleich mal ans ausmultiplizieren machen. Muss ich jetzt noch etwas normalisieren oder kann ich diese Werte jetzt hernehmen?

Dürfte ich dich noch etwas fragen. Du hast ja vorher erwähnt, du verstehst warum man den Gauss auf 1 normalisiert. Was ich nicht ganz verstehe und ich bin aus unserem Skript nicht ganz schlau geworden, wie diese Normalisierung der Maske mit dem unverändert lassen "flacher Signale" zusammen hängt.

Danke nochmal für deine Hilfe.

Mfg
Manu
 
Hallo.

Danke danke für deine Hilfe. Hab es jetzt hinbekommen, dass ich die gleichen Werte habe wie du. Danke danke. Werd mich gleich mal ans ausmultiplizieren machen. Muss ich jetzt noch etwas normalisieren oder kann ich diese Werte jetzt hernehmen?
Also ich habe den LoG selber noch nicht implementiert, allerdings steht in unsrem Skript nur drin das er von der Summe her ungefähr 0 ergeben soll, damit ein konstantes Signal möglichst durch den Filter eleminiert wird... Ich denke du solltest es einfach mal probieren, evtl auch erstmal noch nicht in deinen Algo einbauen sondern erstmal den Kernel den du berechnet hast über das Bild falten und dann bei den Nulldurchgängen im Ergebniss bild die Kanten kennzeichnen, dann siehst dus ja obs auch ohne Normalisierung funktioniert. Evtl. musst du nach der Faltung das Resultatbild selbst noch normalisieren...
Dürfte ich dich noch etwas fragen. Du hast ja vorher erwähnt, du verstehst warum man den Gauss auf 1 normalisiert. Was ich nicht ganz verstehe und ich bin aus unserem Skript nicht ganz schlau geworden, wie diese Normalisierung der Maske mit dem unverändert lassen "flacher Signale" zusammen hängt.
Allgemein Beweisen kann ich dir das auch nicht, aber du kannst es ja einfach mal ausprobieren. Überleg dir ein geeignetes Signal (bspw. eine 3x3 Matrix mit überall 5en oder irgendeine beliebiege Zahl, sollte halt homogen sein) und falte sie einmal manuell mit einem 3x3 normalisierten Gaußkernel und einmal mit einem 3x3 nicht normalisierten Gaußkernel. Ich denke dann sollte man das sehen, vorrausgesetzt man verrechnet sich bei der Faltung nicht ;)
Dann sollte (wenn die Gesamtsumme beim nicht normalisierten Gaußkernel < 1 ist) das Signal theoretischerweise nach der Faltung geschrumpft sein (obwohl es homogen ist) und beim normalisierten Kernel sollte genau das Originalsignal wieder herauskommen...

Gruß,
RedWing
 
Zurück