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);

一次获取一个像素也是使用索引的缓慢过程,以及循环中的优化。它应该提供大约十倍的性能。

您需要将位图制作成可索引的 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 回答