图像质量评价指标

图像质量评价指标

图像质量评价指标的最常见分类是通过参考图像的可用性,即全参考(full-reference, FR)、减少参考(reduced-reference, RR)和无参考(no-reference, NR)质量度量。FR度量计算失真图像和参考图像之间的相似性,当参考图像的部分信息可用时应用RR度量,而NR度量利用图像统计来评估图像质量,因为参考图像的信息完全不可用。

Representative FR and RR IQA methods

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

给定一个大小为m×nm\times n的干净图像和噪声图像,均方误差(MSE) 定义为:

MSE=1mni=0m1i=0n1[I(i,j)K(i,j)]2MSE=\frac{1}{mn}\sum_{i=0}^{m-1}\sum_{i=0}^{n-1}[I(i,j)-K(i,j)]^2

然后**PSNR(dB) ** 就定义为:

PSNR=10×log10(MAXI2MSE)PSNR=10\times log_{10}(\frac{MAX_I^2}{MSE})

其中MAXI2MAX_I^2为图片可能的最大像素值。如果每个像素都由 8 位二进制来表示,那么就为 255。通常,如果像素值由B位二进制来表示,那么MAXI2=2B1MAX_I^2=2^B-1

一般地,针对 uint8 数据,最大像素值为 255,;针对浮点型数据,最大像素值为 1。

上面是针对灰度图像的计算方法,如果是彩色图像,通常有三种方法来计算。

  • 分别计算 RGB 三个通道的 PSNR,然后取平均值。
  • 计算 RGB 三通道的 MSE ,然后再除以 3 。
  • 将图片转化为 YCbCr 格式,然后只计算 Y 分量也就是亮度分量的 PSNR。

其中,第二和第三种方法比较常见。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# method 1
diff = im1 - im2
mse = np.mean(np.square(diff))
psnr = 10 * np.log10(255 * 255 / mse)

# method 2
from skimage.metrics import structural_similarity as ssim
from PIL import Image
import numpy as np

#转为灰度图像
img1 = Image.open(img1_path).convert('L')
img2 = Image.open(img2_path).convert('L')
img2 = img2.resize(img1.size)
image_true, image_test = np.array(img1), np.array(img2)
psnr = skimage.metrics.peak_signal_noise_ratio(image_true, image_test, *, data_range=None)

https://scikit-image.org/docs/dev/api/skimage.metrics.html#skimage.metrics.peak_signal_noise_ratio

  • 参数:

    image_true: ndarray。Ground-truth图像,与im_test形状相同

    image_test: ndarray。测试图像

    data_range: int, optional。输入图像的数据范围(可能值的最小值和最大值之间的距离)。默认情况下,这是根据图像数据类型估计的

  • 返回值

    psnr: float。PSNR值度量

针对超光谱图像,我们需要针对不同波段分别计算 PSNR,然后取平均值,这个指标称为 MPSNR。

PSNR 等图像保真度测量方法虽然被广泛采用,但却无法很好地反映视觉质量。为了进一步接近人类视觉系统(human visual system, HVS)的质量评估,人们引入了结构相似性指数测量(Structural similarity index measure, SSIM),利用其对结构信息变化的敏感性。

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

SSIM公式基于样本x和y之间的三个比较衡量:亮度 (luminance)、对比度 (contrast) 和结构 (structure)。

l(x,y)=2μxμy+c1μx2+μy2+c1c(x,y)=2σxσy+c2σx2+σy2+c2s(x,y)=2σxy+c3σxσy+c3l(x,y)=\frac{2\mu_x\mu_y+c_1}{\mu_x^2+\mu_y^2+c_1}\\ c(x,y)=\frac{2\sigma_x\sigma_y+c_2}{\sigma_x^2+\sigma_y^2+c_2}\\ s(x,y)=\frac{2\sigma_{xy}+c_3}{\sigma_x\sigma_y+c_3}\\

一般取c3=c2/2c_3=c_2/2

  • μx\mu_x为x均值,σx\sigma_x为x方差,σxy\sigma_{xy}为x和y的协方差
  • c1=(k1L)2c_1=(k_1L)^2,c2=(k2L)2c_2=(k_2L)^2为两个常数,避免除零
  • L为像素值的范围,L=2B1L=2^B-1
  • k1=0.01,k2=0.03k_1=0.01,k_2=0.03为默认值

那么

SSIM(x,y)=[l(x,y)α×c(x,y)β×s(x,y)γ]SSIM(x,y)=[l(x,y)^\alpha\times c(x,y)^\beta\times s(x,y)^\gamma]

α,β,γ\alpha,\beta,\gamma分别代表了不同特征在SSIM衡量中的占比,当都为1时,有:

SSIM(x,y)=(2μxμy+c1)(2σxσy+c2)(μx2+μy2+c1)(σx2+σy2+c2)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)}

每次计算的时候都从图片上取一个N×NN\times N的窗口,然后不断滑动窗口进行计算,最后取平均值作为全局的 SSIM。

1
2
skimage.metrics.structural_similarity(im1, im2, *, win_size=None, gradient=False, data_range=None, 
channel_axis=None, gaussian_weights=False, full=False, **kwargs)

https://scikit-image.org/docs/dev/api/skimage.metrics.html#skimage.metrics.structural_similarity

  • 参数:

    im1, im2: ndarray。两个图片,任何具有相同形状的维度。

    win_size: int or None, optional。用来比对的滑动窗口的变长。必须是奇数。如果

    gradient: bool, optional。如果为True,也会返回相对于im2的梯度

    data_range: float, optional。输入图像的数据范围(最大和最小值之间可能的距离)使用默认,这会从图像数据类型中估计

    channel_axis: int or None, optional。如果为None,图像被假定为灰度图(单通道),否则,使用该参数索引轴的数组对应的通道

    gaussian_weights: bool, optional。如果为True,则每个patch的均值和方差由宽度σ =1.5的归一化高斯核进行空间加权。

    full: bool, optional。如果为True,也返回完整的结构相似度图像

  • 返回值

    mssim: float。图像上的平均结构相似度指数

    grad: ndarray。im1和im2之间的结构相似度梯度。这只在梯度设置为True时返回

    S: ndarray。完整的SSIM映像。这只在full设置为True时返回

针对超光谱图像,我们需要针对不同波段分别计算 SSIM,然后取平均值,这个指标称为 MSSIM。


图像质量评价指标
https://wangyinan.cn/图像质量评价指标
作者
yinan
发布于
2023年7月23日
许可协议