📜  Python|峰值信噪比 (PSNR)

📅  最后修改于: 2022-05-13 01:54:40.444000             🧑  作者: Mango

Python|峰值信噪比 (PSNR)

峰值信噪比 (PSNR) 是图像的最大可能功率与影响其表示质量的破坏噪声功率之间的比率。为了估计图像的 PSNR,有必要将该图像与具有最大可能功率的理想干净图像进行比较。

PSNR定义如下:

     \[PSNR = 10log_{10}(\frac{(L - 1)^2}{MSE})= 20log_{10}(\frac{L - 1}{RMSE})\]


这里, L是图像中最大可能强度级别的数量(最小强度级别假设为 0)。

MSE是均方误差,定义为:

     \[MSE = \frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}\left ( O(i, j) - D(i, j)\right )^{2}\]


其中, O表示原始图像的矩阵数据。 D表示退化图像的矩阵数据。 m表示像素的行数, i表示图像中该行的索引。 n表示像素的列数, j表示图像的该列的索引。
RMSE是均方根误差。

在这里,我们有一个原始图像和它的压缩版本,让我们看看这些图像的PSNR值,

原始图像:

压缩图像:

下面是Python的实现——

from math import log10, sqrt
import cv2
import numpy as np
  
def PSNR(original, compressed):
    mse = np.mean((original - compressed) ** 2)
    if(mse == 0):  # MSE is zero means no noise is present in the signal .
                  # Therefore PSNR have no importance.
        return 100
    max_pixel = 255.0
    psnr = 20 * log10(max_pixel / sqrt(mse))
    return psnr
  
def main():
     original = cv2.imread("original_image.png")
     compressed = cv2.imread("compressed_image.png", 1)
     value = PSNR(original, compressed)
     print(f"PSNR value is {value} dB")
       
if __name__ == "__main__":
    main()

输出:

PSNR value is 43.862955653517126 dB 

PSNR 最常用于估计压缩器、滤波器等的效率。PSNR 的值越大,对应的压缩或滤波器方法的效率越高。