AW: Bildanalyse/-vergleich
Nun steh ich wieder vor der Frage wie ich folgendes Problem lösen soll.
Ich muss nun um die gefundenen Punkte (X,Y), die im Stringgrid aufgelistet werden, ein Quadrat malen und dieses dann ausfüllen. (im Image3) Hierfür hab ich zwei Prozeduren. Aber irgendwie verstehe ich nicht wie diese im Zusammenhang stehen. Sowas hab ich leider noch nie gemacht. :oops: Zum Beispiel weiß ich nicht was ich konkret für oldcolor einsetzen soll ( für fillcolor denk ich mal clred einsetzen) und wie ich diese Prozedur aufrufen kann. Des Weiteren bin ich mir unsicher wie ich mit left_ und top_ umgehen soll. Ich vermute mal damit brauche ich nur die obere linke Ecke des Quadrats. Ich sehe nur noch :?::?::?::?:
Delphi-Quellcode:
procedure tform1.floodFill_(x,y,fillColor,oldColor: integer);
begin with image3.canvas do if (pixels[x,y]=oldColor) then begin Pixels[x,y]:= fillcolor; floodFill_(x+1,y, fillcolor, oldColor); floodFill_(x-1,y, fillcolor, oldColor); floodFill_(x,y+1, fillcolor, oldColor); floodFill_(x,y-1, fillcolor, oldColor); end; end;
Delphi-Quellcode:
procedure tform1.quadratmalen(image,top_,left_,kantenlaenge,farbe:integer);
var x, y, kante // Kantenlänge des Quadrats :integer; begin kante:=spinedit2.value; quadratmalen(image1,x-(kante/2),y-(kante/2),kante,clred); // Quadratmalen mittels zeichnen der 4 Linien quadratmalen(image2,x-(kante/2),y-(kante/2),kante,clred); // und dann Füllen mit Füllfunktion quadratmalen(image3,x-(kante/2),y-(kante/2),kante,clred); // Ist dieser Zusammenhang richtig?? quadratmalen(image4,x-(kante/2),y-(kante/2),kante,clred); case image of 1: with form1.image1.canvas do begin end; 2: with form1.image2.canvas do begin end; 3: // nur im Image3 werden die Quadrate gemalt! with form1.image3.canvas do begin end; 4: with form1.image4.canvas do begin end; end; end; |
AW: Bildanalyse/-vergleich
kante:=spinedit2.value;
gehört nicht in die Prozedur, hier soll kantenlaenge verwendet werden, also im Aufruf spinedit2.value mitgeben. Die Quadratemalfuntion ist nicht rekursiv (selbstaufrufend wie floodfill) zu implementieren. Der Code der zu implementieren ist kommt nur in Case 3: Quadrate kann man malen mit MoveTo und 4 * LineTo oder Image3.Canvas.Brush.Style := bsClear; Image3.Canvas.Rectangle(L,O,R,U); nach dem Quadratemalen wird floodfill aufgerufen (kann auch innerhalb von quadratmalen aufgerufen werden) fillcolor ist clRed, oldColor ist die Grundfarbe des Bildes also clBlack, diese Funktion ruft sich solange selbst wieder auf bis der gefundene Punkt nicht mehr oldColor entspricht, als wenn der Rahmen von Quadratemalen erreicht wurde. Einen Teil in der Aufgabe hatten wir übersehen, weder im StringGrid noch in der Malroutine sollen Benachbarte Punkte nach Definition Kantenlänge erfasst werden. Dies bedeutet dass schon beim Scanvorgang Image3 miteinbezogen werden muss und nur wenn pixels[i,j] in Bild 3 schwarz ist dieser Punkt erfasst wird (gleiche Rangstufe wie der Schwellenwert), es muss dann wenn ein Punkt gefunden wurde auch direkt das Quadrat in Image3 gemalt und gefüllt werden, damit ein Beispielsweise direkt benachbarter Punkt bein nächsten Vergleich ausgeschlossen wird. |
AW: Bildanalyse/-vergleich
Ah super, danke schon mal für die Infos. Werde mich mal dransetzen und versuchen das umzusetzen. :thumb:
|
AW: Bildanalyse/-vergleich
Zitat:
Delphi-Quellcode:
die uns mit Hilfe der Parameter das Quadrat malen soll. Wieso muss ich hier mit moveto/lineto bzw. rectangle arbeiten? Ich hatte mir das so vorgestellt, dass ich bei image3 das left_ und bottom_ bestimme, die kantenlänge aus dem spinedit2.value einlese und die farbe= rot setze und mir automatisch ein Quadrat gemalt wird. Ist das nicht so?
procedure tform1.quadratmalen(image,top_,left_,kantenlaenge,farbe:integer);
Also bin mit den beiden Prozeduren und deren Beziehung zu einander überfordert. Wie muss das als Code aussehen? Ich stell nochmal den ganzen code rein:
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Grids, Spin; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Label1: TLabel; Label2: TLabel; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; StringGrid1: TStringGrid; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure floodFill_(x,y,fillColor,oldColor: integer); procedure quadratmalen(image,top_,left_,kantenlaenge,farbe:integer); procedure AddFound(nr,x,y,wert:integer); private { private declarations } public { public declarations } end; var Form1: TForm1; b,h:integer; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin b:=image1.width; h:=image1.height; // Breite und Höhe der Imagefelder image2.width:=b; image2.height:=h; image3.width:=b; image3.height:=h; image4.width:=b; image4.height:=h; image1.canvas.brush.color:=clblack; // Hintergrundfarben image2.canvas.brush.color:=clblack; image3.canvas.brush.color:=clblack; image4.canvas.brush.color:=clwhite; image1.canvas.fillrect(rect(0,0,b,h)); // Rechteck mit obigen Farben ausfüllen image2.canvas.fillrect(rect(0,0,b,h)); image3.canvas.fillrect(rect(0,0,b,h)); image4.canvas.fillrect(rect(0,0,b,h)); image1.Picture.loadfromfile('1sw.bmp'); // Bilder hochladen image2.Picture.loadfromfile('pic2.bmp'); form1.caption:= 'Bildanalyse-Suche nach Vergleichsschwankungen'; end; procedure tform1.floodFill_(x,y,fillColor,oldColor: integer); begin with image3.canvas do if (pixels[x,y]=oldColor) then begin Pixels[x,y]:= fillcolor; floodFill_(x+1,y, clred, oldColor); floodFill_(x-1,y, clred, oldColor); floodFill_(x,y+1, clred, oldColor); floodFill_(x,y-1, clred, oldColor); end; end; procedure tform1.quadratmalen(image,top_,left_,kantenlaenge,farbe:integer); var x, // Koordinaten y :integer; begin x:=stringgrid1.cells[1,nr]; // Koordinaten aus stringrid nehmen - klappt nicht! y:=stringgrid1.cells[2,nr]; case image of 1: with form1.image1.canvas do begin end; 2: with form1.image2.canvas do begin end; 3: with form1.image3.canvas do begin quadratmalen(3,round(x-(spinedit2.value/2)),round(y-(spinedit2.value/2)),spinedit1.value,clred); // Quadratmalen mittels zeichnen der 4 Linien - klappt nicht! pen.color:=clred; moveto(round(x-spinedit2.value/2),round (y-spinedit2.value/2)); // klappt nicht! lineto(round(x+spinedit2.value/2),round (y-spinedit2.value/2)); lineto(round(x+spinedit2.value/2),round (y+spinedit2.value/2)); lineto(round(x-spinedit2.value/2),round (y+spinedit2.value/2)); lineto(round(x-spinedit2.value/2),round (y-spinedit2.value/2)); end; 4: with form1.image4.canvas do begin end; end; end; procedure TForm1.Addfound (nr,x,y,wert:Integer); Begin If stringgrid1.rowcount < (nr+1) then stringgrid1.rowcount:= nr+1; stringgrid1.cells[0,0]:='Nr.'; stringgrid1.cells[1,0]:='X'; stringgrid1.cells[2,0]:='Y'; stringgrid1.cells[3,0]:='Diff-Wert'; stringgrid1.cells[0,nr]:=inttostr(Nr); stringgrid1.cells[1,nr]:=inttostr(X); stringgrid1.cells[2,nr]:=inttostr(Y); stringgrid1.cells[3,nr]:=inttostr(Wert); end; procedure TForm1.Button1Click(Sender: TObject); Var farbe1, // Pixelfarbe im Image1 farbe2, // Pixelfarbe im Image2 wert, // Differenzwert schwellwert, // Schwellwert zum Vergleich x, // Laufindex y, // Laufindex z, // Zähler kante :integer; begin schwellwert:=spinedit1.value; // Voreinstellung 10 kante:=spinedit2.value; z:=0; // Zähler auf Null gesetzt For x:=0 to b-1 do // Pixelweise Bilder auslesen Begin For y:=0 to h-1 do Begin farbe1 := image1.canvas.pixels[x,y]; // Farbe merken farbe2 := image2.canvas.pixels[x,y]; wert:= (farbe1 and clred)-(farbe2 and clred); // Differenzwert If wert > schwellwert then // mit Schwellwert vergleichen begin inc(z); // Zähler hochzählen AddFound(z,x,y,wert); // Daten in Stringgrid einfügen end; end; end; end; procedure TForm1.Button2Click(Sender: TObject); begin close; end; end. |
AW: Bildanalyse/-vergleich
das gehört da nicht rein:
Delphi-Quellcode:
wenn es Sinn machen würde müsstest Du den String auch noch in einen Integer umwandeln (StrToInt)
x:=stringgrid1.cells[1,nr];
....
Delphi-Quellcode:
und statt spinedit2.value sollst Du nach Vorgabe _kantenlaenge verwenden
3:
with form1.image3.canvas do begin // folgende Zeile hat hier nichts verloren .... quadratmalen(3,round(x-(spinedit2.value/2)),round(y-(spinedit2.value/2)),spinedit1.value,clred); // Quadratmalen mittels zeichnen der 4 Linien - klappt nicht! //pen.color:=clred; pen.color:=farbe; Die Prozedur gehört in die Ecke wo Du AddFound aufrufst, mit
Delphi-Quellcode:
quadratmalen(3,j,i,SpinEdit2.Value,clRed);
Ihr sollt ja den Sinn und die Funktion von Prozeduren verstehen lernen .... |
AW: Bildanalyse/-vergleich
Ja, aber wie ruf ich die Prozedur richtig auf?
Und wie sieht die richtige Zuweisung aus? Bei diesem Teil hab ich Verständisprobleme. Im moment weiß ich nur, dass ich mit de Prozedur "quadratmalen" ein Quaadrat, bestehend aus 4 Linien, zeichnen und diese innere Fläche mit der Prozedur "floodfill" ausfüllen soll. Die Allgemeinform der Prozeduren steht ja in der Aufgabe, aber jetzt koknret für meinen Fall versteh ich das nicht so recht wie das als code aussehen soll. :wall: |
AW: Bildanalyse/-vergleich
Ich hatte Dir geschrieben wo und wie die Prozedur aufzurufen ist.
Ich hatte geschrieben was da nicht reingehört und was wie geändert werden muss. Der MoveTo LineTo Part passt im Prinzip nur solltest Du top_ und left_ statt y und x verwenden, sowie wie beriets geschrieben kantenlaenge und farbe. Vielleicht solltest Du mal da http://www.christian-stelzmann.de/artikel/crashkurs.htm vorbeischauen. Wenn Du nicht verstehst wie was tickt solltest Du Dir ein kleineres Projekt selbst aufsetzen und mit den Canvasroutinen etwas herumspielen. |
AW: Bildanalyse/-vergleich
warum verwendet Ihr keine Algorithmen der Bildverabeitung ???
--> http://en.wikipedia.org/wiki/Feature...uter_vision%29 wenn es sich um Kreise handelt wäre Hough Tranmsformation der Bilder eine mögliche Lösung -->> http://sourceforge.net/projects/houghtransforma/ (allerdings ist der Hough Accu hier nicht gut implementiert ... das Projekt wartet auf Freiwillige :-) |
AW: Bildanalyse/-vergleich
@bernhard_LA
es handelt sich um eine Schulaufgabe mit fest vorgegebenem Rahmen |
AW: Bildanalyse/-vergleich
Hab den code jetzt korrigiert. Dennoch frag ich mich warum folgendes Problem auftritt.
Ich lass die Quadrate mit der Kantenlänge 3 zeichnen. Ok alles wunderbar,klappt! Dann verändere ich z.B. auf die Kantenlänge 7. Das Quadrat mit Kantenlänge 3 bleibt bestehen und er zeichnet mir um dieses Quadrat nur einen Umriss des Quadrats mit Kantenlänge 7. Das heißt er füllt die Fläche nicht richtig aus. Wenn man schrittweise die Kantenlänge um eins erhöht und jedesmal zeichnen lässt, dann sieht das so aus als würde die Fläche ganz ausgefüllt werden. Ist aber nicht Sinn der Sache. Desweiteren hab ich noch die Frage wie ich das hier umsetzen soll. Zitat:
Hier der Code:
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Grids, Spin; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Image1: TImage; Image2: TImage; Image3: TImage; Image4: TImage; Label1: TLabel; Label2: TLabel; SpinEdit1: TSpinEdit; SpinEdit2: TSpinEdit; StringGrid1: TStringGrid; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure floodFill_(x,y,fillColor,oldColor: integer); procedure quadratmalen(image,top_,left_,kantenlaenge,farbe:integer); procedure AddFound(nr,x,y,wert:integer); private { private declarations } public { public declarations } end; var Form1: TForm1; b,h:integer; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin b:=image1.width; h:=image1.height; // Breite und Höhe der Imagefelder image2.width:=b; image2.height:=h; image3.width:=b; image3.height:=h; image4.width:=b; image4.height:=h; image1.canvas.brush.color:=clblack; // Hintergrundfarben image2.canvas.brush.color:=clblack; image3.canvas.brush.color:=clblack; image4.canvas.brush.color:=clwhite; image1.canvas.fillrect(rect(0,0,b,h)); // Rechteck mit obigen Farben ausfüllen image2.canvas.fillrect(rect(0,0,b,h)); image3.canvas.fillrect(rect(0,0,b,h)); image4.canvas.fillrect(rect(0,0,b,h)); image1.Picture.loadfromfile('1sw.bmp'); // Bilder hochladen image2.Picture.loadfromfile('pic2.bmp'); form1.caption:= 'Bildanalyse-Suche nach Vergleichsschwankungen'; end; procedure tform1.floodFill_(x,y,fillColor,oldColor: integer); begin with image3.canvas do if (pixels[x,y]=clblack) then begin Pixels[x,y]:= fillcolor; floodFill_(x+1, y, clred, clblack); floodFill_(x-1, y, clred, clblack); floodFill_(x, y+1, clred, clblack); floodFill_(x, y-1, clred, clblack); end; end; procedure tform1.quadratmalen(image,top_,left_,kantenlaenge,farbe:integer); begin case image of 1: with form1.image1.canvas do // Wird nicht benutzt begin end; 2: with form1.image2.canvas do // Wird nicht benutzt begin end; 3: with form1.image3.canvas do begin pen.color:=clred; moveto(round(left_-kantenlaenge),round (top_-kantenlaenge)); // Startpunkt lineto(round(left_+kantenlaenge),round (top_-kantenlaenge)); // 4 Linien für das Quadrat zeichnen lineto(round(left_+kantenlaenge),round (top_+kantenlaenge)); lineto(round(left_-kantenlaenge),round (top_+kantenlaenge)); lineto(round(left_-kantenlaenge),round (top_-kantenlaenge)); end; 4: with form1.image4.canvas do // Wird nicht benutzt begin end; end; end; procedure TForm1.Addfound (nr,x,y,wert:Integer); Begin If stringgrid1.rowcount < (nr+1) then begin // Zeile um eins erhöhen, wenn stringgrid1.rowcount:= nr+1; end; stringgrid1.cells[0,0]:='Nr.'; // Benennung der Spalten stringgrid1.cells[1,0]:='X'; stringgrid1.cells[2,0]:='Y'; stringgrid1.cells[3,0]:='Diff-Wert'; stringgrid1.cells[0,nr]:=inttostr(Nr); // Daten in entsprechende Spalten/Zeilen einfügen stringgrid1.cells[1,nr]:=inttostr(X); stringgrid1.cells[2,nr]:=inttostr(Y); stringgrid1.cells[3,nr]:=inttostr(Wert); end; procedure TForm1.Button1Click(Sender: TObject); Var farbe1, // Pixelfarbe im Image1 farbe2, // Pixelfarbe im Image2 wert, // Differenzwert schwellwert, // Schwellwert zum Vergleich x, // Laufindex in X-Richtung y, // Laufindex in Y-Richtung z // Zähler :integer; begin schwellwert:=spinedit1.value; // Schwellwert z:=0; // Zähler auf Null gesetzt For x:=0 to b-1 do // Pixelweise Bilder auslesen Begin For y:=0 to h-1 do Begin farbe1 := image1.canvas.pixels[x,y]; // Farbe merken und zuweisen farbe2 := image2.canvas.pixels[x,y]; wert:= (farbe1 and clred)-(farbe2 and clred); // Differenzwert bilden (Rotmaske) If wert > schwellwert then // Differenzwert mit Schwellwert vergleichen begin inc(z); // Zähler hochzählen AddFound(z,x,y,wert); // Daten in Stringgrid einfügen quadratmalen(3,y,x,spinedit2.value,clred); // Quadrat malen floodfill_(x,y,clred,clblack); // Quadrat ausfüllen image4.canvas.pixels[x,y]:=clred; image4.canvas.pixels[x,y]; // Im Image4 die Punkte markieren end; end; end; end; procedure TForm1.Button2Click(Sender: TObject); begin close; // Schließen Knopf end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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