1. 程式人生 > >影象質量評價指標之 PSNR 和 SSIM

影象質量評價指標之 PSNR 和 SSIM

1. PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比

給定一個大小為 \(m×n\) 的乾淨影象 \(I\) 和噪聲影象 \(K\),均方誤差 \((MSE)\) 定義為:

\[MSE = \frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}[I(i, j)-K(i,j)]^2\]

然後 \(PSNR (dB)\) 就定義為:

\[PSNR = 10 \cdot log_{10}(\frac{MAX_I^2}{MSE})\]

其中 \(MAX_I^2\) 為圖片可能的最大畫素值。如果每個畫素都由 8 位二進位制來表示,那麼就為 255。通常,如果畫素值由 \(B\)

位二進位制來表示,那麼 \(MAX_I = 2^B-1\)

一般地,針對 uint8 資料,最大畫素值為 255,;針對浮點型資料,最大畫素值為 1。

上面是針對灰度影象的計算方法,如果是彩色影象,通常有三種方法來計算。

  • 分別計算 RGB 三個通道的 PSNR,然後取平均值。
  • 計算 RGB 三通道的 MSE ,然後再除以 3 。
  • 將圖片轉化為 YCbCr 格式,然後只計算 Y 分量也就是亮度分量的 PSNR。

其中,第二和第三種方法比較常見。

# im1 和 im2 都為灰度影象,uint8 型別

# method 1
diff = im1 - im2
mse = np.mean(np.square(diff))
psnr = 10 * np.log10(255 * 255 / mse)

# method 2
psnr = skimage.measure.compare_psnr(im1, im2, 255)

compare_psnr(im_true, im_test, data_range=None) 函式原型可見此處

針對超光譜影象,我們需要針對不同波段分別計算 PSNR,然後取平均值,這個指標稱為 MPSNR。

2. SSIM (Structural SIMilarity) 結構相似性

\(SSIM\) 公式基於樣本 \(x\)\(y\) 之間的三個比較衡量:亮度 (luminance)、對比度 (contrast) 和結構 (structure)。

\[l(x,y) = \frac{2\mu_x \mu_y + c_1}{\mu_x^2+ \mu_y^2 + c_1}\]
\[c(x,y) = \frac{2\sigma_x \sigma_y + c_2}{\sigma_x^2+ \sigma_y^2 + c_2}\]


\[s(x,y) = \frac{\sigma_{xy} + c_3}{\sigma_x \sigma_y + c_3}\]

一般取 \(c_3 = c_2 / 2\)

  • \(\mu_x\)\(x\) 的均值
  • \(\mu_y\)\(y\) 的均值
  • \(\sigma_x^2\)\(x\) 的方差
  • \(\sigma_y^2\)\(y\) 的方差
  • \(\sigma_{xy}\)\(x\)\(y\) 的協方差
  • \(c_1 = (k_1L)^2, c_2 = (k_2L)^2\) 為兩個常數,避免除零
  • \(L\) 為畫素值的範圍,\(2^B-1\)
  • \(k_1=0.01, k_2=0.03\) 為預設值

那麼

\[SSIM(x, y) = [l(x,y)^{\alpha} \cdot c(x,y)^{\beta} \cdot s(x,y)^{\gamma}]\]

\(\alpha,\beta,\gamma\) 設為 1,可以得到

\[SSIM(x, y) = \frac{(2\mu_x \mu_y + c_1)(2\sigma_{xy}+c_2)}{(\mu_x^2+ \mu_y^2 + c_1)(\sigma_x^2+\sigma_y^2+c_2)}\]

每次計算的時候都從圖片上取一個 \(N×N\) 的視窗,然後不斷滑動視窗進行計算,最後取平均值作為全域性的 SSIM。

# im1 和 im2 都為灰度影象,uint8 型別
ssim = skimage.measure.compare_ssim(im1, im2, data_range=255)

compare_ssim(X, Y, win_size=None, gradient=False, data_range=None, multichannel=False, gaussian_weights=False, full=False, **kwargs) 函式原型可見此處

針對超光譜影象,我們需要針對不同波段分別計算 SSIM,然後取平均值,這個指標稱為 MSSIM。

獲取更多精彩,請關注「seniusen」!