图像质量评价指标之 PSNR 和 SSIM

1.PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比

概念: PSNR(PeakSignaltoNoiseRatio) 峰值信噪比,是信号最大功率与信号噪声功率之比。

通常使用PSNR来测量已经被压缩的重构图像的质量。每个图片元素(像素)都有一个颜色值,当图像被压缩,然后解压缩时,颜色值可以改变。信号可以具有很宽的动态范围,所以PSNR通常以分贝(dB)表示。
PSNR是最普遍,最广泛使用的评鉴画质的客观量测法,不过许多实验结果都显示,PSNR的分数无法和人眼看到的视觉品质完全一致,有可能PSNR较高者看起来反而比PSNR较低者差。这是因为人眼的视觉对于误差的敏感度并不是绝对的,其感知结果会受到许多因素的影响而产生变化(例如:人眼对空间频率较低的对比差异敏感度较高,人眼对亮度差异的敏感度比对色度的敏感度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响,甚至在一些特定的环境中会产生视觉被欺骗的效果)。
两个图像之间PSNR值越大,则越相似。图像压缩中典型的峰值信噪比值在 30 到 40dB 之间。普遍基准为30dB,30dB以下的图像劣化较为明显。

计算: 给定一个大小为 m×n 的干净图像 I 和噪声图像 K,均方误差 (MSE) 定义为:
1 m n ∑ i = 0 m − 1 ∑ j = 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 \frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}[I(i,j) - K(i,j)]^{2} mn1i=0m1j=0n1[I(i,j)K(i,j)]2
然后 PSNR(dB) 就定义为:
P S N R = 10 ∗ log ⁡ 10 ( M A X I 2 M S E ) PSNR=10*\log_{10}(\frac{MAX_I^{2}}{MSE}) PSNR=10log10(MSEMAXI2)
其中 M A X I MAX_I MAXI为图片可能的最大像素值。如果每个像素都由 8 位二进制来表示,那么就为 255。通常,如果像素值由 B 位二进制来表示,那么 M A X I = 2 B − 1 MAX_I=2^B−1 MAXI=2B1。这是针对灰度图像的计算方法,如果是彩色图像,通常有三种方法来计算。

  1. 分别计算 RGB 三个通道的 PSNR,然后取平均值。
  2. 计算 RGB 三通道的 MSE ,然后再除以 3 。
  3. 将图片转化为 YCbCr 格式,然后只计算 Y 分量也就是亮度分量的 PSNR。
# im1 和 im2 都为灰度图像,uint8 类型

# method 1
diff = im1 - im2
mse = np.mean(np.square(diff))
psnr = 10 * np.log10(255 * 255 / mse)

# method 2
psnr = skimage.measure.compare_psnr(im1, im2, 255)

2.SSIM (Structural SIMilarity) 结构相似性

概念: SSIM的全称为structural similarity index,即为结构相似性,是一种衡量两幅图像相似度的指标。该指标首先由德州大学奥斯丁分校的图像和视频工程实验室(Laboratory for Image and Video Engineering)提出。而如果两幅图像是压缩前和压缩后的图像,那么SSIM算法就可以用来评估压缩后的图像质量。
计算: SSIM 公式基于样本 x 和 y 之间的三个比较衡量:亮度 (luminance)、对比度 (contrast) 和结构 (structure)。

  • 亮度 l ( x , y ) = 2 ∗ μ x ∗ μ y + c 1 μ x 2 + μ y 2 + c 1 l(x,y) = \frac{2 * \mu_x * \mu_y + c_1}{\mu_x^2 + \mu_y^2 +c_1} l(x,y)=μx2+μy2+c12μxμy+c1
  • 对比度 c ( x , y ) = 2 ∗ σ x ∗ σ y + c 2 σ x 2 + σ y 2 + c 2 c(x,y) = \frac{2 * \sigma_x * \sigma_y + c_2}{\sigma_x^2 + \sigma_y^2 +c_2} c(x,y)=σx2+σy2+c22σxσy+c2
  • 结构 s ( x , y ) = σ x y + c 3 σ x ∗ σ y + c 3 s(x,y) = \frac{\sigma_{xy} + c_3}{\sigma_x * \sigma_y +c_3} s(x,y)=σxσy+c3σxy+c3
    一般来说取 c 3 = c 2 / 2 c_3 = c_2 / 2 c3=c2/2 ,其中 μ x \mu_x μx μ y \mu_y μy分别为x和y的均值,而 σ x 2 \sigma_x^2 σx2 σ y 2 \sigma_y^2 σy2分别表示x和y的方差,同理 σ x y \sigma_{xy} σxy表示x和y的协方差。
    c 1 c_1 c1 c 2 c_2 c2代表两个常数,是为了避免除零,其中 c 1 = ( k 1 ∗ L ) 2 c_1 = (k_1 * L)^2 c1=(k1L)2 c 2 = ( k 2 ∗ L ) 2 c_2 = (k_2 * L)^2 c2=(k2L)2 L L L为像素值得范围既 L = 2 B − 1 L = 2^B - 1 L=2B1 k 1 = 0.01 k_1 = 0.01 k1=0.01 k 1 = 0.03 k_1 = 0.03 k1=0.03均为默认值。
    那么
    S S I M ( x , y ) = [ l ( x , y ) α ∗ c ( x , y ) β ∗ s ( x , y ) γ ] SSIM(x,y) = [l(x,y)^\alpha * c(x,y)^\beta * s(x,y)^\gamma] SSIM(x,y)=[l(x,y)αc(x,y)βs(x,y)γ]
    α , β , γ ] \alpha ,\beta, \gamma] α,β,γ]设为 1,可以得到
    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 * \sigma_x * \sigma_y + c_2)}{(\mu_x^2 + \mu_y^2 +c_1) * (\sigma_x^2 + \sigma_y^2 +c_2)} SSIM(x,y)=(μx2+μy2+c1)(σx2+σy2+c2)(2μxμy+c1)(2σxσy+c2)
    每次计算的时候都从图片上取一个 N×N 的窗口,然后不断滑动窗口进行计算,最后取平均值作为全局的 S S I M SSIM SSIM
# im1 和 im2 都为灰度图像,uint8 类型
ssim = skimage.measure.compare_ssim(im1, im2, data_range=255)

你可能感兴趣的:(人工智能)