1. 先回答一个更底层的问题:融合网络的输出到底拿什么做参照
1.1 超分有真值,融合没有"标准融合图"
做图像融合的人,几乎都被同一个问题卡过:模型训练完了,融合图肉眼看确实不错,但到了写论文、跑对比实验的时候,客观指标一列,自己都说不清哪个数字代表什么。
为什么会这样?因为图像融合和超分辨率、去噪、修复这类低级视觉任务有一个本质区别:你没有 ground truth。超分可以拿高分辨率图当真值,去噪可以拿干净图当真值,分割有 label,检测有框。融合呢?你给我一张可见光图加一张红外图,我应该输出的"标准融合图"长什么样,这个问题本身就没有唯一答案。同一组输入,完全可能存在两张同样合理但风格不同的理想融合结果,一张更偏可见光纹理,一张更偏红外目标,你没法说哪张对。
所以融合评估不像其他任务那样,算一个 PSNR/SSIM 和真值比一比就完事。它需要一套"没有真值也能评"的策略,这也是"通用评估指标"这个词在融合方向特别重要的原因。这里说的通用,指的是不依赖某个具体任务定制逻辑、可以跨多聚焦、多曝光、红外可见光、医学影像等融合场景反复使用的一套指标集合。
1.2 三类评估范式:有参考、半参考、无参考
既然没有真值,那"参考"从哪来?答案是源图像。
这是刚入门时最容易绕晕的概念。很多资料把 SSIM、互信息 MI 这类归成"有参考指标",你以为参考的是融合真值,其实参考的是融合前的多张源图。真正准确的说法是:这类指标衡量的是融合结果与各源图之间的关系,而不是和某个标准答案的关系。
以这个为基础,评估范式大致分三类:
- 有参考类(其实是"依赖源图类"):SSIM、MI、QAB/F、VIF、PSNR 变体。它们通过计算融合图和源图之间的结构相似度、信息量保留程度、边缘传递效率来打分。
- 半参考类:部分指标只需要源图的部分统计信息,比如某频段能量就能估算质量,融合里用得少,常见于视频质量评估。
- 无参考类:只看融合图本身。信息熵 EN、标准差 SD、平均梯度 AG、空间频率 SF,以及 QNR 这种专门为遥感融合设计的无参考指标。
理解了这个分类,你再去看论文里的指标表格,就不会觉得它们是一堆互不相干的数字。每种指标本质上都在回答一个不同的问题:结构像不像?信息留没留住?边缘保没保住?看起来自不自然?
1.3 指标之间为什么经常互相矛盾
这一点值得在开头就讲清楚。融合质量有两个核心维度:信息保持和视觉感知。信息保持关心的是融合图里有没有把所有源图的重要信息都装进来;视觉感知关心的是人眼看着舒不舒服、有没有伪影、纹理是否自然。
这两个目标不是总一致的。一张融合图如果做了强锐化,视觉上可能很清晰,但边缘周围会出现伪影;如果做平滑降噪,结构很干净,但纹理细节和信息量又下降了。于是你会发现:锐化过的融合图 AG 和 SF 很高,SSIM 却偏低;平滑过的图 SSIM 还行,互信息 MI 却掉下去了。指标打起来架,不是写错了,是它们本身衡量的就是不同性质。
所以后面提到的每一种指标,我都会把它的偏向性讲清楚,再给你一个配合使用的思路,而不是丢一堆公式让你自己琢磨。
2. 高频评估指标逐个拆解:数学直觉与最小实现
2.1 结构相似性 SSIM:融合论文的"标配"之一
SSIM 是 Wang 等人提出的结构相似性指标,核心假设是人眼对图像的感知主要来自局部结构的对比,而不是逐像素差值。它把一个图像块分解成三个分量:亮度、对比度、结构,然后分别比较。公式核心大致是:
[ 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)} ]
其中 (\mu) 是均值,(\sigma) 是方差,(\sigma_{xy}) 是协方差,(C_1,C_2) 是防除零的小常数。这个公式说明三件事:均值接近代表亮度保留得好;方差接近代表对比度保留得好;协方差高代表结构变化一致。
在融合评估里,SSIM 不是直接把融合图和一个真值比,而是分别算 (SSIM(a,f)) 和 (SSIM(b,f)),再做一个平均或加权操作。常见做法是取两者均值,也有论文用最大值,认为融合图只要很好地保留了某一侧的结构就算成功。我个人在做多聚焦融合对比时更推荐均值,因为最大值策略会掩盖掉另一张源图信息丢失的事实。
Python 里用 scikit-image 实现非常直接:
from skimage.metrics import structural_similarity as ssim score_a = ssim(img_a, img_f, data_range=255, win_size=11) score_b = ssim(img_b, img_f, data_range=255, win_size=11) score = (score_a + score_b) / 2.0这个指标之所以被广泛接受,是因为它对轻微噪声不敏感,与人眼的结构感知比较吻合。但它也有一个明显短板:窗口平均会把局部细节磨掉,两张图如果整体亮度结构很接近但局部纹理差异很大,SSIM 仍然可能给出高分。所以单独拿 SSIM 作为网络优劣的唯一依据,很容易翻车。
2.2 互信息 MI:用信息论量化"保留了多少源图信息"
互信息衡量的是两个变量之间的统计相关性,用在融合评估里,表达的是融合图像 (f) 从源图 (a) 和 (b) 中继承了多少信息。它的定义来自信息熵:
[ MI(a,f) = H(a) + H(f) - H(a,f) ]
其中 (H(\cdot)) 是信息熵,(H(a,f)) 是联合熵。融合总互信息通常写成:
[ MI_{total}(a,b,f) = MI(a,f) + MI(b,f) ]
实现思路是先对图像灰度做离散化,统计联合直方图,再算熵。一个用 NumPy 写的最小实现大概是这样的:
import numpy as np def mutual_information(img_x, img_y, bins=256): hist_xy, _, _ = np.histogram2d( img_x.ravel(), img_y.ravel(), bins=bins, range=[[0, 255], [0, 255]] ) p_xy = hist_xy / hist_xy.sum() p_x = p_xy.sum(axis=1, keepdims=True) p_y = p_xy.sum(axis=0, keepdims=True) h_x = -(p_x * np.log2(p_x + 1e-12)).sum() h_y = -(p_y * np.log2(p_y + 1e-12)).sum() h_xy = -(p_xy * np.log2(p_xy + 1e-12)).sum() return h_x + h_y - h_xy注意上面代码里我加了一个 (1e-12) 的 epsilon,防止 log 0 报错,这是实际写评估脚本时最容易漏的问题。
互信息的好处是它不关心像素具体长什么样,只关心灰度分布的对应关系,所以对跨模态图像融合特别友好——红外图和可见光图在像素级别差异很大,但在统计相关性上仍然能反映出信息是否被保留。缺点是它是全局统计,完全忽略空间结构。两张图一张左亮右暗,一张左暗右亮,只要灰度分布相同,MI 可能算出来一样。另外直方图 bins 的选取对结果影响很大,后面踩坑部分会细讲。
2.3 QAB/F:基于边缘信息传递的融合质量指标
QAB/F 是 Xydeas 和 Petrovic 提出的边缘信息保持度指标,全称是 gradient-based fusion performance。它的基本逻辑是:人眼对图像的理解很大程度上依赖边缘和轮廓,所以只要融合图把源图里的边缘信息完整"搬运"过来,就可以认定融合质量高。
计算过程分四步:
- 用 Sobel 算子分别提取源图 (a)、(b) 和融合图 (f) 的边缘强度 (g) 和边缘方向 (\alpha)。
- 对源图 (a) 和融合图 (f) 的每个像素,计算边缘强度保持系数 (Q_g^{af}) 和方向保持系数 (Q_\alpha^{af})。保持系数通过比较 (g) 的比值接近 1 的程度、(\alpha) 的角度差大小来得到,一般会套一个 sigmoid 形式的函数,让比值越接近 1、角度差越小时分数越高。
- 将两者相乘得到该像素的边缘信息保持度 (Q^{af} = Q_g^{af} \cdot Q_\alpha^{af})。
- 对 (a) 和 (f)、(b) 和 (f) 分别计算加权平均,权重一般取源图边缘强度:
[ Q^{AB/F}=\frac{\sum_{i,j}(Q^{af} w^a_{ij} + Q^{bf} w^b_{ij})}{\sum_{i,j}(w^a_{ij}+w^b_{ij})} ]
这个指标最容易被新手忽略的是:它计算前需要把图像转成灰度,并且对图像中的噪声非常敏感。Sobel 算子本质上是一种高通滤波,如果融合图里有细小的伪影或噪声,这些高频成分会被当成边缘,干扰后续的强度和方向估计。实测下来,QAB/F 对轻微模糊最敏感,融合图只要稍微偏平滑,分值明显下降,因此它特别适合作"清晰度"维度的主指标。
2.4 感知类指标的借调逻辑:VIF、LPIPS 与深度学习特征
传统指标之后,这几年越来越多人把图像质量评价里的感知指标直接搬到融合评估里。VIF(Visual Information Fidelity)是其中一个代表。它基于自然场景统计模型,衡量融合图像中有多少视觉信息被"保真"地传递给了人眼。VIF 的好处是它有一个完整的 HVS 模型,坏处是实现复杂、参数多,不同开源实现的结果有差异。
更受年轻研究者欢迎的是 LPIPS(Learned Perceptual Image Patch Similarity)。LPIPS 先把图像送进一个预训练的 VGG 或 ResNet,提取多层特征,然后计算两张图在特征空间的距离,值越低代表感知上越接近。在融合任务中使用 LPIPS,一般做法是把融合图和每张源图计算 LPIPS,取平均作为一项附加指标,用来衡量融合结果和源图在语义特征层面的"符合程度"。
我在实际测试中发现,LPIPS 对医学影像这种和 ImageNet 分布差异较大的数据非常不稳定,同一个结果在 ImageNet 预训练 VGG 下可能得分不错,换医学数据训练的模型就完全对不上感觉。所以这个指标更适合自然图像场景,跨领域使用需要谨慎解释。
2.5 无参考统计指标:信息熵、标准差、平均梯度、空间频率
这几个指标看起来简单,但它们是"保底配置",几乎所有融合论文都会附上。
信息熵 EN 描述融合图包含的信息量,直接计算灰度直方图分布的信息熵:
[ EN = -\sum_{i=0}^{255} p_i \log_2 p_i ]
标准差 SD 衡量图像对比度,灰度分布越分散,标准差越大。平均梯度 AG 是像素级梯度幅度的均值,空间频率 SF 是行方向频率和列方向频率的均方根:
[ SF = \sqrt{\frac{1}{MN}\sum_{i,j}\left(RF^2 + CF^2\right)} ]
其中 RF 是行差分频率,CF 是列差分频率。
它们的共同优点是计算简单、稳定、不需要源图参与,适合做消融实验里的辅助证据。共同缺点是很容易被"骗":一张加了很多椒盐噪声的融合图,因为灰度分布被噪声打散,EN 和 SD 反而很高;一张边缘过度锐化的图,AG 和 SF 也会虚高。所以这类无参考指标只适合横向比较,不适合作为质量好坏的绝对标准。
3. 面对不同融合任务,指标选型的差异比想象中大
3.1 同类源图像融合:多聚焦、多曝光场景的指标偏好
多聚焦融合和多曝光融合的输入源图来自同一个传感器,只是成像参数不同。这类任务里,源图之间天然具有强烈的结构一致性,像素分布也处在相似的动态范围,所以几乎传统指标都能用。
多聚焦融合还有一个额外优势:很多数据集可以用景深渲染原理合成带真值标签的数据,于是部分论文会直接在这些合成数据上计算 PSNR 和 SSIM,把它们当成有真值任务来做。这没有问题,但我建议同时报告 QAB/F,因为合成数据往往过于理想,真值 SSIM 高不代表真实场景下同样有效。
多曝光融合因为涉及亮度域的变化,我一般会额外关注 VIF 这类感知指标,单纯的 MI 在曝光差异大时意义有限。曝光差异主要体现在局部过曝或欠曝区域,而这些区域的灰度被压缩到边界,直方图统计难以反映细节保留情况。
3.2 跨模态融合:红外可见光、医学影像的指标偏好
跨模态融合是另一个典型场景,输入来自完全不同物理原理的传感器:可见光提供纹理、颜色和背景细节,红外提供热辐射目标信息,医学 MRI/PET 更是结构图和功能图的组合。
这种任务里,源图之间的灰度分布几乎没有直接可比性,因此 I 类指标(灰度结构相似度)就不如信息论指标好用。互信息 MI 因为只依赖统计分布,能较好反映跨模态信息保留。QAB/F 同样适用,因为边缘在跨模态图像里依然是语义上有意义的特征——热目标边缘、解剖结构边缘都存在。
我在做红外可见光融合测试时,通常会把 MI 和 QAB/F 作为主指标,SSIM 作为辅助参考。同时因为红外图和可见光图的分辨率往往不一致,做指标计算前必须先把两者 resize 到同一尺寸,这一步很多复现代码没有处理好,结果会出现离谱误差。
3.3 我给不同任务开出的"指标套餐"
实际操作中,我不支持追求指标越多越好。指标越多,矛盾和不确定因素越多。你应该根据任务特性选择 3 到 4 个核心指标,再配合可视化主观对比,构成一个完整评估方案。下表是给不同任务类型的参考搭配:
| 任务类型 | 主指标 | 辅助指标 | 说明 |
|---|---|---|---|
| 多聚焦融合 | QAB/F、SSIM | SF、EN | 重点看边缘清晰度和结构保持 |
| 多曝光融合 | VIF、SSIM | AG、EN | 关注视觉自然感和信息量 |
| 红外可见光融合 | MI、QAB/F | EN、SF | 信息保留与目标边缘是关键 |
| 医学图像融合 | MI、QAB/F | SSIM、SD | 解剖细节不可丢失,边缘谨慎处理 |
| 遥感全色锐化 | QNR | SAM、ERGAS | 空间与光谱保真要同时评估 |
QNR 是一个专门为遥感全色锐化设计的无参考指标,它不需要融合真值,通过分析融合图与多光谱源图的空间一致性和光谱一致性来判断质量。这个指标不适用于自然图像融合,却是遥感方向投稿的硬通货。如果你做的是遥感融合,建议直接单独使用 QNR 家族指标。
4. 实验环节最容易翻车的五个细节
4.1 归一化和位深的"隐形雷区"
这是我见过最频繁的翻车点,而且坑得非常隐蔽。很多公开数据集里的图像是 uint8 格式,像素范围 0 到 255,但也有一些是我们自己处理出来的浮点图,范围可能是 0 到 1。如果你直接用同一套脚本计算 SSIM,data_range 参数如果传错,结果会差得很离谱。
例如 scikit-image 的 structural_similarity 要求显式指定 data_range:
# 正确做法:uint8 图像 score = ssim(img_a, img_f, data_range=255) # 错误做法:uint8 图像却按 0-1 范围计算 score = ssim(img_a, img_f, data_range=1.0) # 结果会严重偏低另外一个更隐蔽的问题:模型输出经常是 0 到 1 的浮点图,很多复现脚本直接用它算指标。但如果你在指标计算前做了一次 gamma 校正或 clip 操作,几次操作叠加之后,你的指标反映的就不再是网络性能,而是后处理参数。正确做法是:在论文里明确写出指标计算使用的像素范围,并保证所有对比方法都走同一条后处理管线。
4.2 直方图 bins 和梯度阈值这类参数的敏感性
互信息的 bins 选择是典型例子。同一个融合结果,用 256 bins 算 MI 可能是 3.2,用 64 bins 可能变成 2.5,而且不同 bins 下方法排名还可能发生变化。原因是 bin 数决定了直方图的粗糙程度:bin 太稀疏,灰度细节被合并,熵被低估;bin 太密集,联合直方图大量为空,估计不稳定。
我的经验是:有参考对比实验时,全数据集统一用 256 bins,不要每张图单独调整。对于高分辨率图像(超过 1024×1024),可以降到 128 bins 提速,但不建议低于 128。
QAB/F 默认实现里有两个灵敏度参数 p 和 k,它们控制了强度保持系数和方向保持系数的 sigmoid 陡峭程度。很多开源实现直接用默认值,但如果是低对比度医学图像,边缘强度普遍偏低,直接用默认参数会得到偏低的 QAB/F。我建议在正式跑实验前,先用两张典型图画一下边缘强度直方图,看分布是否合理,必要时再统一调整。切记所有对比方法必须使用同一套参数,不要为了自己方法刷高分而单独改参数,审稿人查出来会很麻烦。
4.3 SSIM 在灰度、多通道计算上的口径问题
处理彩色图像时,SSIM 有两种计算口径:直接在 RGB 三通道上算,或者先转 YCbCr 只算亮度分量。用不同口径得到的结果差异能达到 0.01 以上,这个数字在论文对比表里已经足够影响排名。
我的建议是:所有对比统一使用灰度口径,也就是先转 YCbCr,只对 Y 通道计算指标。原因有两个:一是 SSIM 本身是基于亮度感知设计的,色度通道对结构判断贡献小;二是很多公开数据的评测脚本都默认转灰度,转灰度后你的结果才和别人报告的数字可比。
如果你一定要用三通道计算,skimage 需要显式传 channel_axis:
score_rgb = ssim(img_a, img_f, data_range=255, channel_axis=-1)但请注意,这个计算结果是三通道的均值,和灰度口径的结果不能混着比较。
4.4 指标互相打架时,应该怎么办
这是所有做融合的人都会遇到的时刻:你的方法在 QAB/F 上领先了 0.02,MI 却比 baseline 低了 0.15;另一篇论文的指标组合里 SSIM 很高,但你复现出来的 EN 却一般。出现这种情况,不要第一时间怀疑代码写错,而要认真分析指标背后的含义。
我总结了一个非常实用的"指标打架解读表":
| 现象 | 可能原因 | 建议分析方向 |
|---|---|---|
| SSIM 高、MI 低 | 融合图过于平滑,结构保留但细节纹理被抹掉 | 检查融合图是否丢失高频纹理,GT 边缘是否变糊 |
| EN 高、QAB/F 低 | 噪声或伪影抬高了熵,边缘被污染 | 用细节放大图查看是否存在振铃或椒盐噪声 |
| AG 高、SSIM 低 | 边缘过度锐化,产生伪边缘 | 检查是否做了额外锐化后处理 |
| MI 高、SF 低 | 灰度分布接近但空间细节贫乏 | 可能融合策略偏向平均,细节被压制 |
写论文时,如果某个指标不占优势,不要回避它。更专业的做法是:承认该指标反映的维度上当前方法有局限,并解释这是模型设计中的某种权衡。这比故意少报一个指标要可信得多。
4.5 开源实现之间的"不可比"问题
融合评估指标的开源实现五花八门,Matlab 有经典 Image Fusion Toolbox,Python 有各种零散脚本,不同实现之间对边界条件、卷积 padding、图像边界处理的策略不同,算出来的结果能差出好几个百分点。
我踩过一次很深的坑:用 Matlab 版 QAB/F 算出来的 baseline 分数和用某个 Python 复现算出来的差 0.05,当时以为模型出了问题,折腾了一整天才发现两个实现对边缘像素的处理策略不同。后来我定了一条规则:同一篇论文里所有指标统一用同一套代码计算,不混用多个开源实现,并在论文的实验设置里明确写清楚"所有指标均使用我们统一实现的评估脚本"。
如果你要兼容已有发表的对比数字,只比较对方论文里明确公布了数值的指标,不做二次复现指标的横向拼凑。
5. 论文报告指标时的规范与最新趋势
5.1 传统"六件套"还能打多久
目前融合方向论文里最常见的指标组合是 MI、QAB/F、SSIM、PSNR、EN、SF,俗称六件套。这套组合之所以长盛不衰,是因为审稿人熟悉它们,而且一个表格里同时放上信息类、结构类、无参考类指标,看起来比较全面。
但近两年有明显信号表明这套组合在松动。一些高水平论文开始把 LPIPS、DISTS、DeepSim 这类基于深度特征的感知指标加进表里,专门用来评估融合结果的语义一致性。原因也很直接:传统指标在像素和 shallow 边缘层面打转,难以反映深度网络在不同尺度上的语义损失,而 LPIPS 在特征空间计算距离,能捕捉到传统指标看不见的语义漂移。
我个人的判断是:未来两年,融合评估大概率会演变成"传统指标 + 感知指标"双层结构。如果你现在开始做融合方向的投稿,建议至少补一个 LPIPS 或 DISTS 结果,这不仅增加说服力,也能应对审稿人对指标体系的追问。
5.2 只看均值不看方差,容易被审稿人攻击
很多同学的对比表只有一个均值数字,没有方差,没有显著性检验,这个在审稿人眼里是明显漏洞。两个方法在 QAB/F 上差 0.005,如果没有统计检验,谁也不能说明这个方法真的更好。
处理方式并不复杂:固定测试集不变,同一个方法跑多次(或对 Dataloader 做不同的随机裁剪),记录每一次的指标值,最后报告 mean ± std。如果计算资源有限,至少要做到对测试集逐张图给出指标列表,然后用配对 t 检验或 Wilcoxon 符号秩检验衡量两个方法之间的差异是否显著。
另外关于最优指标排名:不要只加粗自己方法所有的最高分。审稿人看到所有指标全是最优,第一反应不是你有多强,而是你只挑了有利的测试集并做了针对性调参。更稳妥的是,在对比表里同时暴露一些次优指标,并在正文里解释权衡,这反而显得严谨。
5.3 一套相对稳妥的完整评估方案
回到标题说的问题:图像融合网络的通用评估指标,怎么搭配才足够严谨。
我在多个融合项目里跑下来,总结了一套兼具说服力和可复现性的方案:
- 核心指标固定选四个:QAB/F、SSIM、MI、EN,分别覆盖边缘、结构、信息、内容量四个维度。
- 依据任务类型补一个专项指标:多聚焦补 SF,多曝光补 VIF,医学补 SD,遥感换 QNR。
- 新增一个感知类指标:自然图像任务建议 LPIPS,有条件和数据支持可以再加 DISTS。
- 所有指标统一数据位深、统一代码实现、统一参数。
- 除了一张全局指标表,再额外给三张典型图的局部放大对比,以及至少一位观察者做主观评分。
这套组合不是最省事的,但它在审稿人眼里是完整且严谨的。尤其最后一条主观对比非常关键。客观指标再全面,也不能替代人眼对融合伪影的感知。很多指标高分的方法在局部放大图上会出现明显的颜色偏移或边缘荧光,这种问题只有可视化才能暴露。
代码层面,下面是我常用的计算模板,融合进你自己的流程里稍作修改即可:
import numpy as np from skimage.metrics import structural_similarity as ssim def compute_fusion_metrics(img_a, img_b, img_f, data_range=255): # 统一转灰度 if img_a.ndim == 3: img_a = rgb_to_y(img_a) img_b = rgb_to_y(img_b) img_f = rgb_to_y(img_f) ssim_score = (ssim(img_a, img_f, data_range=data_range) + ssim(img_b, img_f, data_range=data_range)) / 2.0 mi_score = (mutual_information(img_a, img_f) + mutual_information(img_b, img_f)) / 2.0 qabf_score = edge_based_fusion_quality(img_a, img_b, img_f) en_score = image_entropy(img_f) return { "SSIM": ssim_score, "MI": mi_score, "QAB/F": qabf_score, "EN": en_score }这段模板没写 rgb_to_y 和 edge_based_fusion_quality 的完整实现,因为后者涉及多步滤波和方向统计,篇幅太长,你可以在官方图像融合工具箱里找到成熟实现。关键是保持所有对比方法走完全相同的函数。
5.4 最后的一点个人经验
回到开头说的那段尴尬经历。后来我复盘那次实验发现,SSIM 差 0.003 是因为复现 baseline 时把边缘 padding 方式搞错了,MI 高 0.1 是因为我的网络确实在纹理细节上保留得更好,而 QAB/F 对不上是因为两个工具包对 Sobel 边缘的归一化方式不同。三件事混在一起,搞得我一度怀疑模型本身。
这件事给我的教训是:图像融合的评估环节,与其说是找一堆指标证明"我的方法最强",不如先建立一套对自己完全透明的评估管道。跑任何实验之前,先把所有指标的输入输出、参数含义、数据范围固定下来,甚至可以先在几张已知好坏的图上做 sanity check,确认指标能正确反映好坏趋势,再拿去做正式对比。
评估指标是手段,不是目的。一个指标的组合再漂亮,也不如融合结果本身经得起人眼推敲。把指标当成帮助你发现问题、定位短板的工具,而不是论文里用来装点门面的数字,你会发现很多训练阶段的调参决策也会变得更清晰。这也是我在多次踩坑之后最想告诉你的经验。