![]() |
Pixelvalues in einem Kreis lesen
Hallo alle Miteinander!
Ich versuche gerade mir die Pixelwerte in einem Graustufenbild anzeigen zu lassen und zwar nur diejenigen die von einem Kreis umschlossen sind. An die Werte zu bekommen ist ja mittels Scanline kein Problem, doch wie mache ich Delphi jetzt klar, dass ich nur die Werte aus dem Kreis will? Ich habe da mal ein bischen in der Mathematik geschnüffelt und folgendes gefunden:
Delphi-Quellcode:
Das stammt alles von der Formel y=y0 +- sqrt(r²-(x-x0)²)! XYWerte ist ein Array vom Typ wordbool und der Array pixelwerte vom Typ integer gefüllt mit den Werten der einzelnen Pixel.
procedure tkreis.kreisroi;
var help,help2,i,j,yobererhalbkreis,yuntererhalbkreis: integer; begin setlength(xywerte,breite,hoehe); for i:=0 to breite-1 do for j:=0 to hoehe-1 do xywerte[i,j]:=true; for i:=0 to breite-1 do begin help:= sqr(rd)-sqr(i-x); if help>0 then begin help2:=round(sqrt(help)); yobererhalbkreis:=y+help2; yuntererhalbkreis:=y-help2; for j:=0 to hoehe-1 do begin if j<=yobererhalbkreis then if j>=yobererhalbkreis then xywerte[i,j]:=false; end; end; end; for i:=0 to breite-1 do for j:=0 to hoehe-1 do if xywerte[i,j]=true then begin zahler:= zahler+pixelwerte[i,j]; end; end; Ich bekomme als Ergebniss aber immer nur Null. Freue mich über jeden Tip oder Alternativen, die mich davon abhalten meinen Computer zu verhackstücken. gruß Brandtson |
Re: Pixelvalues in einem Kreis lesen
Hallo brandtson,
wenn ich das Problem angehen würde, würde ich es mit dem Satz von Pythagoras machen. Angenommen du willst überprüfen, ob der Punkt (x,y) im Kreis um den Punkt (mx,my) mit Radius r liegt, dann gilt:
Code:
Darüberhinaus kann man beide seiten Quadrieren, denn beide sollten positiv sein, dann kann man folgendes benutzen:
sqrt(sqr(mx-x)+sqr(my-y))<r
Code:
Das zweite ist wahrscheinlich ein kleinerer Rechenaufwand.
(sqr(mx-x)+sqr(my-y))<sqr(r)
So kannst du jeden Pixel überprüfen, ob er im gegebenen Kreis liegt. Noch ein Hinweis zu deinem Code: Statt
Delphi-Quellcode:
würde auch folgendes reichen:
if xywerte[i,j]=true then
Delphi-Quellcode:
-> Siehe Datentyp Boolean
if xywerte[i,j] then
Grüße Seniman |
Re: Pixelvalues in einem Kreis lesen
Hi Seniman,
danke für deinen guten Ratschlag! Jetzt klappts, die Source ist auch um einiges kürzer geworden.
Delphi-Quellcode:
gruß brandtson
procedure tkreis.kreisroi2;
var mx,my: integer; begin pixelcount:= 0; setlength(xywerte,breite,hoehe); for mx:=0 to breite-1 do for my:=0 to hoehe-1 do begin if (sqr(mx-x)+sqr(my-y))<sqr(rd) then begin xywerte[mx,my]:=true; zahler:=zahler+pixelwerte[mx,my]; pixelcount:= pixelcount+1; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz