Registriert seit: 20. Nov 2010
34 Beiträge
|
AW: Bildbearbeitung - Astronomie-Aufgabe
20. Dez 2010, 03:59
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:
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;
Danke euch allen nochmal ...
|