Objekterkennung basics..



  • Hallo Leute,

    ich habe eine Schwarz/Weis -Bild, welches unterschiedliche geometrische Objekte darstellen kann.

    Nehmen wir an ich habe ein Rechteck, welches etwas rotiert auf eine weise fläche dargestellt wird. Nun möchste ich über diverse Kantenfilter die kanten erkennen (vorteil ist, das das objekt immer schwarz ist, und der hintegrund weis).

    Aus den Koordinaten der Kanten möchte ich Geraden bzw. 2-Dim Vektor herleiten... is das möglich..? Wenn ja welche algorithmen werden da so verwendet? Irgendwleche Tipps???

    So das ich später die geometrie über n-Linen und dieren verbindungspunkte darstellen kann!

    grüße



  • Du musst erstmal die Kanten detektieren bzw. die Pixel an der Kante. Das kannst Du zum Beispiel ganz einfach machen, in dem Du den Betrag des Gradienten der Bildfunktion berechnest. Der ist in Deinem Fall groß für Punkte an der Kante. Wenn Du ein Bild mit dem Betrag des Gradienten Deines Ursprungsbildes hast, dann setzt Du einen Schwellwert und alles was oberhalb dieses Wertes liegt, ist für Dich ein Kantenpixel. Als nächstes benötigst Du eine sogenannte Houghtransformation, um gerade Linien in Deinem Kantenbild zu detektieren. Die funktioniert etwa so: Eine Gerade ist allgemein gegeben als d=x*cos(alpha)+y*sin(alpha). Jetzt erzeugst Du ein "Parameterbild" bzw. ein 2D-Array, das Du in die eine Richtung mit alpha indizierst und in die andere mit d. Jetzt guckst Du für jeden Kantenpunkt (x,y) in Deinem Kantenbild, zu welchen Geraden er gehören könnte und inkrementierst die entsprechenden Arrayelemente in Deinem Parameterarray. Wenn Du das für alle Kantenpunkte machst, dann kriegst Du im Parameterarray lokale Maxima bei den Parametern, die Geraden repräsentieren, die tatsächlich im Bild auftreten. Du suchst dann also Dein Parameterarray nach diesen lokalen Maxima ab und schon hast Du die Geraden. Allerdings hast Du dann Geraden und keine Strecken, die in beide Richtungen begrenzt sind. Aber das sollte dann vermutlich nur noch ein kleineres Problem sein.



  • Die Houghtransformation hat nur ein "kleines" Problem, wenn es mehrere Geraden im Bild gibt, die detektiert werden sollen. Denn mit Ausnahme des globalen Maximums sind lokale Maxima nicht gut zu finden.



  • otze schrieb:

    Die Houghtransformation hat nur ein "kleines" Problem, wenn es mehrere Geraden im Bild gibt, die detektiert werden sollen. Denn mit Ausnahme des globalen Maximums sind lokale Maxima nicht gut zu finden.

    Warum nicht? Verstehe ich erstmal nicht?

    Ich habe die Hough-Transformation mal genutzt, um Kreise zu erkennen, um damit Geld zu zählen...

    http://img199.imageshack.us/img199/111/moneyimage.png

    Wie Du siehst, scheint es damals geklappt zu haben, obwohl ich jede Menge Kreise hatte, die ich detektieren musste. Ok, einige Kreise sind vielleicht etwas ungenau detektiert worden, aber das liegt eher nicht an der Hough-Transformation, sondern an der vorherigen Extraktion der Kantenpixel. Ich sehe zumindest nicht so ganz, warum es da ein prinzipielles Problem geben sollte. Ok, 1000 Kreise oder Linien wird man so nicht so gut detektieren können. Da wäre eine Analyse des Parameterbildes vermutlich etwas zu aufwändig. Aber wenn man die Auflösung des Parameterraums passend wählt, dann sollte man für überschaubare Mengen von Objekten auch vernünftige Resultate bekommen.

    Oder hast Du eine bessere Idee, wie man die begrenzenden Geraden der Objekte detektieren könnte?

    Gerade habe ich mittels einer Hough-Transformation vor Jahren auch mal in einem Praktikum im Rahmen meines Studiums detektiert. Hat problemlos geklappt. Die lokalen Minima waren im Parameterraum sehr gut zu sehen und sehr ausgeprägt. Ok, es waren auch recht lange Geraden. Das ist vielleicht so ein Punkt. Wenn man lauter kurze Geraden hat, dann wird die Hough-Transformation nicht so gut funktionieren. Denn die lebt ja davon, dass man viele Punkte auf diesen Geraden hat.

    EDIT: Jetzt, wo ich darüber nachdenke... ich habe damals natürlich nicht alle lokalen Maxima im Parameterbild ausgewertet. Stattdessen habe ich mir zuerstmal einen Schwellwert gewählt. Bei den Kreisen habe ich einfach gesagt, dass ein Kreis vom Radius R vermutlich ungefähr U=2*Pi*R Pixel haben sollte. Ich habe damals alle lokalen Maxima ignoriert, die nicht wenigstens einen Wert von U/2 oder so hatten. So habe ich die Suche sofort auf sehr wenige Maxima eingeschränkt. Bei Geraden kann man ähnliches machen. Da nimmt man dann eben an, dass mindestens 50 Pixel oder so auf der Geraden liegen müssen.


Anmelden zum Antworten