[深度學習] [Tensorflow] Tensorflow 中計算 PSNR 峰值信噪比
阿新 • • 發佈:2019-01-10
峰值信噪比,Peak signal-to-noise ratio(PSNR)是測量有失真壓縮編/解碼器的重建質量的重要指標,在影象處理領域很常見,因為在影象壓縮處理過程中,常常會引入噪聲,這些噪聲就會影響影象重建質量,對於影象重建,較高的PSNR指標通常表明重建質量較高,影象失真越小。
定義
原影象與被處理影象之間的均方誤差相對於(2n-1)2的對數值(訊號最大值的平方,n是每個取樣值的位元數,例如灰度影象就是8位元,所以MAX值是255),它的單位是dB。
MSE是均方誤差
在Tensorflow 1.8版本,Tensorflow加入了計算psnr的API
tf.image.psnr
tf.image.psnr(
a,
b,
max_val,
name=None
)
返回A與B的PSNR值,一般情況下max_val=255(影象數值的動態範圍)
官方示例
# Read images from file. im1 = tf.decode_png('path/to/im1.png') im2 = tf.decode_png('path/to/im2.png') # Compute PSNR over tf.uint8 Tensors. psnr1 = tf.image.psnr(im1, im2, max_val=255) # Compute PSNR over tf.float32 Tensors. im1 = tf.image.convert_image_dtype(im1, tf.float32) im2 = tf.image.convert_image_dtype(im2, tf.float32) psnr2 = tf.image.psnr(im1, im2, max_val=1.0) # psnr1 and psnr2 both have type tf.float32 and are almost equal.
程式碼實現,地址 https://github.com/tensorflow/tensorflow/blob/r1.12/tensorflow/python/ops/image_ops_impl.py
@tf_export('image.psnr') def psnr(a, b, max_val, name=None): with ops.name_scope(name, 'PSNR', [a, b]): # Need to convert the images to float32. Scale max_val accordingly so that # PSNR is computed correctly. max_val = math_ops.cast(max_val, a.dtype) max_val = convert_image_dtype(max_val, dtypes.float32) a = convert_image_dtype(a, dtypes.float32) b = convert_image_dtype(b, dtypes.float32) mse = math_ops.reduce_mean(math_ops.squared_difference(a, b), [-3, -2, -1]) psnr_val = math_ops.subtract(20 * math_ops.log(max_val) / math_ops.log(10.0), np.float32(10 / np.log(10)) * math_ops.log(mse), name='psnr') _, _, checks = _verify_compatible_image_shapes(a, b) with ops.control_dependencies(checks): return array_ops.identity(psnr_val)