峰值信噪比 - 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{MSE} = \frac{1}{mn} \sum^{m-1}_{i=0} \sum^{n-1}_{j=0} [I(i, j)] - K(i, j)]^2 $$
(2)
然而对于一张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的值在一定程度上可以直接衡量一张图像的质量。
- 当 $\text{PSNR} \rightarrow 50$的时候,认为压缩后的图像(即生成或合成图像)的质量与原始图像之间仅有微小差异。
- 当 $\text{PSNR} \geq 30$的时候,认为压缩后的图像与真实图像之间区别不大,肉眼几乎无法察觉。
- 当 $20 \leq \text{PSNR} \leq 30$ 时,人眼就可以很轻松地识别出合成图像与真实图像之间的差异。
- 当 $10 \leq \text{PSNR} \leq 20$ 介于10到20之间时,人眼能辨别两张图像的结构相同,且主观上会认为两张图片表示的是同一个视角下的同一个场景。
- 当 $\text{PSNR} \leq 10 $的时候,人眼完全无法识别两张图片具有相似性,是否是一对真实图片和合成图片对(pair)。
代码实现
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))