1. 程式人生 > >PSNR-峰值信噪比(原理及python程式碼實現)

PSNR-峰值信噪比(原理及python程式碼實現)

PSNR的全稱為“Peak Signal-to-Noise Ratio”,直譯為中文就是峰值信噪比。

是一種衡量影象質量的指標。在很多領域都會需要這個指標,比如在超解析度重建影象的時候,PSNR就是很重要的指標了。


WIKI解釋

峰值信噪比(英語:Peak signal-to-noise ratio,常縮寫為PSNR)是一個表示訊號最大可能功率和影響它的表示精度的破壞性噪聲功率的比值的工程術語。由於許多訊號都有非常寬的動態範圍,峰值信噪比常用對數分貝單位來表示。

計算PSNR要先知道MSE(均方誤差)的計算。兩個m×n單色影象IK,如果一個為另外一個的噪聲近似,那麼它們的的均方誤差定義為:

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計算的函式,直接呼叫就行了:(更推薦)

'''
compute PSNR with tensorflow

'''
import tensorflow as tf


hr_content = tf.read_file('path/to/test1.png')
sr_content = tf.read_file('path/to/test1_sr.png')
hr = tf.image.decode_image(hr_content)
sr = tf.image.decode_image(sr_content)
# read hr image and sr image

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    y = sess.run(tf.image.psnr(hr, sr, max_val=255))
    print(y)

 


參考:https://es.wikipedia.org/wiki/PSNR

https://blog.csdn.net/breezero/article/details/82285188