Laden...

Ellipsen in Bild finden, Hough-Transformation ohne Radius zu kennen?

Erstellt von Gimmick vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.465 Views
G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 7 Jahren
Ellipsen in Bild finden, Hough-Transformation ohne Radius zu kennen?

Hallo,

ich habe mir ausgesucht Ellipsen in einem Bild finden zu müssen 😉, genauer gesagt elliptische/kreisförmige Bildelemente, die aber über Binarisierung und Kantenfindung entsprechend reduziert wurden.

Nach Recherche bin ich auf die Hough-Transformation gestoßen, die in einem ersten Test bei Kreisen mit bekanntem Radius auch sehr gut funktioniert hat.
Um das Zentrum zu finden, habe ich eine Bildgroße Matrix erstellt und die Helligkeit der einzelnen Elemente mit jedem Kreis-Treffer erhöht, so dass der Schnittpunkt/Mittelpunkt das hellste Element ist.

Aber:
Wenn ich den Radius nicht kenne, muss ich ja im Prinzip den Radius in einem Intervall (das den korrekten Radius einschließt) varrieren und meine Ergebnismatrix um eine Dimension erweitern. Die Lösung wäre dann das Matrixelement mit dem höchsten Wert.

Richtig?

Bei Ellipsen unbekannter Form, Ausrichtung und Größe hätte ich ja dann statt des Radius' eine Halbachse und zusätzlich noch eine weitere Halbachse und die Drehung als Variablen.

Müsste ich die dann alle durchkloppen und in meiner 5 dimensionalen Matrix nach dem Maximum suchen? (Und sie können ja auch noch asymetrisch sein 8o)

Das klingt furchtbar langsam. ^^

Wieviele "Hough-Kreise" sollte man denn ca. ziehen? Gibt es da Richtwerte ab wann weitere Kreise keinen signifikanten Nutzen mehr bringen?

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 7 Jahren

Habe den kleinen Algorithmus jetzt so erweitert, dass er Ellipsen statt Kreise einrechnet und dabei die große und kleine Halbachse variiert.
Das scheint soweit auch zu gehen.

Aber das dauert schon recht lange. :<

Im Prinzip schreibe ich jetzt jedesmal in die selbe Matrix um Speicher zu sparen, aber er muss halt trotzdem xym Matrizen durchsuchen.
Das sind in meinem Beispiel mit 30 Schritten je Achse 6800 Matrizen.

Dabei geht das Schreiben ziemlich fix.
Ich hatte vorher erst alle Matrizen geschrieben um danach alle zu durchsuchen.
laut Stopwatch() hat das Berechnen der Ellipsen und das Schreiben der Matrizen ~1 Sekunde gedauert, das Suchen nach dem Maximum dann aber über 1 Minute.

Ich suche per Schleifen-Verschachtelung und vergleiche die Werte mit dem bisherigen Maximum.
Gibts vielleicht eine Möglichkeit das schneller hinzubekommen?

W
955 Beiträge seit 2010
vor 7 Jahren

Hast du mal im Internet nach effizienten Algorithmen geschaut? Man findet Seiten wo behauptet wird dass das in Echtzeit mit Smartphones (z.B. Verkehrszeichenerkennung) möglich sein soll.

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 7 Jahren

Hast du mal im Internet nach effizienten Algorithmen geschaut? Man findet Seiten wo behauptet wird dass das in Echtzeit mit Smartphones (z.B. Verkehrszeichenerkennung) möglich sein soll.

Müsste ich mal schauen ob es da noch ganz andere Methoden gibt.

Wobei es für kleine Ellipsen (200*200 Pixel Bereich) schon recht fix geht mittlerweile. Aber wenn die Größe steigt wirds unschön ^^.

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 7 Jahren

Also die Ellipsen, sind scheinbar nur so halbwegs Ellipsen.
Hab mal ein Bild angehängt.

Hab jetzt noch überlegt, ob es evtl. Sinn ergeben würde den Bereich um die Kanten zu fluten und für die entgültige Flächenbestimmung halt schwarze Pixel zu zählen.

Aber so richtig zufrieden bin ich damit auch nicht :<

5.657 Beiträge seit 2006
vor 7 Jahren

Hi Gimmick,

also ich würde dir auch empfehlen, erstmal deine Anforderungen genau zu definieren und dann zu schauen, ob es irgendwo einen Algorithmus oder sogar eine Implementierung dafür gibt.

Hast du dir z.B. schonmal AForge.NET angeschaut? Da gibt es auch zwei Tutorials, die in etwa deinen Anforderungen entsprechen: Glyphs' recognition und Detecting some simple shapes in images.

Weeks of programming can save you hours of planning

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 7 Jahren

Hallo,

ja das mit den Anforderungen ist nicht so ganz einfach. Im Wesentliches hieß es: Mach mal.

Ich hatte dann nachgefragt warum nicht Opensource Bibliotheken wie OpenCV (Aforge.net scheint ja auch sowas zu sein) genutzt werden; soll halt nicht.

Und abgesehen davon plätschern so nach und nach weitere Informationen zu mir.

Ich weiß jetzt nur: Die Struktur ist irgendwie oval und kann über Levelanpassung etc. so wie auf dem Bild als Kantengrafik dargstellt werden.

Das wars eigentlich.

Und jetzt tüftel ich halt rum. 😄

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 7 Jahren

Falls es mal irgendjemand als Idee brauchen kann:

-> Bild binarisieren
-> Kantenfindung (Kanten sind weiß, alles andere schwarz)
-> Hintergrund mit weiß füllen
-> nach Schwarz suchen
-> ersten Treffer mit Farbe A füllen
-> nach Schwarz suchen
-> ersten Treffer mit Farbe B füllen

usw.

Die einzelnen Flächen sind dann durch die Farbe bequem unterscheidbar. Wie man Flächen komplett füllt hab ich mir ergooglet :>

Ist finde ich jetzt nicht die geilste Lösung. Aber funktioniert - wenn die Formen nicht offen sind 😄
Den Fall werde ich aber wohl nicht haben.
Und wenn doch muss ich vor dem Füllen mal schauen ob man die geschickt schließen kann.