Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bildanalyse - Polygon Erkennen (https://www.delphipraxis.net/63216-bildanalyse-polygon-erkennen.html)

glkgereon 15. Feb 2006 14:51


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 :)

Boombuler 16. Feb 2006 08:31

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

glkgereon 16. Feb 2006 13:04

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.

Khabarakh 16. Feb 2006 13:22

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.

glkgereon 16. Feb 2006 13:24

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 :-/

glkgereon 16. Feb 2006 17:08

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 Wikipedia-Codes?
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 19:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz