Autor Beitrag
lemignonraoul
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 08.12.10 22:32 
Hallo Leute,
hab ein kleines Problem.Das ist die Problemstellung:
"Sie sollen, aus dem Differenzbild den mittleren Mittelpunkt der flächigen Änderung berechnen, falls eine Ändeung zwischen beiden Bildern vorhanden ist. Das machen Sie indem Sie sich in vier verschiedenen FOR-Konstuktionen (es gibt nur eine Änderung) von oben, unten, links und rechts vom Bildrand nähern bis Sie eine Abweichung im Grauwert >=10 ermitteln (dieser Wert, damit Sie über dem "Grundrauschen" liegen). Jede Schleife die durchlaufen wird, kann mit "break" beendet werden. Doppelschleifen, die beendet werden erfordern ein weiteres "break" für die äusssere Schleife. Der Mittelpunkt der Abweichung auf dem Himmelsbild ergibt sich aus den 4 Koordinaten, die Sie aus den vier Durchläufen ermittelt haben."

das hab ich gemacht aber es läuft nicht.Seit fast 6 Tage versuche ich das Programm zu schreiben aber ohne erfolgt.Kann jemand mir helfen?
das hab ich schon gemacht:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
 var i,j,k,l,ymax,ymin,xmax,xmin,X,Y,r:integer;
begin
ymax:=0;
      for i:=0 to image3.width-1 do
      for j:=1 to image3.Height-1 do
          begin
          ymax:=j;
           if(image3.Canvas.pixels[i,j]-image3.Canvas.pixels[i,j-1]>10then break;
          end;

           //else image3.Canvas.Pixels[i,j]:=clred;

for j:=0 to image3.Height-1 do
      for i:=1 to image3.width-1 do
           if(image3.Canvas.pixels[i,j]-image3.Canvas.pixels[i-1,j]>10then break;


xmin:=i;

        for k:=image3.width-1 to 0 do
        for l:=image3.Height-2 to 0 do
           if(image3.Canvas.pixels[k,l]-image3.Canvas.pixels[k,l+1]>10then break;

ymin:=l;

        for l:=image3.Height-1 to 0 do
        for k:=image3.width-2 to 0 do
           if(image3.Canvas.pixels[k,l]-image3.Canvas.pixels[k+1,l]>10then break;

xmax:=k;

    X:=Round((xmax-xmin)/2);
    Y:=Round((ymax-ymin)/2);
  r:=15;
  for i:=1 to 180 do
    image3.Canvas.pixels[X+Round(r*cos(i*pi/180)),Y+Round(r*sin(i*pi/180))]:=clred;
   for j:=1 to 180 do
     image3.Canvas.Pixels[X-Round(r*cos(j*pi/180)),Y-Round(r*sin(j*pi/180))]:=clred;
end;

end.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconMartok: Topic aus Sonstiges (Delphi) verschoben am Do 09.12.2010 um 07:02
Quake User
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Do 09.12.10 03:12 
1. Das Problem (Aufgabe) ist nicht hinreichend beschrieben:
"aus dem Differenzbild den mittleren Mittelpunkt der flächigen Änderung berechnen" ?
Konkretisiere das.

2. Warum verlässt Du mit BREAK die Procedur? Wenn eine Differenz ermittelt wird, sollte die Funktion diese doch sicher zurückgeben. Was machst Du denn nach dem Break. Hier fehlt uns Dein Code. Momentan beendest Du den Programmablauf, wenn eine Differenz > 10 ermittelt wird. Sieh Dir mal die Hilfe zu Break an.

3. Für mich klingt die Aufgabe so, als ob Du als Erstes das Differenzbild ermitteln sollst. Du berechnest also aus Bild1 und Bild2 dann Bild3. Aber wo erstellst Du denn Bild3? In Bild3 könntest Du dann den "Mittelpunkt der flächigen Änderung" berechnen. (was auch immer das ist)
lemignonraoul Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 09.12.10 09:39 
das ist die Aufgabe:

Die beiden Bitmap-Bilder laden Sie mit "pictures.loadfromfile". Die Ausschnittbilder werden passend übereinandergelegt und die Grauwerte voneinander subtrahiert. (Sie nehmen an, dass es nur 256 Grauwerte gibt, die man unterscheiden kann) Sie subtrahieren also nur die Rotwerte für ein Differenzbild. Das Differenzbild ergibt mögliche Änderungen und soll im Image3 ausgegeben werden. Sie sollen, aus dem Differenzbild den mittleren Mittelpunkt der flächigen Änderung berechnen, falls eine Ändeung zwischen beiden Bildern vorhanden ist. Das machen Sie indem Sie sich in vier verschiedenen FOR-Konstuktionen (es gibt nur eine Änderung) von oben, unten, links und rechts vom Bildrand nähern bis Sie eine Abweichung im Grauwert >=10 ermitteln (dieser Wert, damit Sie über dem "Grundrauschen" liegen). Jede Schleife die durchlaufen wird, kann mit "break" beendet werden. Doppelschleifen, die beendet werden erfordern ein weiteres "break" für die äusssere Schleife. Der Mittelpunkt der Abweichung auf dem Himmelsbild ergibt sich aus den 4 Koordinaten, die Sie aus den vier Durchläufen ermittelt haben. Um diesen Mittelpunkt der Änderung ist auf beiden Originalbildern ein Kreis mit Radius 15 um die Änderung zeichnen, indem Sie "roter_Kreis" benutzen.

und so hab ich versucht zu lösen:
var i,j,Xm,Ym,r:integer;
begin

image1.Picture.LoadFromFile('1sw.bmp');
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j,Xm,Ym,r:integer;
begin

image2.Picture.LoadFromFile('2sw.bmp');
end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j :integer;
begin
for i:=0 to image1.width-1 do
for j:=0 to image1.Height-1 do
image3.Canvas.pixels[i,j]:=$00FFFFFF and (not (image1.Canvas.pixels[i,j]-image2.Canvas.pixels[i,j]));
end;

procedure TForm1.Button4Click(Sender: TObject);
var i,j,k,l,ymax,ymin,xmax,xmin,X,Y,r:integer;
begin
ymax:=0;
for i:=0 to image3.width-1 do for j:=1 to image3.Height-1 do
begin
ymax:=j;
if(image3.Canvas.pixels[i,j]-image3.Canvas.pixels[i,j-1]>10) then break;
end;

//else image3.Canvas.Pixels[i,j]:=clred;

for j:=0 to image3.Height-1 do
for i:=1 to image3.width-1 do
if(image3.Canvas.pixels[i,j]-image3.Canvas.pixels[i-1,j]>10) then break;

xmin:=i;

for k:=image3.width-1 to 0 do
for l:=image3.Height-2 to 0 do
if(image3.Canvas.pixels[k,l]-image3.Canvas.pixels[k,l+1]>10) then break;

ymin:=l;

for l:=image3.Height-1 to 0 do
for k:=image3.width-2 to 0 do
if(image3.Canvas.pixels[k,l]-image3.Canvas.pixels[k+1,l]>10) then break;

xmax:=k;

X:=Round((xmax-xmin)/2);
Y:=Round((ymax-ymin)/2);
r:=15;
for i:=1 to 180 do
image3.Canvas.pixels[X+Round(r*cos(i*pi/180)),Y+Round(r*sin(i*pi/180))]:=clred;
for j:=1 to 180 do
image3.Canvas.Pixels[X-Round(r*cos(j*pi/180)),Y-Round(r*sin(j*pi/180))]:=clred;
end;
end.

Der erste Teil läuft gut(das hochladen den beiden bildern und dann das differenzbild.Meine Frage ist Wie berechne ich die koordinaten von dam differenzbild(es ist so eine flecke)??
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 09.12.10 09:58 
Hallo!

Bitte verwende für Quellcode die entsprechenden [delphi]-Tags, dann wird er "schöner" dargestellt als im Fließtext. Beispiel:
ausblenden Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG68b8041b09cafc647f435d2280a32660}</span></span>					

Wird:
ausblenden Delphi-Quelltext
1:
var Test: integer;					


Einfach oben bei Deinem Beitrag auf user defined image oder user defined image klicken und ändern. Danke Dir!

Viele Grüße,
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Quake User
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 159



BeitragVerfasst: Mi 15.12.10 03:14 
Du hast die Aufgabe immer noch nicht vollständig beschrieben. Zur Lösung:

1. sind die Bilder in 256 Graustufen oder bunt? Sollten Sie bunt sein (R,G,B), dann müssen die 3 Fraben erst noch in einen Grauwert umgerechnet werden

2. Bei 16 oder 32 Bit Farbtiefe musst Du dann erst noch den Grauwert auf 8 Bit reduzieren.

3. "Sie subtrahieren also nur die Rotwerte für ein Differenzbild" Das verstehe ich nicht. Oben war von Grauwerten die Rede. Grauwerte sind eine Mischung aller 3 Farben.

4. Du erstellst dann das Differenzbild (image3). Dann sollst Du scheinbar "spiralförmig" die Pixel prüfen, ob ihr Wert größer als 10 ist.

5. Was ist ein "mittlerer Mittelpunkt"?

6. Warum Du eine Schleife mit BREAK verlassen solltest ist mir nicht klar. Du könntest ja in Folge 5 Werte > 10 finden. Bspw.: 11; 13; 15; 11; 67;
Warum solltest Du da bei 11 abbrechen. Für die Mittelpunktberechnung wäre dann 67 irrelevant???

7. Hier fehlen BEGIN und END
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
for i:=0 to image3.width-1 do begin
  for j:=1 to image3.Height-1 do begin
    ymax:=j;
    if(image3.Canvas.pixels[i,j]-image3.Canvas.pixels[i,j-1]>10then break;
  end;
end;


8. Aus den Punkten mit einer Abweichung > 10 sollt Du dann den Mittelpunkt errechnen und daraus einen Kreis zeichnen.

Wie weit kommst Du genau (1.-8.) und wo liegen Deine Probleme? Was funktioniert bei Dir (1.-8.)? Kannst Du meine Fragen zur Aufgabe beantworten?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.12.10 07:23 
user profile iconQuake User hat folgendes geschrieben Zum zitierten Posting springen:
Grauwerte sind eine Mischung aller 3 Farben.
Genau, aber die drei Farbwerte stimmen bei "echten" Grautönen überein. ;-)