PSNR计算
psnr是“Peak Signal to Noise Ratio”的缩写,即峰值信噪比,是一种评价图像的客观标准,衡量原图像与被处理图像之间的均方误差,单位db。两个图像之间PSNR值越大,则越相似。普遍基准为30dB,30dB以下的图像劣化较为明显。公式如下:$$PSNR=10\times log_{10}(\frac{(2^{n}-1)^{2}}{MSE})$$ n为图像位数(注意即使为RGB三通道图像:n==8),MSE是原图像与测试图像所有像素之间的误差平方和,再取平均(如下代码所示)1
2
3
4
5
6
7
8
9
10class PsnrEstimator(object):
"""psnr评估器
"""
def func(self):
se = tf.square(self.tf_origin_image - self.tf_recon_image)
mse = tf.reduce_mean(se) # 每个通道分别计算MSE取平均
psnr = tf.cond(tf.equal(mse, 0),
lambda: tf.constant(100, dtype=tf.float32),
lambda: 10 * (tf.log(255 * 255 / mse) / np.log(10))) # 换底公式
return se, psnr
另外需要注意的一点是,假如计算图像残差的PSNR,因为本身残差图像像素值就很小,所以即使训练的图像与原始残差PSNR值较高,但差距依然可能很大。所以对于残差图像的PSNR,要求要更加严格。