2つの画像をSAD(二乗和の和)と呼ばれる比較関数と比較しようとしていますが、各画像からブロックを取り、ピクセルをグレースケールに変換してI比較を行う。 しかし、問題は、2つの同一のブロックを比較すると、sadの結果は0ではない(したがって違いがある)ということです。私は、複数のメッセージボックスで確認してから、私はプログラムは画素に対して間違った色を返すことを見た:例えば、黒画素= 255の代わりに、0画像のピクセルの色が正しくない
ここに私の比較関数のコード:
public double SAD(bloc Bc, bloc Br)
{
double sad = 0;
{
BitmapData bmp = image1.LockBits(new Rectangle(Bc.x, Bc.y, taille_bloc, taille_bloc), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
BitmapData bmp2 = image2.LockBits(new Rectangle(Br.x, Br.y, taille_bloc, taille_bloc), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptr2 = bmp2.Scan0;
IntPtr ptr = bmp.Scan0;
int bytes = bmp.Width * bmp.Height * 3;
double gris1, gris2;
byte[] rgb = new byte[bytes];
byte[] rgb2 = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgb, 0, bytes);
System.Runtime.InteropServices.Marshal.Copy(ptr2, rgb2, 0, bytes);
for (int i = 0; i < rgb.Length; i += 3)
{
gris1 = rgb[i] * 0.2989 + rgb[i+1] * 0.5870 + rgb[i+2] * 0.1140;
gris2 = rgb2[i] * 0.2989 + rgb2[i + 1] * 0.5870 + rgb2[i + 2] * 0.1140;
sad = sad + Math.Abs(gris2 - gris1);
}
image2.UnlockBits(bmp2);
image1.UnlockBits(bmp);
}
return sad;
}
をした場合、私は私は
を再定式ます教えてください私の説明で明らかにすることはなかった、あなたの助けを事前にどうもありがとうございました:)
画像が同一であることを確認してください。同一の画像を比較している場合、同一の計算で同じ結果が得られるはずです。多分、共通部分を関数に抽象化して、各画像/ピクセルについてそれを呼び出すのでしょうか? – Oded
短く、自己完結型のコンパイル可能なサンプル(http://sscce.org/を参照)を提供して、迅速に実行して手助けをすることができますか?入力したものには、タイプと変数がありません。 – Abbas
まず、私はこれを平方差の合計を計算するものとしては見ません。差の合計を計算しているようです。 –