Ich habe einen haufen pixel die alle aneinander liegen und möchte wissen, ob dieser Pixelhaufen ein beliebig rotiertes Rechteck ist.
Meine idee das ganze anzugehen wäre, ich suche mir von dem pixelhaufen die 4 eckpunkte (ich tue so als wäre es ein rechteck) und berechne alle winkel des rechtecks. wenn die zusammen addiert 360 ergeben kann ich genauer nachgucken.
Der zweite schritt nimmt dann die 4 eckpunkte und berechnet aus denen ein Viereck und überprüft alle pixel ob sie in diesem rechteck liegen.
Wenn alle punkte drinliegen schaue ich ob der pixelhaufen von der fläche her dem rechteck entspricht.
Trifft all das zu, ist es ein rechteck und ich kann über die eckpunkte den winkel berechnen.
Allerdings erscheint mir der weg nicht sehr optimal und recht ungenau... gibt es da irgendeinen tollen trick wie ich das besser lösen kann?
Registriert: Sa Nov 24, 2007 11:59 Beiträge: 116
Programmiersprache: FreePascal
Zitat:
Meine idee das ganze anzugehen wäre, ich suche mir von dem pixelhaufen die 4 eckpunkte (ich tue so als wäre es ein rechteck) und berechne alle winkel des rechtecks. wenn die zusammen addiert 360 ergeben kann ich genauer nachgucken.
Wäre es nicht genauer, dir 5 Eckpunkte zu suchen und zu gucken, ob der fünfte dieselben koordinaten wie der erste hat? bei winkelberechnungen treten fast immer ungenauigkeiten auf.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Wir haben sowas wie folgt gemacht.
Als erstes wird das Bild so transformiert, dass man so einfach wie möglich an die Informationen kommt z.B. Kontrast ändern, rauschen entfernen, einfärben,... Kantenfindung.
Dann kannst du anfangen Wichtige Daten zu finden.
In deinem Fall suchst du Rechtecke, also kannst du wie folgt vorgehen.
Du bildest eine 8. Nachbarschaft für den zu suchenden Pixel, dann prüfst du, ob ein Nachbar mit gleicher Farbe vorhanden ist.
Wenn du ein Nachbarn findest, prüfst du erstmal, ob es überhaupt möglich ist, ob es ein Rechteck ist also die Treffer in einer Linie oder 90° Winkel zueinander liegen. Nun erweiterst du die Nachbarschaft um ein Pixel in alle Richtungen und prüfst, ob neue Treffer sinn ergeben.
Wenn du 2 Punkte hast, dann kannst du ja vorraus sagen wo der nächste Treffer liegen muss, damit es eine Kante ergibt und 3 Punkte, um ein Eckpunkt zu verifizieren. Du kannst ein Eckpunkt auch über seine Eigenschaft finden, dass er das minimum bzw. Maximum hat, also der am weitestem Linke Pixel und rechte Pixel sowie oben und unten geben erstmal eine Boundingbox an, wo das Rechteck drin sein kann und ausgehend von der BB kannst du dann verifizieren ob die 4 Punkte wirklich ein Viereck ergeben.
Empfehlenswert ist eine Mask zu benutzen, welche Verarbeitete Pixel maskiert und nicht nochmal verarbeitet.
Unser Prof. meinte immer, "Im Idealfall hat man für jedes Bild ein neuen Quellcode.", da man ja auch an Informationsverlust denken muss(Rauschen, Bildinformationen sind zu klein, Farbüberlagerungen, Muster, Beleuchtung,...). Optimale Algorithmen sind nur für ein Bild speziell entwickelt.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
öhh... mir geht es nicht darum wie ich die pixel finde die zu dem rechteck gehören, das habe ich schon erledigt.
Ich habe jetzt halt meine Pixel und will wissen ob diese ein rechteck darstellen oder nicht (stell es dir vor wie schwarze pixel in nem weißen bild).
Die eckpunkte habe ich auch bereits (wie im ersten post geschrieben) schon gefunden und überprüfe anhand der winkel ob es ein Rechteck ist, aber das ist halt doch relativ ungenau..
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Abhängig wo das Bild her kommt würde ich empfehlen anhand von Bresenham mal die ganze Sache zu validieren.
OpenGL, Direct3D, Softwarerenderer benutzen diesen Algo zum zeichnen von Linien und damit solltest du ziemlich gut die meisten Rechtecke gut erkennen können. Wie schon erwähnt, für jedes Bild gibt es eine optimale Lösung und diese ist auf ein anderes Bild nicht anwendbar. Der Einfluss, wie das Rechteck gezeichnet wird ist schon eines. Du kannst mit Schwellwerten arbeiten und halt regler einbauen, mehr kannst du dann auch nicht tun.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Weißt du denn schon, ob deine gefundenen Eckpunkte zu einer zusammenhängenden Fläche gehören und potentiell ein Rechteck sind?
Oder hast du vier beliebige Eckpunkte, die auch zu vier verschiedenen Formen gehören können?
Wenn ersterer Fall: Was fehlt dir noch, ob das ein Rechteck ist? Stellst du die Forderung, dass die gegenüber liegenden Seiten parallel sind? Wenn ja, dann find ich Taks Vorschlag passend, einmal mit dem Bresenham darüber zu gehen und mit einer Fehlertoleranz zu arbeiten, ob die Dinger parallel sind.
Anderer vorschlag:
Das image so trnsformiern, das potentielle flächen sich vom rest unterscheiden (weiß auf schwarz)
Dann das bild Radon transformieren, zusätzlich alle möglichen rechtecke auf transformieren.
Der vorteil ist nun das die suche von n x m auf n geschrumpft ist. Nun einfach mit hilf von kreuzkorrelation kandidaten in den Zeilen suchen. Die invser radon transfomtion sollte dann die Positionn der objekte liefern. Dummerwise muss man es für jede mögliche rotation und skalierung durchführen.....
Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.