|
Registriert seit: 20. Nov 2010 34 Beiträge |
#18
Nun funktioniert es tadellos ... ich danke euch allen für eure Hilfe und die vielen Tipps ...
Da ich persönlich die Berechnung des Mittelpunktes mit der 4-Punkte-Variante von Bummi etwas kompliziert finde, habe ich es dann auch nochmal mit dem von mir zuerst erdachten Lösungsweg versucht und nun klappt es dort auch ... Muss wohl an einer oder zwei Stellen mal mich vertippt haben ![]() Für diejenigen, die Interesse daran haben (vielleicht wegen einer änlichen Problemstellung) stelle ich das hier mal rein:
Delphi-Quellcode:
Danke euch allen nochmal ...
type
{ TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Image1: TImage; Image2: TImage; Image3: TImage; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure roter_Kreis(xm, ym, r, anzahl : integer); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin Image1.Picture.Loadfromfile('N:\studium_pool\MBI\praktikum 5\1sw.bmp'); // Laden der ersten Aufnahme Image2.Picture.Loadfromfile('N:\studium_pool\MBI\praktikum 5\2sw.bmp'); // Laden der zweiten Aufnahme Image1.AutoSize := True; // Größe der ersten Aufnahme automatisch festlegen Image2.AutoSize := True; // Größe der zweiten Aufnahme automatisch festlegen Button1.Caption := 'Differenzbild erzeugen'; // Beschriftung der Buttons, Labels und des Forms Button2.Caption := 'Markieren der Änderung'; Label1.Caption := '1. Aufnahme'; Label2.Caption := '2. Aufnahme (zu einem späteren Zeitpunkt)'; Form1.Caption := 'Zeitversetzte Aufnahmen vergleichen und Änderungen erkennen'; end; // Differenzbild erzeugen procedure TForm1.Button1Click(Sender: TObject); var i,j :integer; // Variablen initialisieren begin Image3.Width:=Image1.Width; // Breite für Differenzbild entspricht Aufnahme 1 Image3.Height := Image1.Height; // Höhe für Differenzbild entspricht Aufnahme 1 for i:=0 to image1.width-1 do begin for j:=0 to image1.Height-1 do begin image3.Canvas.pixels[i,j]:=$00FFFFFF and (not (image1.Canvas.pixels[i,j]-image2.Canvas.pixels[i,j])); // Erzeugen des Differenzbildes in Image3 (subtrahieren der Grauwerte) end; end; end; procedure TForm1.Button2Click(Sender: TObject); var i, j, l, k, xm, ym, x1, x2, y1, y2 : Integer; // Variablen initialisieren begin x1:=-1; // 1. FOR-Konstruktion tastet Differenzbild von oben nach unten und von links nach rechts ab, um Punkt x1 zu suchen for j:=0 to image3.Height-1 do begin for i:=1 to image3.width-1 do begin if(image3.Canvas.pixels[i,j]-image3.Canvas.pixels[i-1,j]>=10) then // Abgleich der Grauwerte begin x1 := i; // Bestimmung x1 break; end; if x1 >0 Then Break; // Sobald der Wert größer 0 ist, wird die FOR-Konstruktion verlassen end; end; x2:=-1; // 2. FOR-Konstruktion tastet Differenzbild von unten nach oben und von rechts nach links ab, um Punkt x2 zu suchen for l:=image3.height-1 downto 0 do begin for k:=image3.width-2 downto 0 do begin if(image3.Canvas.pixels[k,l]-image3.Canvas.pixels[k+1,l]>=10) then // Abgleich der Grauwerte begin x2 := k; // Bestimmung x2 break; end; if x2 > 0 Then Break; // Sobald der Wert größer 0 ist, wird die FOR-Konstruktion verlassen end; end; y1:=-1; // 3. FOR-Konstruktion tastet Differenzbild von links nach rechts und von oben nach unten ab, um Punkt y1 zu suchen for k:=0 to image3.width-1 do begin for l:=1 to image3.Height-2 do begin if(image3.Canvas.pixels[k,l]-image3.Canvas.pixels[k,l+1]>=10) then // Abgleich der Grauwerte begin y1 := l; // Bestimmung y1 break; end; if y1 > 0 Then Break; // Sobald der Wert größer 0 ist, wird die FOR-Konstruktion verlassen end; end; y2:=-1; // 4. FOR-Konstruktion tastet Differenzbild von rechts nach links und von unten nach oben ab, um Punkt x1 zu suchen for i:=image3.Width-1 downto 0 do begin for j:=image3.Height-1 downto 1 do begin if(image3.Canvas.pixels[i,j]-image3.Canvas.pixels[i,j-1]>=10) then // Abgleich der Grauwerte begin y2 := j; // Bestimmung y2 break; end; if y2 > 0 Then Break; // Sobald der Wert größer 0 ist, wird die FOR-Konstruktion verlassen end; end; xm := round(x1+((x2-x1)/2)); // Berechnung des X-Wertes für den Kreis-Mittelpunkt ym := round(y1+((y2-y1)/2)); // Berechnung des Y-Wertes für den Kreis-Mittelpunk Form1.roter_Kreis(xm, ym, 15, 40); // Aufrufen der Sub-Methode zum zeichnen der Kreise auf Image 1 und Image 2 end; // Zeichnen der Kreis mit Radius 15 aus 40 Geradenlinien im Punkt P(mx,my) procedure TForm1.roter_Kreis(xm, ym, r, anzahl : integer); var gesamtwinkel , winkelschritt : real; // Variablen initialisieren i, x, y : Integer; begin winkelschritt := ((2*PI)/anzahl); // Berechnung des Winkelschrittes gesamtwinkel := 0; // Gesamtwinkel zum Start auf 0 setzen // Kreis in der ersten Aufnahme zeichnen Image1.Canvas.Pen.Color := clRed; // Farbe: Rot Image1.Canvas.MoveTo(xm+r,ym); // Startpunkt zum zeichnen festlegen For i := 1 To anzahl do begin // Wiederholen, bis alle 40 Linien gezeichnet sind gesamtwinkel := gesamtwinkel+winkelschritt; // Winkel weiter zählen x := xm +( round(cos(gesamtwinkel) * r)); // Berechnung des x-Wertes y := ym + ( round(sin(gesamtwinkel) * r)); // Berechnung des y-Wertes Image1.Canvas.LineTo(x,y); // Zeichnen der Linie end; // Kreis in der zweiten Aufnahme zeichnen Image2.Canvas.Pen.Color := clRed; // Farbe: Rot Image2.Canvas.MoveTo(xm+r,ym); // Startpunkt zum zeichnen festlegen For i := 1 To anzahl do begin // Wiederholen, bis alle 40 Linien gezeichnet sind gesamtwinkel := gesamtwinkel+winkelschritt; // Winkel weiter zählen x := xm +( round(cos(gesamtwinkel) * r)); // Berechnung des x-Wertes y := ym + ( round(sin(gesamtwinkel) * r)); // Berechnung des y-Wertes Image2.Canvas.LineTo(x,y); // Zeichnen der Linie end; end; |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |