PSNR-峰值信噪比(原理及Python代码实现)

本文链接:https://blog.csdn.net/leviopku/article/details/84586446

PSNR的全称为“Peak Signal-to-Noise Ratio”,直译为中文就是峰值信噪比。

是一种衡量图像质量的指标,在很多领域都会需要这个指标,比如在超分辨率重建图像的时候,PSNR就是很重要的指标了。

WIKI解释

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

计算PSNR要先知道MSE(均方误差)的计算。两个m×n单色图像I和k,如果一个为另外一个的噪声近似,那么它们的均方误差定义为:

                                 

MSE的概念是常见的损失函数,而PNSR就是通过MSE得出来的,公式如下:

                         PSNR-峰值信噪比(原理及Python代码实现)_第1张图片

其中,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()

 

你可能感兴趣的:(数字图像)