目录
PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是衡量图像或视频质量的常用指标,主要用于评价原始图像与重建图像之间的相似程度。PSNR 通常用于图像重建、压缩、去噪等领域,来评估重建或压缩算法的效果。
定义
PSNR 是基于均方误差(MSE,Mean Squared Error)计算的,它表示原始图像和处理后图像之间的误差程度。PSNR 值越高,表明图像质量越好,失真越小;反之,PSNR 值越低,图像质量越差,失真较大。
应用
PSNR被广泛用于衡量图像和视频的质量,特别以下场景:
(1)图像重建:评估通过各种算法(如深度学习、插值算法、三维重建等)重建后的图像质量。
(2)图像压缩:比较图像在压缩前后之间的失真程度,如JPEG压缩对图像质量的影响。
(3)图像去噪:衡量去噪算法的效果,即处理后的图像与原始无噪声图像的差异。
(4)视频质量评估:用来衡量视频帧的压缩或传输过程中造成的损失。
PSNR的理解
- PSNR值越大,图像质量越高。通常,PSNR值大于30dB 表示重建或压缩后的图像质量较好。对于视觉上无明显失真的图像,PSNR 通常在40dB以上。
- PSNR值越小,图像失真越大。如果PSNR值小于20dB,通常表明图像质量非常差,失真较为明显。
局限性
虽然PSNR是评价图像和视频质量的常用指标,但也存在一些局限性:
- 视觉感知不足:PSNR 是一个数学上的误差度量,与人眼的视觉感知不完全一致。即使PSNR较高,图像在视觉上可能仍存在较大的主观失真。
- 不适用于所有应用:PSNR 只反映像素值的差异,对于一些主观质量评估(如色彩、对比度等),PSNR 不能很好地反映。
python代码示例
image_A.png
result.jpg
import cv2
import numpy as np
def calculate_psnr(original, compressed):
mse = np.mean((original - compressed) ** 2)
if mse == 0:
return float('inf') # 没有差异时PSNR为无穷大
max_pixel = 255.0
psnr = 20 * np.log10(max_pixel / np.sqrt(mse))
return psnr
# 读取原始图像和压缩/重建图像
original = cv2.imread('image_A.png')
compressed = cv2.imread('result.jpg')
# 计算PSNR
psnr_value = calculate_psnr(original, compressed)
print(f"PSNR value is {psnr_value} dB")
运行结果:
root:/code# python calc_psnr.py
PSNR value is 30.742504278297076 dB