一、前言:为啥我们需要图像质量评价指标?
不管是图像生成、超分、去模糊、去噪、修复……
只要你改了图,就必须回答一个问题:
改得好不好?画质有没有下降?有没有失真?
靠人眼?太慢、不准、不客观。
靠网络?没法落地。
所以业界搞出了一堆图像质量评价 IQA 指标:
- PSNR
- SSIM
- NIQE
- LPIPS
今天咱们一次性吃透:原理、公式、代码、区别、用法、坑点。
二、第一类:全参考评价指标(有GT图)
2.1 PSNR(峰值信噪比)
最经典、最常用、最简单。
公式
先算 MSE:
MSE=1HWC∑i,j,k(I(i,j,k)−K(i,j,k))2MSE=\frac{1}{HWC}\sum_{i,j,k}(I(i,j,k)-K(i,j,k))^2MSE=HWC1i,j,k∑(I(i,j,k)−K(i,j,k))2
再算 PSNR:
PSNR=10⋅log10(MAXI2MSE)PSNR=10\cdot log_{10}(\frac{MAX_I^2}{MSE})PSNR=10⋅log10(MSEMAXI2)
符号解释:
- H,W,CH,W,CH,W,C:高、宽、通道
- III:预测图
- KKK:真值图
- MAXIMAX_IMAXI:像素最大值(一般255)
通俗解释
算两张图“像素差的平方和”,再转成分贝。
数值越大越好。
优点
- 快
- 简单
- 可导
缺点
完全不贴合人眼感知
有时候图糊得一批,PSNR 还很高。
核心代码
importtorchimporttorch.nn.functionalasFdefpsnr(img1,img2,data_range=1.0):mse=torch.mean((img1-img2)**2)ifmse==0:returntorch.tensor(100.0)return10*torch.log10((data_range**2)/mse)2.2 SSIM(结构相似性)
专门解决 PSNR “不感知”问题。
公式
SSIM(x,y)=(2μxμy+C1)(2σxy+C2)(μx2+μy2+C1)(σx2+σy2+C2)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:均值
- σx\sigma_xσx:方差
- σxy\sigma_{xy}σxy:协方差
- C1,C2C_1,C_2C1,C2:常数,防止除0
通俗解释
对比两张图的亮度、对比度、结构三项相似度。
输出-1 ~ 1,越大越好。
优点
- 比 PSNR 更像人眼
- 超分、去噪标配
缺点
仍然是手工设计,不够完美。
核心代码
defssim(img1,img2,window_size=11,data_range=1.0):C1=(0.01*data_range)**2C2=(0.03*data_range)**2mu1=F.avg_pool2d(img1,window_size)mu2=F.avg_pool2d(img2,window_size)sigma1=F.avg_pool2d(img1**2,window_size)-mu1**2sigma2=F.avg_pool2d(img2**2,window_size)-mu2**2sigma12=F.avg_pool2d(img1*img2,window_size)-mu1*mu2 numerator=(2*mu1*mu2+C1)*(2*sigma12+C2)denominator=(mu1**2+mu2**2+C1)*(sigma1+sigma2+C2)returnnumerator/denominator三、第二类:无参考评价指标(没有GT图)
3.1 NIQE(无参考自然图像质量评价)
完全不需要真值图,只靠统计特征判断画质。
核心思想
自然清晰的图,某些统计量分布是固定的;
模糊、噪声、伪影会让分布偏移。
用自然场景统计模型 + 多元高斯计算距离。
通俗解释
给图像算一套“自然度特征”,
偏离自然统计越远 → 质量越差 →分数越低越好。
优点
- 无参考
- 生成模型、修复、超分神器
缺点
计算慢,对某些场景不友好。
核心代码(调用现成库)
fromskimageimportio,colorfromskimage.metricsimportnormalized_root_mseimportnumpyasnpdefniqe(image):# 输入必须是灰度图 [0,1]iflen(image.shape)==3:image=color.rgb2gray(image)# 调用 skimage 实现returnniqe_score(image)四、第三类:深度感知评价指标
4.1 LPIPS(深度感知图像相似度)
用训练好的CNN(如AlexNet/VGG)提取特征,计算特征距离。
公式
LPIPS=1C∑∣∣ϕ(I)−ϕ(K)∣∣22H,WLPIPS=\frac{1}{C}\sum\frac{||\phi(I)-\phi(K)||_2^2}{H,W}LPIPS=C1∑H,W∣∣ϕ(I)−ϕ(K)∣∣22
符号解释:
- ϕ\phiϕ:预训练网络提取的特征
- 逐通道计算L2距离
通俗解释
让神经网络帮你看“像不像”,
比人眼还准,比SSIM强一大截。
越小越好。
优点
- 目前最贴合感知
- 生成类任务必用
- 超分、修复、GAN 标配
缺点
需要GPU,速度不快。
核心代码
importlpips# 加载模型loss_fn=lpips.LPIPS(net='alex')# 计算defcalculate_lpips(img1,img2):# img1, img2: [-1,1]returnloss_fn(img1,img2)五、四大指标终极对比
表格1:四大指标对比
| 指标 | 类型 | 是否需要GT | 分值趋势 | 速度 | 感知友好 |
|---|---|---|---|---|---|
| PSNR | 全参考 | 是 | 越大越好 | 极快 | 差 |
| SSIM | 全参考 | 是 | 越大越好 | 快 | 中 |
| NIQE | 无参考 | 否 | 越小越好 | 慢 | 良 |
| LPIPS | 深度全参考 | 是 | 越小越好 | 中 | 极强 |
表格2:任务选型推荐
| 任务 | 推荐指标 |
|---|---|
| 超分辨率 | PSNR + SSIM + LPIPS |
| 图像去噪 | PSNR + SSIM |
| 图像修复 | LPIPS + NIQE |
| 图像生成 | FID + LPIPS + NIQE |
| 压缩/增强 | PSNR + SSIM |
六、全文总结(最精炼)
- PSNR:最快,但最不准,只管像素差。
- SSIM:比PSNR像人眼,传统任务标配。
- NIQE:无参考神器,没有GT也能打分。
- LPIPS:目前最感知、最靠谱,深度模型必用。
一句话记住:
传统任务看PSNR/SSIM,
生成任务看LPIPS/NIQE。