2、图像质量评估指标:PSNR、SSIM、MS-SSIM、LPIPS、NIQE等客观指标详解
做图像质量调优,第一件事就是搞清楚:怎么才算「好」?
你调了半天参数,眼睛都快看花了,总得有个数字说话吧?
客观指标就是干这个的。它们把「人眼觉得好不好」这件事,尽量量化成几个数值。但说实话,每个指标都有脾气,用不对反而会坑你。
我刚开始做超分模型时,PSNR 刷得老高,结果一放大看,纹理全糊了。嗯,从那以后我就明白——指标是拐杖,不是终点。
2.1 PSNR(峰值信噪比)—— 最老牌,也最「老实」
PSNR 是图像质量评估的「元老」。它的逻辑很简单:算像素误差。
你把两张图逐像素相减,求个均方误差(MSE),再换算成 dB 值。值越高,说明像素越接近。
# PSNR 计算核心逻辑
import numpy as np
def psnr(img1, img2, max_val=255.0):
mse = np.mean((img1 - img2) ** 2)
if mse == 0:
return float('inf')
return 20 * np.log10(max_val / np.sqrt(mse))
但这里有个坑——PSNR 不关心「结构」。
我记得有一次做去噪实验,PSNR 涨了 0.5dB,我挺高兴。结果一看图,细节全磨平了,变成一块塑料。PSNR 觉得「像素接近就是好」,但人眼不这么认为。
2.2 SSIM(结构相似性)—— 更像人眼了
SSIM 比 PSNR 聪明一点。它不光看像素,还看亮度、对比度、结构三个维度。
公式长这样:
SSIM(x, y) = [l(x,y)]^α · [c(x,y)]^β · [s(x,y)]^γ
其中:
- l(x,y) —— 亮度对比
- c(x,y) —— 对比度对比
- s(x,y) —— 结构对比
取值范围是 [0, 1],1 表示两图完全一样。
我个人习惯用 SSIM 做第一道质量门禁。比如模型训练时,每 1000 步算一次 SSIM,低于 0.85 的直接报警。
2.3 MS-SSIM(多尺度 SSIM)—— SSIM 的升级版
SSIM 有个毛病:它只在单一尺度上比较。但人眼看图是多尺度的——先看整体,再看细节。
MS-SSIM 就是解决这个问题的。它把图像下采样成多个尺度(一般是 5 层),每层算一次 SSIM,最后加权合并。
| 尺度层级 | 下采样倍数 | 关注内容 |
|---|---|---|
| Scale 1 | 1x(原图) | 精细纹理、边缘 |
| Scale 2 | 2x | 局部结构 |
| Scale 3 | 4x | 中等尺度物体 |
| Scale 4 | 8x | 大尺度轮廓 |
| Scale 5 | 16x | 全局布局 |
我在做图像压缩质量评估时,发现 MS-SSIM 比单尺度 SSIM 更稳定。压缩带来的块效应,在低尺度上会被放大,MS-SSIM 能抓到这些细节。
2.4 LPIPS(学习感知图像块相似度)—— 让神经网络来打分
前面几个指标都是手工设计的。LPIPS 换了个思路:用预训练网络(如 VGG)提取特征,在特征空间里算距离。
说白了,它问的是:「神经网络觉得这两张图像不像?」
# LPIPS 使用示例(伪代码)
import lpips
loss_fn = lpips.LPIPS(net='alex') # 可选 alex/vgg/squeeze
dist = loss_fn(img1, img2) # 值越小越相似
LPIPS 的值越低越好。一般范围在 0~1 之间。
说实话,LPIPS 是我目前在感知质量上最信任的指标。它跟人眼的相关性比 PSNR 高出一大截。但代价是计算量大——跑一次 LPIPS 够跑十次 PSNR。
2.5 NIQE(自然图像质量评估器)—— 没有参考图怎么办?
前面几个指标都需要一张「完美」的参考图。但实际业务中,你上哪找参考图?
比如用户上传的老照片修复,原始清晰图早没了。这时候就需要无参考指标。
NIQE 的核心思想是:统计自然图像的「正常」特征分布。它从大量高质量自然图像中提取出均值、方差等统计量,然后拿待测图像的特征去跟这个「标准分布」比。偏离越大,质量越差。
NIQE 值越低越好。一般低于 5 算不错,高于 8 就比较差了。
2.6 指标对比速查表
| 指标 | 类型 | 范围 | 好坏方向 | 计算速度 | 与人眼相关性 |
|---|---|---|---|---|---|
| PSNR | 全参考 | 0~∞ dB | 越高越好 | ⚡ 极快 | ⭐⭐ |
| SSIM | 全参考 | 0~1 | 越高越好 | ⚡ 快 | ⭐⭐⭐ |
| MS-SSIM | 全参考 | 0~1 | 越高越好 | ⚡⚡ 中等 | ⭐⭐⭐⭐ |
| LPIPS | 感知参考 | 0~1 | 越低越好 | ⚡⚡⚡ 慢 | ⭐⭐⭐⭐⭐ |
| NIQE | 无参考 | 0~∞ | 越低越好 | ⚡ 快 | ⭐⭐⭐ |
2.7 我的调优组合拳
说了这么多,实际干活时怎么用?我分享一套自己常用的流程:
- 训练监控:每轮算 PSNR + SSIM,快速看趋势。PSNR 涨但 SSIM 跌?大概率过拟合了。
- 模型选型:候选模型跑 LPIPS,排名靠前的再人工看。LPIPS 能筛掉很多「PSNR 高但糊」的模型。
- 上线前:用 NIQE 扫一批真实业务数据,确保分布正常。NIQE 突然飙升?可能是数据预处理出了问题。
- 最终把关:找 3~5 个人做主观评测。指标再漂亮,人眼说不行就是不行。