【计算机视觉】三种图像质量评价指标详解:PSNR、SSIM与SAM
图像质量评价指标详解:PSNR、SSIM与SAM
文章目录
- 图像质量评价指标详解:PSNR、SSIM与SAM
- 1. 峰值信噪比(PSNR)
- 1.1 数学定义
- 1.2 特点与局限性
- 2. 结构相似性指数(SSIM)
- 2.1 数学定义
- 2.2 特点与应用
- 3. 光谱角度映射器(SAM)
- 3.1 数学定义
- 3.2 特点与应用
- 4. Python实现示例
- 5. 指标对比与选择建议
- 6. 总结
在图像处理、压缩和恢复等领域,我们需要客观的指标来评估图像质量。本文将详细介绍三种常用的图像质量评价指标:峰值信噪比(PSNR)、结构相似性指数(SSIM)和光谱角度映射器(SAM)。
1. 峰值信噪比(PSNR)
PSNR是最广泛使用的图像质量评价指标之一,它通过计算原始图像与处理后图像之间的均方误差(MSE)来衡量图像失真程度。
1.1 数学定义
PSNR的计算公式如下:
PSNR = 10 ⋅ log 10 ( MAX 2 MSE ) = 20 ⋅ log 10 ( MAX MSE ) \text{PSNR} = 10 \cdot \log_{10}\left(\frac{\text{MAX}^2}{\text{MSE}}\right) =20 \cdot \log_{10}\left(\frac{\text{MAX}}{\sqrt{\text{MSE}}}\right) PSNR=10⋅log10(MSEMAX2)=20⋅log10(MSEMAX)
其中:
- M A X = 2 n − 1 MAX = 2^n -1 MAX=2n−1 是 n n n 位图像可能的最大像素值(例如,对于8位图像为255)
- M S E MSE MSE是均方误差,定义为:
MSE = 1 m n ∑ i = 0 m − 1 ∑ j = 0 n − 1 [ I ( i , j ) − K ( i , j ) ] 2 \text{MSE} = \frac{1}{mn}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}[I(i,j) - K(i,j)]^2 MSE=mn1i=0∑m−1j=0∑n−1[I(i,j)−K(i,j)]2
其中 I I I和 K K K分别是原始图像和处理后图像, m m m和 n n n是图像尺寸。
1.2 特点与局限性
优点:
- 计算简单,易于理解,完全客观地反映了两张图片之间的差异
- 广泛应用于各种图像处理任务
缺点:
- 仅基于像素级别的差异,不考虑人类视觉系统的特性
- 对于相同MSE的不同类型的失真,人眼感知可能完全不同
- PSNR值高并不总意味着视觉质量好
例如,在一个图像去噪任务中,对原始无噪声图像(m×n)进行噪声攻击得到含有噪声的图像(如图3-1),需要对图像进行去噪处理,评价指标为计算原始无噪声图像(m×n)与去噪后图像(m×n)的峰值信噪比(Peak
Signal to Noise Ratio, PSNR)(武汉大学遥感信息工程学院《数字图像处理》课本P135)。
图1 受到噪声攻击的图像 我在试验的过程中,发现了这样的现象:
图2 PSNR最高的图像(基于 Lucidrains 的开源库 [denoising-diffusion-pytorch] (https://github.com/lucidrains/denoising-diffusion-pytorch) 中的 UNet 模型去噪,PSNR达36.0626)
图3 PSNR不是最高,但给人视觉效果感觉最好的图像 可以发现,由于这个图像去噪的任务的评价指标是PSNR,是一个客观指标,由PSNR的计算公式可知,当去噪后图像与原图越接近时,PSNR越高(图2),但是给人感觉的视觉效果更好(图3)并不意味着与原图更接近。可以说,图2在图像复原上的效果更好,而图3在图像增强上的效果更好。
2. 结构相似性指数(SSIM)
SSIM是一种更符合人类视觉系统特性的评价指标,它考虑了图像的结构信息、亮度和对比度。
2.1 数学定义
SSIM指数的计算基于三个比较因素:亮度(l)、对比度©和结构(s):
SSIM ( x , y ) = [ l ( x , y ) ] α ⋅ [ c ( x , y ) ] β ⋅ [ s ( x , y ) ] γ \text{SSIM}(x,y) = [l(x,y)]^{\alpha} \cdot [c(x,y)]^{\beta} \cdot [s(x,y)]^{\gamma} SSIM(x,y)=[l(x,y)]α⋅[c(x,y)]β⋅[s(x,y)]γ
通常α=β=γ=1,简化后的公式为:
SSIM ( x , y ) = ( 2 μ x μ y + C 1 ) ( 2 σ x y + C 2 ) ( μ x 2 + μ y 2 + C 1 ) ( σ x 2 + σ y 2 + C 2 ) \text{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)} SSIM(x,y)=(μx2+μy2+C1)(σx2+σy2+C2)(2μxμy+C1)(2σxy+C2)
其中:
- μ x \mu_x μx和 μ y \mu_y μy是图像x和y的平均值
- σ x 2 \sigma_x^2 σx2和 σ y 2 \sigma_y^2 σy2是图像x和y的方差
- σ x y \sigma_{xy} σxy是图像x和y的协方差
- C 1 C_1 C1和 C 2 C_2 C2是为避免分母为零而添加的常数
2.2 特点与应用
优点:
- 更符合人类视觉感知
- 考虑结构信息,不仅仅是像素差异
- 取值范围在-1到1之间,1表示完全相同
应用场景:
- 图像压缩算法评估
- 图像降噪和超分辨率重建
- 视频质量评估
3. 光谱角度映射器(SAM)
SAM主要用于高光谱图像处理领域,它测量两个光谱向量之间的角度,提供了一种与强度无关的相似性度量。
3.1 数学定义
SAM的计算公式为:
SAM ( x , y ) = arccos ( ⟨ x , y ⟩ ∣ ∣ x ∣ ∣ ⋅ ∣ ∣ y ∣ ∣ ) \text{SAM}(x,y) = \arccos\left( \frac{\langle x,y \rangle}{||x|| \cdot ||y||} \right) SAM(x,y)=arccos(∣∣x∣∣⋅∣∣y∣∣⟨x,y⟩)
其中:
- ⟨ x , y ⟩ \langle x,y \rangle ⟨x,y⟩表示向量x和y的内积
- ∣ ∣ x ∣ ∣ ||x|| ∣∣x∣∣和 ∣ ∣ y ∣ ∣ ||y|| ∣∣y∣∣表示向量x和y的欧几里得范数
SAM也可以通过欧拉积分来表示,类似于伽马函数的定义:
Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb{N} Γ(n)=(n−1)!∀n∈N
是通过欧拉积分定义的:
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
3.2 特点与应用
优点:
- 对光照变化不敏感
- 能够有效区分不同材料的光谱特征
- 在遥感和高光谱图像分析中特别有用
应用场景:
- 高光谱图像分类
- 目标检测与识别
- 遥感图像分析
4. Python实现示例
下面提供这三种评价指标的Python实现示例:
import numpy as np
import cv2
from skimage.metrics import structural_similarity as ssim
from math import log10, sqrt# PSNR实现
def calculate_psnr(original, compressed):mse = np.mean((original - compressed) ** 2)if mse == 0: # 图像相同return 100max_pixel = 255.0psnr = 20 * log10(max_pixel / sqrt(mse))return psnr# SSIM实现 (使用skimage库)
def calculate_ssim(original, compressed):return ssim(original, compressed, data_range=compressed.max() - compressed.min())# SAM实现
def calculate_sam(original, compressed):# 将图像转换为向量original_flat = original.reshape(-1)compressed_flat = compressed.reshape(-1)# 计算内积dot_product = np.sum(original_flat * compressed_flat)# 计算范数norm_original = np.sqrt(np.sum(original_flat ** 2))norm_compressed = np.sqrt(np.sum(compressed_flat ** 2))# 计算角度angle = np.arccos(dot_product / (norm_original * norm_compressed))return angle# 示例使用
original = cv2.imread('original.png', 0) # 以灰度模式读取
compressed = cv2.imread('compressed.png', 0)psnr_value = calculate_psnr(original, compressed)
ssim_value = calculate_ssim(original, compressed)
sam_value = calculate_sam(original, compressed)print(f"PSNR: {psnr_value} dB")
print(f"SSIM: {ssim_value}")
print(f"SAM: {sam_value} radians")
5. 指标对比与选择建议
指标 | 优势 | 局限性 | 适用场景 |
---|---|---|---|
PSNR | 计算简单,直观 | 不考虑视觉感知 | 初步评估、有损压缩 |
SSIM | 符合人类视觉系统 | 计算复杂度高 | 需要感知质量评估的场景 |
SAM | 对光照变化不敏感 | 主要适用于多光谱数据 | 高光谱图像处理、遥感 |
选择建议:
- 如果追求计算效率和简单性,选择PSNR
- 如果需要更符合人类视觉感知的评估,选择SSIM
- 如果处理高光谱或多光谱图像,选择SAM
- 在实际应用中,建议结合多种指标进行综合评估
6. 总结
PSNR、SSIM和SAM是图像质量评价中的重要指标,各有优缺点和适用场景。在实际应用中,我们应根据具体需求选择合适的评价指标,或结合多种指标进行综合评估,以获得更全面、客观的图像质量评价结果。
希望本文对你理解这些图像质量评价指标有所帮助。如有疑问,欢迎在评论区留言讨论!