二つの画像の引き算をして再び画像化するには?

解決


チャーリー  2009-05-27 05:51:58  No: 34526

はじめまして、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;


KHE00221  2009-05-27 12:53:06  No: 34527

とりあえず

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;


チャーリー  2009-06-10 22:18:05  No: 34528

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さんをはじめ、僕の問題を考えてくれたみなさん、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加