图像质量评价基础:主观评价与客观评价、PSNR/SSIM/LPIPS等指标、评价指标的局限性
图像质量评价,说白了就是给一张图「打分」。但怎么打才公平?
我刚开始做图像处理时,总觉得「看着舒服」就是好图。直到有一次,我给客户交付了一套去噪算法,PSNR 指标漂亮得很,结果客户一看样图就炸了——纹理细节全糊了。从那以后我才明白:评价这件事,远比想象中复杂。
主观评价:人眼说了算
主观评价,就是找一群人来看图打分。这是最直接的方法,毕竟图像最终是给人看的。
主观评价的优点是「真实」。人眼对纹理、边缘、色彩的感受,机器很难模拟。但缺点也很明显:
- 成本高: 需要组织大量观察者,耗时耗力
- 不稳定: 同一个人今天和明天的打分可能不一样
- 难量化: 无法嵌入自动化流程
所以,工业界更需要客观评价指标——用数学公式代替人眼。
客观评价:三大主流指标
客观评价指标,我习惯把它们分成三类:全参考、半参考、无参考。这里重点讲全参考,也就是有「完美原图」做对比的情况。
PSNR:最古老,也最容易被骂
PSNR(峰值信噪比)是祖师爷级别的指标。它的逻辑很简单:计算两张图的像素差异。
# PSNR 计算示例
import numpy as np
def psnr(img1, img2):
mse = np.mean((img1 - img2) ** 2)
if mse == 0:
return float('inf')
max_pixel = 255.0
return 20 * np.log10(max_pixel / np.sqrt(mse))
PSNR 越高,说明像素差异越小。但问题来了——像素差异小,不代表视觉质量好。
SSIM:更懂人眼的结构相似性
SSIM(结构相似性)比 PSNR 聪明多了。它不光看像素差异,还考虑亮度、对比度、结构三个维度。
| 维度 | 含义 | 数学表达 |
|---|---|---|
| 亮度 | 整体明暗是否一致 | l(x,y) = (2μxμy + C1) / (μx² + μy² + C1) |
| 对比度 | 纹理强弱是否一致 | c(x,y) = (2σxσy + C2) / (σx² + σy² + C2) |
| 结构 | 边缘和纹理布局是否一致 | s(x,y) = (σxy + C3) / (σxσy + C3) |
SSIM 的取值范围是 0 到 1,越接近 1 越好。我个人习惯用 SSIM 做算法调参的参考,因为它比 PSNR 更贴近人眼感受。
LPIPS:深度学习时代的「感知距离」
LPIPS(Learned Perceptual Image Patch Similarity)是近几年火起来的指标。它用预训练的神经网络(比如 VGG)提取特征,然后比较特征图的差异。
为什么需要 LPIPS?因为 PSNR 和 SSIM 都有个通病——它们对「纹理迁移」不敏感。举个例子:
- 你把一张照片的草地纹理换成另一种草地纹理,PSNR 和 SSIM 可能变化不大
- 但人眼一眼就能看出「不对劲」
- LPIPS 能捕捉到这种差异,因为它是在特征空间里做比较
# LPIPS 使用示例(简化版)
import torch
import lpips
loss_fn = lpips.LPIPS(net='alex') # 也可以用 vgg
img1 = torch.randn(1, 3, 256, 256)
img2 = torch.randn(1, 3, 256, 256)
dist = loss_fn(img1, img2) # 值越小越相似
评价指标的局限性:没有银弹
你想想看,如果有一个指标能完美评价所有图像,那图像处理早就自动化了。现实是,每个指标都有它的「盲区」。
| 指标 | 局限 | 典型场景 |
|---|---|---|
| PSNR | 对几何失真不敏感,对亮度偏移过于敏感 | 压缩伪影检测失效 |
| SSIM | 对严重模糊不敏感,对纹理变化不敏感 | 去模糊任务中可能虚高 |
| LPIPS | 依赖预训练数据,计算成本高 | 跨域迁移时效果不稳定 |
我个人的经验是:永远不要只依赖一个指标。在项目中,我通常会同时看 PSNR、SSIM 和 LPIPS,再配合主观抽检。如果三个指标趋势一致,那基本稳了;如果出现分歧,就要仔细看具体图像。
知识体系总览
下面这张图,是我梳理的图像质量评价知识框架。你可以把它当作本章的「地图」:
嗯,到这里你应该明白了:图像质量评价不是「选一个指标跑分」那么简单。它更像是一门权衡的艺术——你要在数学精度和人类感知之间找到平衡点。