1. 程式人生 > >[深度學習] [Tensorflow] Tensorflow 中計算 PSNR 峰值信噪比

[深度學習] [Tensorflow] Tensorflow 中計算 PSNR 峰值信噪比

峰值信噪比,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)