はじめまして、delphiが全くの初心者のチャーリーです。
さっそくなのですが質問です。
僕は違う画像を二つ表示して、それぞれのRGBの輝度値を取り出し、この輝度値の対数の差を求めて、これを基に再び画像化させるソフトを作ろうとしています。
しかし、このコードで画像化すると画面が黒くなります。ほかにincという関数を使ったのですが、今度は逆に画面が白くなってしまいました。最初の二つの画像に問題があるのかといろいろ試してみたのですが、そうではないようです。
つくったコードをのせますので、何か気づかれましたら回答をお願いします。今は画像が白黒なのでRの輝度値だけで計算しております。
var
R,G,B,cR,cG,cB: array[0..639,0..511] of byte;
X,Y :word;
buff,buff2: double;
begin
buff2:=0;
for X:=0 to 639 do
for Y:=0 to 511 do
begin
R[X,Y]:=GetRvalue(Image1.Canvas.Pixels[X,Y]);
cR[X,Y]:=GetRvalue(Image2.Canvas.Pixels[X,Y]);
if R[x,y]=0 then buff:=0
else if cR[x,y]=0 then buff:=log10(R[x,y])
else buff:=Log10(R[X,Y])-Log10(cR[X,Y]);
if buff>buff2 then buff2:=buff;
end;
for X:=0 to 639 do
for Y:=0 to 511 do
begin
if R[x,y]=0 then buff:=0
else if cR[x,y]=0 then buff:=(log10(R[x,y])) /buff2*255
else if buff>0 then buff:=(Log10(R[X,Y])-Log10(cR [X,Y]))/buff2*255
else if buff<0 then buff:=0;
Image3.Canvas.Pixels[x,y]:=RGB(Trunc(buff),Trunc(buff),Trunc (buff));
end;
end;
とりあえず
type
TRGB = packed record //ScanLine用
Red : Byte;
Green : Byte;
Blue : Byte;
end;
PRGBArray = ^TRGBarray;
TRGBArray = array[0..0] of TRGB;
procedure TForm1.Button1Click(Sender: TObject);
var
X,Y: Integer;
RGB1,RGB2,RGB3 : pRGBArray;
begin
//24bit にする
Image1.Picture.Bitmap.PixelFormat := pf24bit;
Image2.Picture.Bitmap.PixelFormat := pf24bit;
Image3.Picture.Bitmap.PixelFormat := pf24bit;
//Image2 と Image3 を Image1 と同じサイズにする
Image2.Picture.Bitmap.SetSize(Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height);
Image3.Picture.Bitmap.SetSize(Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height);
for Y:=0 to Image1.Picture.Bitmap.Height -1 do
begin
RGB1 := Image1.Picture.Bitmap.ScanLine[Y];
RGB2 := Image2.Picture.Bitmap.ScanLine[Y];
RGB3 := Image3.Picture.Bitmap.ScanLine[Y];
for X:=0 to Image1.Picture.Bitmap.Width - 1 do
begin
RGB3[X].Red := ABS(RGB1[X].Red - RGB2[X].Red );
RGB3[X].Green := ABS(RGB1[X].Green - RGB2[X].Green);
RGB3[X].Blue := ABS(RGB1[X].Blue - RGB2[X].Blue );
end;
end;
end;
KHE00221さん、アドバイスありがとうございます。
いろいろ検討した結果、以下のコードで解決できました。
var
R,G,B,cR,cG,cB: array[0..639,0..511] of byte;
dR,dG,dB:array[0..639,0..511] of double ;
procedure TForm1.Button3Click(Sender: TObject);
var
X,Y :word;
Rmax,Gmax,Bmax:byte;
buff,buff2: double;
buff2:=0;
for X:=0 to 639 do
for Y:=0 to 511 do
begin
R[X,Y]:=GetRvalue(Image1.Canvas.Pixels[X,Y]);
cR[X,Y]:=GetRvalue(Image2.Canvas.Pixels[X,Y]);
if R[x,y]=0 then buff:=0
else if cR[x,y]=0 then buff:=log10(R[x,y])
else buff:=Log10(R[X,Y])-Log10(cR[X,Y]);
if buff>Z then buff:=Z;
if buff>buff2 then buff2:=buff;
end;
for X:=0 to 639 do
for Y:=0 to 511 do
begin
if R[x,y]=0 then buff:=0
else if cR[x,y]=0 then buff:=(log10(R[x,y]))/buff2*255
else if cR[x,y]>R[x,y] then buff:=0
else buff:=(Log10(R[X,Y])-Log10(cR[X,Y]))/buff2*255;
Image3.Canvas.Pixels[x,y]:=RGB(Trunc(buff),Trunc(buff),Trunc(buff));
end;
end;
KHE00221さんをはじめ、僕の問題を考えてくれたみなさん、ありがとうございました。
ツイート | ![]() |