基于Python——图像PSNR、SSIM、MSE计算

评价一幅图像质量的好坏有多种方式,目前最常用的是PSNR、SSIM、MSE。接下来我们具体讲解。

1. 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=n∑i=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=mn1​i=0∑m−1​j=0∑n−1​[I(i,j)−K(i,j)]2
优点:MSE的函数曲线光滑、连续,处处可导,便于使用梯度下降算法,是一种常用的损失函数。而且,随着误差的减小,梯度也在减小,这有利于收敛,即使使用固定的学习速率,也能较快的收敛到最小值。

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

2. 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越大,代表着图像质量越好。

3.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],值越大表示输出图像和无失真图像的差距越小,即图像质量越好。

4.代码实现

我们首先需要调用库函数

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
上一篇:Linux并发与同步


下一篇:加速度传感器 计算