2

私は2つの画像(オリジナルとノイズ)を持っています。PSNRを計算しています。私はカラーRGB画像に対してちょっとやったのですが、グレースケールでそれを行う方法がわかりません。私が読んだように、MSEの計算は異なります。RGB の場合、次のコードでわかるように実行しています (Visual C# を使用しています)。

for (int i = 0; i < bmp1.Width; i++)
            {
                for (int j = 0; j < bmp1.Height; j++)
                {
                    mseR += Math.Pow(bmp1.GetPixel(i, j).R - bmp2.GetPixel(i, j).R, 2);
                    mseG += Math.Pow(bmp1.GetPixel(i, j).G - bmp2.GetPixel(i, j).G, 2);
                    mseB += Math.Pow(bmp1.GetPixel(i, j).B - bmp2.GetPixel(i, j).B, 2);

                }
            }
      mse = (mseR + mseG + mseB) / ((bmp1.Width * bmp1.Height) * 3);

ここでは、ピクセルの R、G、B で操作しています。しかし、グレースケール画像の場合はどうすればよいかわかりません。実際にいくつかの結果が得られるため、RGBも使用できますか、それとも別のものを使用する必要がありますか?

4

1 に答える 1

1

グレースケールを作成するには、画像を平均から外します (実装を変更する必要はありません)。あなたの画像は bmp1 = grayImage および bmp2 = ノイズの多い画像であると想定しています。

for (int i = 0; i < bmp1.Width; i++)
{
    for (int j = 0; j < bmp1.Height; j++)
    {
        // As a grayscale image has rthe same color on all RGB just pick one
        int gray1 = bmp1.GetPixel(i, j).R;
        int gray2 = bmp2.GetPixel(i, j).R;
        double sum = Math.Pow(gray1 - gray2, 2)
        mseGray += sum;
    }
}
mse = (mseGray) / ((bmp1.Width * bmp1.Height) * 3);

また、一度に 1 つずつピクセルを取得することは、インデックスを使用するための遅いプロセスであり、ループ内で最適化されます。約 10 倍のパフォーマンスが得られるはずです。

ビットマップをインデックス可能な img にする必要があります。この例では BitmapSource を想定しています。興味深い部分は、ループとインデックスの構築であり、プリコードではありません。プリコードは、画像をインデックス可能にするためのものです。

var height = bmp1.Height;
var width = bmp1.Width;
var pixelBytes1 = new byte[height * width * 4];
var pixelBytes2 = new byte[height * width * 4];
bmp1.CopyPixels(pixelBytes1, stride, 0);
bmp2.CopyPixels(pixelBytes2, stride, 0);

for (int x = 0; x < width; x++)
{
    int woff = x * height;
    for (int y = 0; y < height; y++)
    {(R*0.3 + G*0.59+ B*0.11)
        int index = woff + y;
        int gray1 = bmp1[index];
        int gray2 = bmp2[index];
        double sum = Math.Pow(gray1 - gray2, 2)
        mseGray += sum;
    }
}
mse = (mseGray) / ((bmp1.Width * bmp1.Height) * 3);

編集:

http://www.mathworks.com/matlabcentral/answers/49906-how-to-calculate-psnr-of-compressed-images-and-how-to-compare-psnr-of-images-compressed-by-two-差分

PSNR の実装に問題がありますが、定義ごとではないと考えていますが、Java の例です (C# に非常に似ています) http://www.cyut.edu.tw/~yltang/program/Psnr.java

于 2015-03-08T10:24:24.887 に答える