Bootstrap

【OpenCV-Python】:图像PSNR、SSIM、MSE计算

✨博客主页:王乐予🎈
✨年轻人要:Living for the moment(活在当下)!💪
🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法


评价一幅图像质量的好坏有多种方式,目前最常用的是 PSNR、SSIM、MSE

😺一、MSE(Mean Squared Error)均方误差

MSE是预测值f(x)与目标值y之间差值平方和的均值,公式表示为:
M S E = ∑ i = 1 n ( f ( x ) − y ) 2 n MSE=\frac{\sum_{i=1}^{n}(f(x)-y)^{2}}{n} MSE=ni=1n(f(x)y)2
对于图像来说,两个m×n单色图像I和K,如果一个为另一个的噪声近似,那么它们的均方误差定义为:
M S E = 1 m n ∑ i = 0 m − 1 ∑ j = 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 MSE=\frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}[I(i,j)-K(i,j)]^{2} MSE=mn1i=0m1j=0n1[I(i,j)K(i,j)]2
优点:MSE的函数曲线光滑、连续,处处可导,便于使用梯度下降算法,是一种常用的损失函数。而且,随着误差的减小,梯度也在减小,这有利于收敛,即使使用固定的学习速率,也能较快的收敛到最小值。

缺点:当真实值y和预测值f(x)的差值大于1时,会放大误差;而当差值小于1时,则会缩小误差,这是平方运算决定的。MSE对于较大的误差(>1)给予较大的惩罚,较小的误差(<1)给予较小的惩罚。也就是说,对离群点比较敏感,受其影响较大。

😺二、PSNR(Peak Signal-to-Noise Ratio)峰值信噪比

PSNR是通过MSE得出来的,公式如下:
P S N R = 20 l o g 10 ( M A X i M S E ) PSNR=20log_{10}(\frac{MAX_{i}}{\sqrt{MSE}}) PSNR=20log10(MSE MAXi)
log中的分子是表示图像点颜色的最大数值,如果每个采样点用8位表示,那么就是255。PSNR越大,代表着图像质量越好。

😺三、SSIM(structural similarity)结构相似性

SSIM是衡量两张图像相似度的指标,可以测量增强后的图像与真实图像之间的差异,从而指导学习过程。

假设我们输入的两张图像分别是X和Y,那么SSIM的公式表示为:
S S I M ( X , Y ) = ( 2 μ x μ y + C 1 ) ( 2 δ x y + C 2 ) ( μ x 2 μ y 2 + C 1 ) ( δ x 2 δ y 2 + C 2 ) SSIM(X,Y)=\frac{(2\mu _{x}\mu _{y}+C_{1})(2\delta _{xy}+C_{2})}{(\mu _{x}^{2}\mu _{y}^{2}+C_{1})(\delta _{x}^{2}\delta _{y}^{2}+C_{2})} SSIM(X,Y)=(μx2μy2+C1)(δx2δy2+C2)(2μxμy+C1)(2δxy+C2)
其中, μ x \mu _{x} μx μ y \mu _{y} μy分别表示X和Y的平均值; δ x 2 \delta _{x}^{2} δx2 δ x 2 \delta _{x}^{2} δx2分别表示X和Y的方差; δ x y \delta _{xy} δxy表示X和Y的协方差; C 1 C_{1} C1 C 2 C_{2} C2是为了防止分母为0的常数。

特点:
(1):SSIM具有对称性,即SSIM(x,y)=SSIM(y,x)。
(2):SSIM取值范围为[0,1],值越大表示输出图像和无失真图像的差距越小,即图像质量越好。

😺四、代码实现

我们首先需要调用库函数

from skimage.measure import compare_ssim, compare_psnr, compare_mse
**注:高版本库会去掉此API**

具体实现过程:

from skimage.measure import compare_ssim, compare_psnr, compare_mse
import cv2

img1 = cv2.imread(r'C:\Users\Wxr\Desktop\WATERLOO\train_low_high\29.jpg')
img2 = cv2.imread(r'C:\Users\Wxr\Desktop\WATERLOO\train_normal\29.jpg')

psnr = compare_psnr(img1, img2)
ssim = compare_ssim(img1, img2, multichannel=True)  # 对于多通道图像(RGB、HSV等)关键词multichannel要设置为True
mse = compare_mse(img1, img2)

print('PSNR:{},SSIM:{},MSE:{}'.format(psnr, ssim, mse))

图像取两张不同照度的,如下:
在这里插入图片描述在这里插入图片描述
结果:

PSNR:10.178388169399849,SSIM:0.5946874827656982,MSE:6240.818379720052
;