Einzelnen Beitrag anzeigen

hamptoncourt

Registriert seit: 20. Nov 2010
34 Beiträge
 
#18

AW: Bildbearbeitung - Astronomie-Aufgabe

  Alt 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 ...
  Mit Zitat antworten Zitat