Hey Ho
ich will ein Rechteck in einem Bild finden können. Ich hatte mir gedacht das ich von oben nach unten Reihe für Reihe durch gehe bis ich eine Reihe hab die dunkler ist als die vorherige. Dann bleibe dann da stehen und das selbe von unten, rechts und links so das ich das Rechteck eingerahmt hab, damit müsste ich das Rechteck ja eingentlich gefunden habe !?
Was haltet ihr davon? Ist das umsetzbar oder gibt es das schon oder habt ihr eine bessere Idee ?
Gruß Zim
Rechteck Finden
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Rechteck Finden
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: Rechteck Finden
Was für ein Rechteck?
Eine Tür oder ein Fenster in einem Foto, oder ein mit Paint "gemaltes" Rechteck.
Wenn 2, sind die Seiten parallel zu den Achsen, oder kann das Rechteck auch gedreht rumliegen?
Was ist wenn da 2 oder mehr Rechtecke im Bild sind?
Im Grunde hast du schon den richtigen Ansatz. Allerdings schaut man nicht, ob der nächste Pixel dunkler ist, sondern man berechnet allgemein den Farbunterschied. Rot und Grün sind rechnerisch (nicht optisch) gleich hell.
Es gibt dafür schon Algorithmen. Das kennst du vielleicht aus diversen Grafikprogrammen: Edge-Detection.
Allerdings solltest du dafür im Speicher arbeiten. Wenn du ein 10MP Bild mit StartDrawing() und Point() bearbeitest musst du sehr viel Geduld haben.
EDIT: Hier ein Algo für das sichtbar machen von Rändern. Anstatt zu zeichnen speicherst du einfach den Wert ab, oder so. http://www.codeproject.com/KB/GDI-plus/ ... ction.aspx
Eine Tür oder ein Fenster in einem Foto, oder ein mit Paint "gemaltes" Rechteck.
Wenn 2, sind die Seiten parallel zu den Achsen, oder kann das Rechteck auch gedreht rumliegen?
Was ist wenn da 2 oder mehr Rechtecke im Bild sind?
Im Grunde hast du schon den richtigen Ansatz. Allerdings schaut man nicht, ob der nächste Pixel dunkler ist, sondern man berechnet allgemein den Farbunterschied. Rot und Grün sind rechnerisch (nicht optisch) gleich hell.
Es gibt dafür schon Algorithmen. Das kennst du vielleicht aus diversen Grafikprogrammen: Edge-Detection.
Allerdings solltest du dafür im Speicher arbeiten. Wenn du ein 10MP Bild mit StartDrawing() und Point() bearbeitest musst du sehr viel Geduld haben.
EDIT: Hier ein Algo für das sichtbar machen von Rändern. Anstatt zu zeichnen speicherst du einfach den Wert ab, oder so. http://www.codeproject.com/KB/GDI-plus/ ... ction.aspx
- The_Dark_Zim-.-
- Beiträge: 372
- Registriert: 18.03.2008 16:53
Re: Rechteck Finden
Also ich wollte erstmal klein anfangen, heißt ein schwarzes Rechteck auf weißem Hintergrund finden. Dann ein schräges... Schlussendlich will ich ein Videobild betrachten und einen Spalt ausmessen können. Sprich wie groß dieser ist. Dabei wird die auflösung wohl nicht so gigantisch sein und der Hintergrund recht neutral, evtl. auch mit einer bestimmten Farbe beleuchtet.
Ich hatte mir noch gedacht oben in der Mitte anzufangen und dann Pixel für Pixel nach unten zu wandern, bis ein bestimmte Farbe kommt. Dann nach rechts gehen und immer gucken ob nach oben oder unten das Rechteck weiter geht und dann nach links. So hätte man doch dann die obere Kante und dann halt noch in die Tiefe. Bei einer Auflösung von 1024*768 sollte das doch nicht so lange dauern ??
Ich hatte mir noch gedacht oben in der Mitte anzufangen und dann Pixel für Pixel nach unten zu wandern, bis ein bestimmte Farbe kommt. Dann nach rechts gehen und immer gucken ob nach oben oder unten das Rechteck weiter geht und dann nach links. So hätte man doch dann die obere Kante und dann halt noch in die Tiefe. Bei einer Auflösung von 1024*768 sollte das doch nicht so lange dauern ??
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Re: Rechteck Finden
In der Mitte anfangen halte ich für gar nicht mal so dumm, wenn man davon ausgehen kann, dass das Rechteck später auch halbwegs mittig positioniert sein wird.
Um den Vorgang zu beschleunigen kannst du natürlich in 10er Schritten gehen und erst wenn es einen Unterschied gibt die Schritte zwischen den beiden weiter entfernten Pixeln verkleinern.
Sollte nochmal einen erheblichen Geschwindigkeitsvorteil einbringen.
Dann definierst du einfach eine obere und unere Toleranzschwelle (z.B. $00000 und $111133, falls der Hintergrund rot ist) und überprüfst ob die Pixelfarbe innerhalb dieser beiden Werte liegt.
Um den Vorgang zu beschleunigen kannst du natürlich in 10er Schritten gehen und erst wenn es einen Unterschied gibt die Schritte zwischen den beiden weiter entfernten Pixeln verkleinern.
Sollte nochmal einen erheblichen Geschwindigkeitsvorteil einbringen.
Dann definierst du einfach eine obere und unere Toleranzschwelle (z.B. $00000 und $111133, falls der Hintergrund rot ist) und überprüfst ob die Pixelfarbe innerhalb dieser beiden Werte liegt.