Groovy Erkennen geometrischer Formen in einem Kantenbild

  • Themenstarter Themenstarter Faber
  • Beginndatum Beginndatum
F

Faber

Gast
Hallo allerseits,

ich hab mir einen Kantendetektor programmiert und möchte nun im Ergebnisbild Objekte geometrischer Figuren (in meinem Fall Dreiecke, Kreise und ein Sechseck; sprich Formen von Straßenschildern) erkennen und farbig markieren. Nach einer kurzen Recherche bin ich auf die Hough-Transformationn gestoßen. Ich fand die Vorgehensweise und Codebeispiele etwas kompliziert. Deshalb meine Frage an euch:

Kennt ihr vielleicht alternative Methoden zur Objekterkennung geometrischer Figuren oder verständliche quellen, die sich mit dem Thema befassen?

Danke für jeden Tipp
 
Das hat's in sich. So eine Hough-Transformation an sich ist relativ leicht zu implementieren, aber das "gut" zu machen... das schüttelt man nicht so einfach aus dem Handgelenk. Wenn man die Hough-Transformation durchlaufen läßt, hat man im besten/einfachsten Fall einen Haufen Informationen über "mögliche" Linien (und wohlgemerkt, im einfachsten Fall nur über Linien - man weiß erstmal nicht, wo die anfangen und aufhören!), aber daraus dann noch die Information über Geometrische Formen zu bauen (im schlimmsten Fall noch mit perspektivischer Verzerrung usw) kann aufwändig sein...
 
Interessantes Thema. Leider nicht ganz einfach, sonst hätten BWM & Co das schon lange implementiert...
Die Hough Transformation wäre mein erster Vorschlag gewesen (auch wenn sie lediglich zur Erkennung der Form dient; wobei eine runde Form ja leider nicht hinreichend zur Identifizierung eines Straßenschildes ist - da müsste man müsste schon tiefer in den Trickkiste der Mustererkennung greifen).

Aber zurück zur Frage. Wenn du für deine zu erkennenden Objekte zunächst mal nur die Constraints rund/dreieckig/sechseckig aufstellen möchtest, dann wird es schon knifflig. Bei einem reinen Kantenbild[1] könnte man mal schauen ob man mit Fourierdeskriptoren etwas erreichen kann[2]. Ansonsten fällt mir ad Hock auch nur die Standardvorgehensweise ein:
1) Merkmale aus dem (Kanten)Bild extrahieren
2) diese ggf. einer Transformation unterwerfen welche die Merkmale skalierungs-/rotations-/translationsinvariant macht
3) die transformierten Daten mit Sollwerten vergleichen bzw. sie von einem (auf einem bestehenden Datenbestand trainierten) Klassifikator bewerten lassen
Das wäre zwar mit Kanon auf Spatzen geschossen, aber da die Wissenschaft bereits funktionierende Kanonen kennt ist es vielleicht weniger Aufwand als das Rad neu zu erfinden. Um ein eigenes Verfahren zu entwickeln würde ich mich glaube ich erstmal bei SIFT, Viola/Jones und ähnlichem einlesen und von dort einige Ideen klauen. 🙂


1: Ich persönlich kann SUSAN zur Kantenerkennung nur empfehlen

2: Falls dir die Fouriertransformation geläufig ist sind die Fourierdeskriptoren leicht zu verstehen. Andernfalls wird's hart... Prinzipiell wird dabei eine Kontur in einem Bild auf (möglichst wenige) Koeffizienten heruntergebrochen. Ich bin mal auf ein nettes Applet dazu gestoßen, welches eine vereinfachte Form der FD visualisiert: Image Analysis Applet. Mit dem Regler links kannst du einstellen wieviele Koeffizienten verwendet werden sollen; nach Klick auf "apply" wird dann unten/mitte die Approximation der Kontur oben/mitte angezeigt. Dabei zeigt sich, das man mit recht wenigen Koeffizienten schon gute Ergebnisse erreicht.

Edit: Tippfehler korrigiert
 
Zuletzt bearbeitet von einem Moderator:
Interessantes Thema. Leider nicht ganz einfach, sonst hätten BWM & Co das schon lange implementiert...

Das gibt es IMHO schon etwas "länger", nur nicht in den Allerweltsmodellen wobei es da auch langsam Einzug hält, siehe Ford. Zur Qualität kann man sagen, ja...schon nich schlecht aber man sollte diese Technik momentan doch eher als "Hilfsmittel" sehen.
 
erstmal danke für die wertvollen Tipps. Ich denke, ich bleibe vorerst bei der Hough-Transformation. Werde mal versuchen den Akkumulator zu programmieren. Vielleicht habe ich später hierzu noch mal eine Frage, was die implementierung angeht
 

Zurück
Oben