Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Vektorisierung (https://www.delphipraxis.net/122667-vektorisierung.html)

blender 20. Okt 2008 11:17


Vektorisierung
 
Gestern habe ich hier einen Thread bezüglich meiner Region Growing Methode reingestellt.
Nun möchte ich die Seiten der Regionen so Vektorisieren, dass die Vektorisierten Formen zusammen ein Polygon ergeben, welches die Region umschließt.

Mir fällt leider nichts ein und ich habe keinen Ansatz.
Ich habe nur die Werte von jedem Pixel welcher Region er angehört. (Mehr informationen zu dem Region Growing Algorithmus hier)

jfheins 20. Okt 2008 11:27

Re: Vektorisierung
 
Wenn das Bild nicht allzu pixelig ist, könntest du versuchen, erstmal alle Randpixel zu ermitteln, und diese als Polygon aufzufassen. Damit hast du ein Polygon mit sehr vielen Ecken, dass die Form sehr genau abbildet.
Wenn du jetzt alle Ecken durchgehst, und alle Ecken die zwischen 170° und 190° sind, eliminierst könntest du ein einigermaßen brauchbares Polygon bekommen :stupid:

blender 20. Okt 2008 12:28

Re: Vektorisierung
 
Ich möchte die Ränder Vektorisieren.
Wie soll ich daraus denn die Vektorformen auslesen?
Die Randpixel mus ich sowieso ermitteln, oder?
Für die Ermittlung der Randpixel schreibe ich schon mal eine Methode.

blender 20. Okt 2008 18:38

Re: Vektorisierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein Programm welches die Region Growing Methode durchführt.

Die Toleranz ist einstellbar.
Falls jemand sinnvolle Werte für die Region Growing Methode findet, bitte posten.
Ich finde 110 bis 200 ganz gut.
Nach einer Kantenglättung mit nur einer Region sollte das Bild nicht schlechter aussehen.

blender 21. Okt 2008 13:42

Re: Vektorisierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe einen Hough Transformation Algorithmus gefunden und ihn meinem Code angepasst.
Nur: Was ist denn nach der Ausführung in dem "hougharray"?
Ich bin erst in der 9. Klasse und habe daher keine Ahnung was diese Formeln bedeuten.
(Nicht dass ich die Lehrer noch nicht gefragt hätte, aber die Antwort ist immer "Warte noch ein paar Jahre")

Delphi-Quellcode:
function IsPoint(x,y,region:integer):boolean;
begin
result := (Regions.Values[x][y] = region) and (regions.rand[x][y] = 'Ja');
end;

procedure GetLines(Region: Integer);
var x,y,theta: integer;
    r: Extended;
    HoughArray:Array of array of integer;
begin
SetLength(hougharray,360,round(Sqrt(form1.Image1.Height*form1.Image1.Height + form1.Image1.Width*form1.Image1.Width)));

// For all rows in image.
for y:=0 to form1.Image1.Height-1 do
begin

   // For all pixel in one row.
   for x:=0 to form1.Image1.Width-1 do
   begin

      // Is there a point there or not. If not, just skip the pixel.
      if IsPoint(x,y, region) then
      begin
           // Now you need to iterate for one of the unknown variables,
           // theta, to be able to determine the other unknown, r.
           for theta:=0 to 359 do
           begin
                r:=x*cos(theta*PI/360) + y*sin(theta*PI/360);

                // Plot the finding (theta,r) into an array.
                // Ignore negative values... trust me... its ok!
                if r>=0 then Inc(HoughArray[theta,round(r)]);
           end;
      end;
   end;
end;

end;
Edit:

Delphi-Quellcode:
procedure TForm1.Button6Click(Sender: TObject);
var x,y,i: Integer;
begin

for x := 0 to high(Regions.Values) do
 begin

  for y := 0 to high(Regions.Values[x]) do
   begin

   if (x > 0) and (y > 0) and (x < high(Regions.Values)) and (y < high(Regions.Values[x])) then
    begin

    if (regions.Values[x][y] <>
 regions.values[x,y-1])or(regions.Values[x][y] <>
 regions.values[x+1,y])or(regions.Values[x][y] <>
 regions.values[x-1,y])or(regions.Values[x][y] <>
 regions.values[x,y+1]) then regions.Rand[x][y] := 'Ja' else regions.Rand[x][y] := 'Nein';

    end
   else
    begin
    regions.Rand[x][y] := 'Ja';
    end;


   end;

 end;

end;
Ich habe vergessen, die Rand-Ermittlungs Prozedur zu posten.

edit 2

Anhang hinzugefügt.

Hinweis:

Der Hough Algorithmus gibt nichts für den Benutzer sichtbares zurück und tut eigentlich gar nichts außer Zählen, wenn nicht vorher Region Growing und Regionenränder ausgeführt worden ist.
Regionenränder und Kantenglättung mit Region haben keine Auswirkungen, wenn nicht vorher Region Growing durchgeführt wurde.
Bei verändern der Formulargröße werden viele Werte zurückgesetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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