评价一幅图像质量的好坏有多种方式,目前最常用的是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=mn1i=0∑m−1j=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