【Python】实现图片质量比较,使用指标 PSNR 和 SSIM

Python 实现图片质量比较之PSNR和SSIM

PSNR

PSNR,Peak Signal-to-Noise Ratio,峰值信噪比,是一个表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值的工程术语。由于许多信号都有非常宽的动态范围,峰值信噪比常用对数分贝单位来表示。

PSNR 是用于衡量图像质量的指标,比如在图像压缩、超分辨率重建图像等领域,其是一种重要的指标.

PSNR 常简单的通过均方误差(MSE)来定义. 比如,对于两张单色图像 I 和 K,如果一个为另外一个的噪声近似,则二者之间的均方误差定义为:
在这里插入图片描述

而峰值信噪比PSNR 的定义为:
在这里插入图片描述

其中, M A X I MAX_I MAXI 表示图像点颜色的最大数值,如果每个采样点用 8 位表示,则最大数值为 255.

更通用的表示是,如果每个采样点用 B 位线性脉冲编码调制表示,则 M A X I = 2 B − 1 MAX_I = 2^B - 1 MAXI=2B1,即:

类似地,对于每点有 RGB 三个值的彩色图像来说,PSNR 的定义也是类似的,只是均方误差是所有方差之和除以图像尺寸再除以3。

MSE 越小,则 PSNR 越大;PSNR越大,代表着图像质量越好。

  1. PSNR高于40dB说明图像质量极好(即非常接近原始图像)
  2. 在30-40dB通常表示图像质量是好的(即失真可以察觉但可以接受)
  3. 在20-30dB说明图像质量差
  4. 低于20dB图像不可接受

skimge 实现

安装 skimage 库

pip install scikit-image

skimage 库也提供了相关的计算实现.
skimage.measure.compare_psnr

from skimage.metrics import structural_similarity
PSNR = peak_signal_noise_ratio(img1, img2)
完示例代码
import cv2
from skimage.metrics import mean_squared_error
from skimage.metrics import peak_signal_noise_ratio

img1 = cv2.imread('imgPred0.png')
img2 = cv2.imread('imgPred01.png')

MSE = mean_squared_error(img1, img2)
PSNR = peak_signal_noise_ratio(img1, img2)

print('MSE: ', MSE)
print('PSNR: ', PSNR)

TensorFlow 实现

TensorFlow 中已经包含 PSNR 计算的函数,可直接采用.
tf.image.psnr

import tensorflow as tf
 
def read_img(path):
    return tf.image.decode_image(tf.read_file(path))
 
def psnr(tf_img1, tf_img2):
    return tf.image.psnr(tf_img1, tf_img2, max_val=255)
 
def main():
    t1 = read_img('t1.jpg')
    t2 = read_img('t2.jpg')
    #两张图像t1和t2的尺寸要完全一致
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        y = sess.run(psnr(t1, t2))
        print(y)
 
if __name__ == '__main__':
    main()

SSIM

SSIM,Structural Similarity,结构相似性. 也是衡量两幅图片相似性的指标.

结构相似性的基本原理是,认为自然图像时高度结构化的,即相邻像素间具有很强的关联性,而这种关联性表达了场景中物体的结构信息. 人类视觉系统对于图像已经具有很强的理解与信息抽取能力,所以在衡量图像质量时,结构性失真是很重要的考量.

代码实现

同样还是使用 skimage 库进行代码的实现

import cv2
from skimage.measure import compare_ssim

img1 = cv2.imread('imgPred0.png')
img2 = cv2.imread('imgPred01.png')

SSIM = structural_similarity(img1, img2, multichannel=True)

print('SSIM: ', SSIM)

Ref

  1. 图片质量比较之PSNR和SSIM
  2. PSNR-峰值信噪比(原理及python代码实现)
  • 14
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值