(超详细)实现计算图片相似度MSE和PSNR

这是本菜鸡在《信息隐藏》这门选修课中遇到的其中一个问题,在网络上找到的绝大部分实现都是直接调库啊啥的,而且就MSE和PSNR的理论公式中的数值表达都没有一个具体的定义,导致我想自己动手实现就无从下手,反正我在国内的帖子翻了个遍是没找到,最后在国外的Overstatckflow论坛上看到一个较为清楚的定义说明,下面会介绍到


图片相似度介绍

计算图像变化后的质量,最直接的思路即比较degrade后的图像与真实图像(distortion-free)之间的差剖面,即可视误差,通过视觉感官评价图像质量。
而PSNR 和 MSE 就是基于简单直接的思路确定的指标
本程序以C#语言实现,想要自己通过其他语言实现的小伙伴也是可以借鉴一下的,下面对计算公式的参数有具体的说明

一、MSE介绍

MSE(Mean Squared Error),均方误差,各测量值误差的平方和的平均值的平方根。

二、PSNR介绍

PSNR(Peak Signal to Noise Ratio),峰值信噪比,是一种评价图像的客观标准,最广泛使用的评鉴画质的客观量测法,不过许多实验结果都显示,PSNR的分数无法和人眼看到的视觉品质完全一致,有可能PSNR较高者看起来反而比PSNR较低者差。这是因为人眼的视觉对于误差的敏感度并不是绝对的,其感知结果会受到许多因素的影响而产生变化(例如:人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响)

三、具体实现

在介绍具体实现前,有必要了解一下他们的具体数学公式,

1.MSE公式

在这里插入图片描述

2.PSNR公式

在这里插入图片描述

3.参数介绍

其中,M,N分别表示图像的
MAXi:代表图像中像素的最大灰度值,一般采用255,即2^8-1
可以明显地看到,PSNR其实是MSE的线性转化,计算出MSE那么PSNR也就出来了
当看到I(i,j)和K(i,j)的时候我很纳闷这代表什么含义,国内的些帖子上有的介绍是图片指定坐标位置的像素,有的干脆直接说是图片。
我们都知道计算机处理图片的时候是将一个图片表示为矩阵,而每个小矩阵中的颜色对应一个数字,较大的数字代表较深的颜色,而RGB(以24bpp为例)还另外分三通道,每个通道的分量值都是如此
在这里插入图片描述

那么,式子中的I(i,j)和K(i,j)具体代表什么含义呢?
Overstackflow论坛上的一个大佬是这么说的:

  1. Start with red channel
  2. Compute the difference between each pixel’s gray level value in the two image’s red channels pixel-by-pixel (redA(0,0)-redB(0,0) etc for all pixel locations.
  3. Square the differences of every one of those pixels (redA(0,0)-redB(0,0)^2
  4. Compute the sum of the squared difference for all pixels in the red channel
  5. Repeat above for the green and blue channels
  6. Add the 3 sums together and divide by 3, i.e, (redsum+greensum+bluesum)/3
  7. Divide by the area of the image (WidthHeight) to form the mean or average, i.e., (redsum+greensum+bluesum)/(3Width*Height) = MSE

根据它的描述,公式中I(k,j)的定义即是图片中(i,j)所在像素中的红、蓝、绿三组颜色通道各自对应的分量灰度值的差的平方之和再除以3,我整理的公式如下
在这里插入图片描述

4.核心代码实现

MSE:

 public double Red_Gray(Bitmap a,Bitmap b, int i, int j)
        {
           return  Math.Pow(Convert.ToDouble(a.GetPixel(i, j).R) 
               -Convert.ToDouble(b.GetPixel(i, j).R),2);
        }
        public double Blue_Gray(Bitmap a, Bitmap b, int i, int j)
        {
            return Math.Pow(Convert.ToDouble(a.GetPixel(i, j).B)
                - Convert.ToDouble(b.GetPixel(i, j).B), 2);
        }
        public double Green_Gray(Bitmap a, Bitmap b, int i, int j)
        {
            return Math.Pow(Convert.ToDouble(a.GetPixel(i, j).G)
                - Convert.ToDouble(b.GetPixel(i, j).G), 2);
        }
        public double MSE(Bitmap a,Bitmap b)
        {
            int M = a.Height;
            int N = a.Width;
            double temp_Red=0;
            double temp_Blue = 0;
            double temp_Green = 0;
            for (int i=0;i<N;i++)
            {
                for(int j=0;j<M;j++)
                {
                    temp_Red +=Red_Gray(a, b, i, j);
                    temp_Blue +=Blue_Gray(a, b, i, j);
                    temp_Green +=Green_Gray(a, b, i, j);
                }
            }
            return (temp_Blue+temp_Green+temp_Red)/(M * N*3);
        }

PSNR:

  public double PSNR(Bitmap a, Bitmap b)
        {
            return (20*Math.Log10(255)-10*Math.Log10(MSE(a,b)));
        }

其实问题的关键就是对式子中I(i,j)和K(i,j)的数值处理上

5.演示界面

我通过三种图片处理的效果进行了分析
噪声处理:
在这里插入图片描述
模糊处理:

在这里插入图片描述

拉普拉斯锐化:

在这里插入图片描述

表格分析:
在这里插入图片描述

参考资料

https://stackoverflow.com/questions/20271479/what-does-it-mean-to-get-the-mse-mean-error-squared-for-2-images


四、总结

根据表格中对结果的汇总,不难看出MSE和图片相似度的变化成正比,前后图片差距越大MSE的值越高,而PSNR与之相反,图片差距越大PSNR的值反而越小。

如果在作业上或者其他方面上帮到您的话不妨点个赞吧

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PSNR(Peak Signal-to-Noise Ratio)和SSIM(Structural Similarity Index)是用来衡量两幅图像之间相似度的指标。 PSNR是使用峰值信噪比来度量图像质量的一种方法。它使用均方误差(MSE)来衡量两幅图像之间的差异,MSE越小代表图像之间的差异越小,相似度越高。PSNR计算公式为: PSNR = 10 * log10((255^2) / MSE) 其中255是像素值的最大可能值,MSE为两幅图像像素之间差值的平方和的平均值。 SSIM是一种结构相似性指数,它不仅考虑了亮度的差异,还考虑了对比度和结构的差异。SSIM计算公式为: SSIM = (2 * μx * μy + c1) * (2 * σxy + c2) / ((μx^2 + μy^2 + c1) * (σx^2 + σy^2 + c2)) 其中μx和μy分别是两幅图像的平均值,σx^2和σy^2分别是两幅图像的方差,σxy是两幅图像的协方差,c1和c2是预定义的常数,用来避免分母为零的情况。 在MATLAB中,可以使用相关函数来计算PSNR和SSIM。比如,使用函数`imread`读取两幅图像,然后使用函数`imresize`来确保图像的大小一致,再使用函数`psnr`来计算PSNR,使用函数`ssim`来计算SSIM。 示例代码如下: ```matlab image1 = imread('image1.jpg'); image2 = imread('image2.jpg'); image1 = imresize(image1, size(image2)); % 确保图像大小一致 psnrValue = psnr(image1, image2); ssimValue = ssim(image1, image2); ``` 以上代码读取了两幅图像,并将它们的大小调整为一致,然后分别计算PSNR和SSIM的值。 希望以上内容对您有所帮助。 ### 回答2: 图像相似度PSNR(Peak Signal-to-Noise Ratio)和SSIM(Structural Similarity Index)是常用于评估图像质量的指标,用于度量两幅图像之间的相似程度。以下是使用Matlab实现这两种相似度指标的方法: 1. PSNR实现PSNR是通过比较原始图像和重建图像的均方误差来评估图像质量的。在Matlab中,可以使用以下代码计算PSNR: ```matlab % 读取原始图像和重建图像 originalImage = imread('原始图像路径'); reconstructedImage = imread('重建图像路径'); % 计算MSE(均方误差) mse = sum(sum((double(originalImage) - double(reconstructedImage)).^2)) / (numel(originalImage)); % 计算PSNR psnr = 10 * log10((255^2) / mse); ``` 2. SSIM实现: SSIM通过比较原始图像和重建图像的亮度、对比度和结构相似性来评估图像质量的。在Matlab中,可以使用以下代码计算SSIM: ```matlab % 读取原始图像和重建图像 originalImage = imread('原始图像路径'); reconstructedImage = imread('重建图像路径'); % 计算SSIM [ssimValue, ~] = ssim(originalImage, reconstructedImage); ``` 需要注意的是,上述代码中的图像路径需要根据实际情况进行修改,同时保证原始图像和重建图像具有相同的大小。 这样就可以使用Matlab来实现图像相似度PSNR和SSIM的计算了。 ### 回答3: 图像相似度是用来衡量两幅图像之间的相似程度的一种指标。PSNR(Peak Signal-to-Noise Ratio)和SSIM(Structural Similarity Index)是常用的图像相似度评价方法。在Matlab中,可以通过以下步骤实现这两种方法的计算。 首先,对于PSNR,可以通过以下几个步骤实现: 1. 使用imread函数读取待比较的两幅图像,分别命名为img1和img2。 2. 使用im2double函数将图像转换为double类型的数据,并将像素值缩放到0-1范围内。 3. 计算两幅图像的均方误差(MSE),可以通过以下代码实现mse = sum(sum((img1 - img2).^2)) / numel(img1); 其中,.^2表示对每个元素进行平方运算,numel函数用于计算图像的像素总数。 4. 计算PSNR值,使用以下代码实现psnr = 10 * log10(1^2 / mse); 其中,1表示图像的最大像素值。 其次,对于SSIM,可以通过以下几个步骤实现: 1. 使用ssim函数计算两幅图像的SSIM指数,可以通过以下代码实现: ssim_val = ssim(img1, img2); 其中,img1和img2为待比较的两幅图像。 2. 处理ssim_val的输出结果。 通过以上步骤,我们可以得到两幅图像之间的PSNR和SSIM值。这些值越高,表示两幅图像的相似度越高。需要注意的是,这两种方法都只能用于评价图像在感知上的相似度,并不能完全代替人眼对图像的主观判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值