峰值信噪比 - PSNR相关介绍

Feb. 2, 2024

PSNR,峰值信噪比,原本是指一个信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值。而在我们常见的计算机视觉、图形学任务中,PSNR可以非常直接 地描述图片的生成质量。

定义

原始图片和处理后的图片的峰值信噪比可以非常直接、清晰地用公式表达出来:

$$\text{PSNR} = 10 \cdot log_{10} \left( \frac{\text{MAX}_I^2}{\text{MSE}} \right) = 20 \cdot \log_{10}\left( \frac{\text{MAX}_I}{\text{MSE}} \right)$$
(1)
其中,$\text{MAX}_I$ 代表像素点颜色的最大值;MSE指均方误差,见以下公式。在我们日常的使用中,如果图片的数据类型采用8位表示,即使用 'np.uint8' 的话,则 $\text{MAX}_I = 255$
$$\text{MSE} = \frac{1}{mn} \sum^{m-1}_{i=0} \sum^{n-1}_{j=0} [I(i, j)] - K(i, j)]^2 $$
(2)
其中,m和n分别表示图像的长和宽
然而对于一张rgb图片而言,我们需要考虑的不仅有一张图片的长和宽,还需要考虑图像的3个通道,所以这个公式将进一步演化为:
$$\text{PSNR} = 10 log_{10} \left( \frac{\text{MAX}_{I}^2}{\frac{1}{3mn} \sum_{R,G,B} \sum_{i=0}^{m-1} \sum_{j=0}^{n-1} [I_{color}(i, j) - K_{color}(i,j)]^2 } \right) $$
(3)

PNSR的值在一定程度上可以直接衡量一张图像的质量。

代码实现

numpy代码实现

import numpy as np
import math

def psnr(img1, img2):
    """img1: 生成图像
       img2: 真实图像
    """
    assert img1.shape == img2.shape, "Shape of img1 and img2 must be identical!"
    mse = np.mean((img1 - img2) ** 2)
    max_value = np.max(img2)
    psnr = 20 * math.log10(max_value / math.sqrt(mse))
    return psnr
        

pytorch代码实现

import torch

def psnr(img1: torch.Tensor, img2: torch.Tensor) -> torch.Tensor:
    mse = (((img1 - img2)) ** 2).view(img1.shape[0], -1).mean(1, keepdim=True)
    return 20 * torch.log10(1.0 / torch.sqrt(mse))