欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

超分辨率模型性能度量PSNR和SSIM及其计算方法

程序员文章站 2022-03-09 13:07:13
...

一、PSNR(峰值信噪比)

简介

PSNR(dB):峰值信噪比(Peak Signal-to-Noise Ratio),用于测量有损变换的重建质量 (只关心像素值差异,不能代表感官质量),越大越好。

>40,非常接近原始图像
30-40,质量好,失真可接受
20-30,质量差
<20,不可接受

公式

MSE(均方误差),反映估计量与被估计量之间的差异程度:
MSE=1mni=0m1j=0n1[I(i,j)K(i,j)]2 MSE=\frac{1}{mn}\sum_{i=0}^{m-1}{\sum_{j=0}^{n-1}{\left[ I\left( i,j \right) -K\left( i,j \right) \right] ^2}}
其中,IIKKm×nm\times n的无噪声单色图像。

PSNR(峰值信噪比) 定义如下:
PSNR=10log10(MAXI2MSE) PSNR=10\cdot \log _{10}\left( \frac{MAX_{I}^{2}}{MSE} \right)
PSNR=20log10(MAXIMSE) PSNR=20\cdot \log _{10}\left( \frac{MAX_I}{\sqrt{MSE}} \right)
PSNR=20log10(MAXI)10log10(MSE) PSNR=20\cdot \log _{10}\left( MAX_I \right) -10\cdot \log _{10}\left( MSE \right)
其中,MAXIMAX_{I}是图像像素值的最大值。

以上为单色图像的公式,彩色图像的公式类似,其MSE为RGB三者和再除以3。

代码

1.png
超分辨率模型性能度量PSNR和SSIM及其计算方法
2.png
超分辨率模型性能度量PSNR和SSIM及其计算方法

方法一:numpy计算(CPU运行时间约0.0014593s)

import cv2
import math
import numpy as np


def psnr(img1, img2):
    mse = np.mean((img1 / 255. - img2 / 255.) ** 2)  # 均方差
    if mse < 1.0e-10:  # 几乎无差异返回100
        return 100
    PIXEL_MAX = 1  # 像素最大值
    return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))


if __name__ == "__main__":
    img1 = cv2.imread('1.png')
    img2 = cv2.imread('2.png')
    print(psnr(img1, img2)) # 37.28288478569672

方法二:调用scikit-image库(CPU运行时间约0.0016281s)

import cv2
import skimage

if __name__ == "__main__":
    img1 = cv2.imread('1.png')
    img2 = cv2.imread('2.png')
    print(skimage.measure.compare_psnr(img1, img2, data_range=255)) # 37.28288478569673

二、SSIM(结构相似度)

简介

SSIMs:结构相似度(Structural SIMilarity),一种基于亮度、对比度和结构三个相对独立的主观度量,用于衡量图像间的结构相似度。取值0-1,越大越好,此度量相较PSNR 更符合人眼对图像品质的判断。

公式

亮度 (luminance)
l(x,y)=2μxμy+c1μx2+μy2+c1 l\left( x,y \right) =\frac{2\mu _x\mu _y+c_1}{\mu _{x}^{2}+\mu _{y}^{2}+c_1}

对比度 (contrast)
c(x,y)=2σxσy+c2σx2+σy2+c2 c\left( x,y \right) =\frac{2\sigma _x\sigma _y+c_2}{\sigma _{x}^{2}+\sigma _{y}^{2}+c_2}
结构 (structure)
s(x,y)=σxy+c3σxσy+c3 s\left( x,y \right) =\frac{\sigma _{xy}+c_3}{\sigma _x\sigma _y+c_3}

μx\mu _xxx的均值
σx\sigma _xxx的方差
σxy\sigma _{xy}xxyy的协方差
c1=(k1L)2c_1=(k_1L)^2c2=(k2L)2c_2=(k_2L)^2为常数,防止除零(LL为像素值范围)
c3=c2/2c_3=c_2/2

SSIM(结构相似度) 定义如下:

SSIM(x,y)=(2μxμy+c1)(2σxy+c2)(μx2+μy2+c1)(σx2+σy2+c2) SSIM\left( x,y \right) =\frac{\left( 2\mu _x\mu _y+c_1 \right) \left( 2\sigma _{xy}+c2 \right)}{\left( \mu _{x}^{2}+\mu _{y}^{2}+c_1 \right) \left( \sigma _{x}^{2}+\sigma _{y}^{2}+c_2 \right)}

其中,xxyy为大小相同的N×NN\times N图像。

代码

import cv2
import skimage

if __name__ == "__main__":
    img1 = cv2.imread('1.png')
    img2 = cv2.imread('2.png')
    print(skimage.measure.compare_ssim(img1, img2, data_range=255, multichannel=True)) # 0.9736976594713508





参考文献

  1. PSNR-峰值信噪比(原理及python代码实现) - 木盏 - CSDN博客
  2. 图像质量评价指标之 PSNR 和 SSIM - seniusen - 博客园
  3. Python代码之计算PSNR - u010886794的博客 - CSDN博客
  4. skimage在pycharm下载失败原因 - 王小萌的小世界 - CSDN博客