![]() |
Bildanalyse - Polygon Erkennen
Hi,
Ich würde gerne ein Bild analysieren...dahingehend, dass mein Programm in diesem Bild ein oder mehrere Polygone einer gegeben Farbe erkennt. Das Bild wird aus wenigen, klar zu unterscheidenden Farben bestehen (keine Schattierungen). Ausgegeben werden sollen eigentlich nur die Eckpunkte. Beispiel: ich habe die Flagge der EU. nun möchte ich die Eckpunkte der Sterne in Pixeln rauskriegen. Wie kann ich das vom Ansatz her machen? gibt es da spezielle Algorithmen für? (gerne auch Quelltexte :) ) mir ist klar, dass das nicht besonder Performant sein wird, aber das ist hierbei egal...wird nicht oft aufgerufen :) |
Re: Bildanalyse - Polygon Erkennen
Hi,
Ich würde erst mal damit anfangen das Bild nach der Farbe zu durchsuchen. Und dann erst probieren das Bild zu Analysieren! z.B. Merke dir den ersten und den letzten Pixel einer Durchgehenden Reihe. Daran könntest du das Objekt schon mal rekonstruieren. Dann zu erkennen was wirkliche Eckpunkte sind ist da schon schwieriger! Solltest du allerdings nur wagerechte und senkrechte Linien haben sollte das kein Problem darstellen. Diagonale Linien sind allerdings schwer zu erkennen da sie nicht immer gleichmäßig gezeichnet sind! Die Frage ist also wozu brauchst du die Daten? Je nach dem würde ich entscheiden ob sich der Aufwand lohnt die diagonalen Linien zu analysieren! Greetz Boombuler |
Re: Bildanalyse - Polygon Erkennen
Ja, es ist norwendig auch diagonalen zu erkennen...
Ich habe mir schon überlegt wie man es event. umsetzen könnte...Ich muss mal schauen wann ich es umgesetzt kriege. |
Re: Bildanalyse - Polygon Erkennen
Sind die Kanten anti-aliased?
Eigentlich sollte es ja schon reichen, wenn du für jedes gefundene Kantenpixel einen Eckpunkt speicherst und danach alle Eckpunkte, die auf der Geraden durch die benachbarten Eckpunkte (bei Diagonalen mit etwas Spielraum) liegen, aus der Liste wirfst. |
Re: Bildanalyse - Polygon Erkennen
So in etwa sollte es laufen :)
ich wollte mir praktisch ein Raster erstellen, welches nur die Grenzen enthält... und dann die Strecken-enden Rausholen ;) Das mit dem Antialised...gute Frage. Keine Ahnung, könnte aber tatsächlihc zum Problem werden :-/ |
Re: Bildanalyse - Polygon Erkennen
Liste der Anhänge anzeigen (Anzahl: 1)
Hm...also
ich habe nun eine Klasse geschrieben, welche einem aus so einem Bild und einer Koordinate die Ränder des Polygons wo der Punkt drin ist als Bitmap ausgibt....Mit beispielprogramm [Siehe Anhang ;) ] Zu der Ausgabe der Bitmaps: Ich weiss, es gibt wenig was noch unschöner ist als diese Pointer-Misshandlung da... :? Aber anders habe ich es irgendwie nicht hingekriegt Wer es sauber schafft kann es mir bitte per PN schicken.... nun bleibt das Problem, die Punkte auf einer Geraden zu eliminieren... Hat da irgendjemand eine Idee zu? [Edit] Also die Bitmaps werden jetzt vernünftig kopiert...bleibt das eleminieren der geraden... [Edit2] könnte man es nicht so machen, das man jeden Pixel des Rands mit jedem anderen der übrig bleibt vergleicht, und immer solange einen weiter geht, bis nicht mehr alle pixel dazwischen auf einer direkten linie zwischen den beiden punkten liegen? dann löscht man alle die dazwischen lagen, und fängt mit dem gefundenen endpunkt wieder an. das ganze macht man dann solange bis der endpunkt wieder der anfangspunkt ist... Das probier ich mal aus :) (Bresenham hab ich schon gefunden :) ) [Edit3] Ist das eine vernünftige Übersetzung des ![]()
Delphi-Quellcode:
procedure Swap(var X, Y: Integer);
var T: Integer; begin T:=X; X:=Y; Y:=T; end; procedure Line(X0, Y0, X1, Y1: Integer; var Points: TPoints); var Steep: Boolean; DX, DY, E, DE, YStep: Integer; Y, X: Integer; begin Steep:=Abs(Y1-Y0) > Abs(X1-X0); if Steep then begin Swap(X0,Y0); Swap(X1,Y1); end; if X0>X1 then begin Swap(X0,X1); Swap(Y0,Y1); end; DX:=X1-X0; DY:=Abs(Y1-Y0); E:=0; DE:=DY; Y:=Y0; SetLength(Points,X1-X0+1); if Y0<Y1 then YStep:=1 else YStep:=-1; for X:=X0 to X1 do begin if Steep then begin Points[X-X0].X:=X; Points[X-X0].Y:=Y; end else begin Points[X-X0].X:=Y; Points[X-X0].Y:=X; end; E:=E+DE; if E SHL 1 >= DX then begin Y:=Y+YStep; E:=E-DX; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz