PSNR的全称为“Peak Signal-to-Noise Ratio”,直译为中文就是峰值信噪比。
是一种衡量图像质量的指标。在很多领域都会需要这个指标,比如在超分辨率重建图像的时候,PSNR就是很重要的指标了。
WIKI解释
峰值信噪比(英语:Peak signal-to-noise ratio,常缩写为PSNR)是一个表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值的工程术语。由于许多信号都有非常宽的动态范围,峰值信噪比常用对数分贝单位来表示。
计算PSNR要先知道MSE(均方误差)的计算。两个m×n单色图像I和K,如果一个为另外一个的噪声近似,那么它们的的均方误差定义为:
MSE的概念应该是比较熟悉的,这也是常见的损失函数。而PSNR就是通过MSE得出来的,公式如下:
其中,MAXI是表示图像点颜色的最大数值,如果每个采样点用 8 位表示,那么就是 255。
所以MSE越小,则PSNR越大;所以PSNR越大,代表着图像质量越好。
一般来说,
PSNR高于40dB说明图像质量极好(即非常接近原始图像),
在30—40dB通常表示图像质量是好的(即失真可以察觉但可以接受),
在20—30dB说明图像质量差;
最后,PSNR低于20dB图像不可接受
python代码实现PSNR计算
# PSNR.py
import numpy as np
import math
def psnr(target, ref, scale):
# target:目标图像 ref:参考图像 scale:尺寸大小
# assume RGB image
target_data = np.array(target)
target_data = target_data[scale:-scale,scale:-scale]
ref_data = np.array(ref)
ref_data = ref_data[scale:-scale,scale:-scale]
diff = ref_data - target_data
diff = diff.flatten('C')
rmse = math.sqrt( np.mean(diff ** 2.) )
return 20*math.log10(1.0/rmse)
以上代码仅作参考之用,tensorflow框架里有直接关于psnr计算的函数,直接调用就行了:(更推荐)
注意:计算PSNR的时候必须满足两张图像的size要完全一样!
'''
compute PSNR with tensorflow
'''
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')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
y = sess.run(psnr(t1, t2))
print(y)
if __name__ == '__main__':
_main()