1. 致謝
感謝 草飄靈sky對該公式理解給予的指導以及資料提供!
2. 啰嗦的介紹(可跳過)
評價圖像處理結果是圖像處理非常重要的一環,因此我認為有必要弄清楚評價所采用的數學模型的公式來源。由於本人沒有學習過數字圖像處理和相關的課程,因此沒有自己弄清楚該公式的來源,網絡中的博客也大多只是對該公式的實現,對公式來源沒有做理解性的說明(感覺應該是公式太簡單,沒有必要說明 QAQ)。但作為一個從來沒接觸過數字圖像處理的小白來說,理解性的說明還是有必要的。
3. 個人理解
先貼出公式:
這里 MSE 就不做解釋了,大多數博客都有提到,它是均方誤差,這個不難理解。重點是最后 PSNR 的這個公式。先看對數括號內的比值。這里的\(\frac{(2^n - 1)^2}{MSE}\),先看(2n-1),這里對應的值表示一個圖像的最大像素值,也就是幅值。這里公式整體實際上是在求信噪比。信噪比的定義如下(圖源自百度百科)
簡單來說就是輸出信號功
率與噪聲功率的比值,但在該詞條下的圖像信噪比項,如下圖所示:
其中“局部方差的最大值認為是信號方差,最小值是噪聲方差,求出它們的比值”描述了上面這個比值的含義。這句話的后半部分“再轉成dB數”則恰好對應了對數公式的來源。分貝的計算公式如下圖所示(圖片來自百度百科)
上述的圖例均為我在得到了 草飄靈sky 指點之后,總結時查詢的資料。這里我以不知道比值表示信噪比,不知道信噪比是什么以及不知道對數運算表示分貝轉換的角度說一下我認為有必要列出的疑問以及 草飄靈sky 的指導。
- 為什么使用對數運算?
- 為什么在比值中要取最大值?
對於取最大值這里,結合 草飄靈sky 的回答,我個人理解的是:如果拋開名稱上的“峰值”以及百度百科上的定義,我認為這里用最大值可能是為了比較明顯的表現出圖像處理的結果。
以上就是我對 PSNR 公式的理解,再次感謝 草飄靈sky !
PSNR 的代碼實現代碼如下
def PSNR(image1, image2):
image1 = np.array(image1)
image2 = np.array(image2)
MSE = np.mean((image1 / 255.0 - image2 / 255.0) ** 2)
if(MSE < 1.0e-10):
return 100.0
return 20 * math.log10(1.0 / math.sqrt(MSE))
return psnr
完整的代碼測試可以在這里 https://github.com/Intro1997/ImageRebuild/tree/master/3_Evalution_Methods/PSNR 找到。