图像质量评估指标:PSNR / SSIM 原理及Python代码

PSNR(峰值信噪比,Peak Signal-to-Noise Ratio),用于衡量两张图像之间差异,例如压缩图像与原始图像,评估压缩图像质量;复原图像与ground truth,评估复原算法性能等。

公式:

 

  其中,  MSE 为两张图像的均方误差; MaxValue 为图像像素可取到的最大值,例如 8 位图像为 2^8-1=255。

代码:

# 直接调库
from skimage.measure import compare_psnr

compare_psnr(img1, img2, 255)

'''
2022-7-28: 更新
skimage.measure.compare_psnr has been moved to skimage.metrics.peak_signal_noise_ratio
'''
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
compare_psnr(img1, img2, data_range=255)
# 自己实现
import numpy as np

def compare_psnr(img1, img2, maxvalue):
        '''
        一般 opencv 读图是 uint8, 漏掉转数据格式会导致计算出错;
        有些代码会在 mse==0 的时候直接返回 100, 但很明显 psnr 并没有最大值为 100 的说法,
        通常也不会算两张相同图像的 psnr, 干脆和 skimage 一样不写 mse==0 的情况
        '''
    img1, img2 = img1.astype(np.float64), img2.astype(np.float64)
    mse = np.mean((img1 - img2) ** 2)
    return 10 * np.log10((maxvalue ** 2) / mse)

意义:
  PSNR 最小值为 0,PSNR 越大,两张图像差异越小;
  PSNR 计算简单,物理意义清晰,但是,这种基于 MSE 的评价指标并不能很好的按人眼的感受来衡量两张图像的相似度,例如 SSIM 论文中的图:


  意思就是5种不同变换后的图像与原图 MSE 相同,即 PSNR 也相同,但是 SSIM 不同,可以类似人的感受评估图像相似性。
  验证一下,保存了论文中的6幅图像计算 PSNR,毕竟不是完全在原图上计算的,不过 PSNR 的差异也确实不大:
psnr(a,b) = 22.8197
psnr(a,c) = 24.6104
psnr(a,d) = 23.6994
psnr(a,e) = 22.9966
psnr(a,f) = 24.6628

2. SSIM

  SSIM(结构相似性,Structural Similarity)基于人眼会提取图像中结构化信息的假设,比传统方式更符合人眼视觉感知。

公式:

 

 

代码:

from skimage.measure import compare_ssim

'''
compare_ssim(X, Y, win_size=None, gradient=False, 
                         data_range=None, multichannel=False, 
                         gaussian_weights=False, full=False, **kwargs)
                         
-------- Parameters --------
X, Y : ndarray
           任意维度图像
win_size : int or None
gradient : bool, optional
                   是否返回关于Y的梯度
data_range : float, optional
                         输入图像数据范围(MaxValue), 默认情况根据图像数据类型估计
multichannel : bool, optional
                           if True, 则将数组的最后一个维度视为通道, 
                           对每个通道独立进行相似度计算, 然后取平均值。
gaussian_weights : bool, optional
                                   if True, 则每个patch的均值和方差由宽度为 sigma=1.5 的归一化高斯核在空间上加权。
full : bool, optional
           if True, 返回原图大小的ssim而不是均值
           
-------- Other Parameters --------
use_sample_covariance : bool, default=True
                                                if True, 则通过 N-1 而不是 N 对协方差进行归一化,
                                                其中 N 是滑动窗口内的像素数。
K1 : float, default=0.01
K2 : float, default=0.03
sigma : float, default=1.5
                gaussian_weights=True 时的 sigma
                
-------- Returns --------
mssim : float
grad : ndarray
           X 和 Y 之间结构相似指数的梯度。
           仅在 gradient=True 时返回
S : ndarray
        完整的 ssim 图像
        仅在 full=True 时返回
'''
ssim = compare_ssim(img1, img2, win_size=11, data_range=255, multichannel=True)

意义:
  SSIM≤1,SSIM 越大,两张图像越相似。

  但是 PSNR 和 SSIM 都只适合画面复杂度低或完全对齐的图像,例如下图是同一地点的不同时期卫星图像及其重叠显示,对人眼来说相似度高,但由于没对齐导致 SSIM 很低。

 

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值