ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

图像融合评估指标Qabf、CC、SCD、Nabf、Qcv详解与实战

图像融合评估指标Qabf、CC、SCD、Nabf、Qcv详解与实战

简介:这份资源是面向图像融合方向的Matlab评估代码仓库,适合计算机、电子信息工程、数学等专业的学生用于课程设计、期末大作业与毕业设计,也便于科研入门者快速验证融合算法效果。包内共31个文件,以24个m脚本为核心,另含3张png结果示意图、2个txt说明、1个md文档与1个xlsx数据表,压缩包约188KB,体积轻便、便于携带与二次修改。代码采用参数化编程,关键参数集中可调,注释清晰、思路明确,并附赠案例数据,可直接在Matlab 2014、2019a及2024a等版本中运行。评估指标覆盖EN、CE、MI、FMI系列、PSNR、MSSSIM、RMSE、SF、SD、方差、EI、AG、VIF以及Qcb、Qabf、CC、SCD、Nabf、Qcv等,基本涵盖信息论、统计与边缘感知等主流维度。目前已有121人学习下载,读者可据此搭建统一评测流程,对比不同融合算法表现,并借助示例数据快速复现与排错。

1. 图像融合评估仓库里的 Qabf、CC、SCD、Nabf、Qcv 到底在算什么

做图像融合的人大多有过这种经历:算法跑完,两张源图合成一张,肉眼看着挺清楚,可一写论文就卡在评价环节——PSNR、SSIM 是给单图复原用的,直接搬到融合图上并不合适。于是你会去找一套专门给融合图打分的指标,Qabf、CC、SCD、Nabf、Qcv 这几个缩写就会反复出现。它们不是随便起的名字,而是一组从不同角度衡量融合质量的度量:Qabf 看边缘信息保留得怎么样,CC 看融合图和源图的相关程度,SCD 看融合图相对源图多了多少信息,Nabf 走的是噪声感知的评估路线,Qcv 则偏向对比度和视觉敏感度。一个叫「图像融合评估的仓库」的压缩包,把这些指标的实现收在一起,本质上是给做融合算法的人一套可复用的打分工具。这篇笔记就顺着这个仓库的定位,把每个指标在算什么、怎么在本地跑通、参数怎么调、哪里容易翻车讲清楚,适合正在写融合方向论文或做工程验证的人照着复现。

2. 五个指标各自在算什么:从边缘到相关性的评估逻辑

2.1 Qabf 与 Nabf:梯度域里的信息保留度

Qabf 全称是 Gradient-based Fusion Performance,核心思路是拿源图的梯度信息当参照,看融合图里保留了多少。它先对每张源图算梯度幅值和方向,再和融合图对应位置的梯度做比较,得到一个局部相似度,最后按显著性加权平均。显著性高的区域(边缘、纹理)权重更大,所以 Qabf 对边缘模糊特别敏感。Nabf 是它的噪声感知版本,在梯度计算前多了一步噪声估计,把源图里本来就存在的噪声区域降权,避免把噪声当成有用信息来打分。两者实现上共用大部分梯度算子,区别在权重图怎么生成。

实际用的时候,Qabf 的数值范围通常在 0 到 1 之间,越接近 1 说明边缘保留越好。但要注意,Qabf 对源图本身的清晰度有依赖,如果源图就是模糊的,融合图再清晰也拿不到高分,因为参照物本身不行。Nabf 在红外与可见光融合场景里更稳,因为红外图往往噪声大,普通 Qabf 会被噪声带偏。

2.2 CC 与 SCD:相关性与差异信息的两种视角

CC 是 Correlation Coefficient,算的是融合图和每张源图的相关系数,然后取平均或加权。它衡量的是融合图在整体亮度分布上和源图有多像。CC 高不代表融合好,因为一张和源图几乎一样的图 CC 会很高,但融合的意义在于整合信息,不是复制。所以 CC 通常和别的指标一起看,单独用容易误判。

SCD 是 Sum of Correlation Differences,思路更细:它分别算融合图与两张源图的差值图,再对这些差值图求相关性。差值图反映的是融合图相对源图新增或丢失的结构。SCD 越大,说明融合图从两张源图里各自提取了不同的信息并整合进来。SCD 对配准误差很敏感,源图没对齐时差值图全是错的,SCD 会虚高或虚低,这点后面避坑章节会展开。

2.3 Qcv:对比度与视觉敏感度加权的评估

Qcv 走的是人类视觉系统路线,先算融合图的局部对比度,再用对比度敏感度函数加权,最后归一化。它回答的问题是:人眼看这张融合图,对比度是否舒服、细节是否可辨。Qcv 在医学图像融合里用得比较多,因为医生看片更依赖对比度而不是绝对亮度。Qcv 的缺点是计算量大,局部窗口滑动加敏感度函数,图大时跑得慢,工程上常降采样后再算。

2.4 指标选型的实际判断

五个指标没有哪个是万能的。做红外可见光融合,Qabf 和 Nabf 是主力,SCD 辅助看信息整合,CC 用来排查是否过度复制某张源图,Qcv 看最终视觉效果。做多聚焦融合,Qabf 和 Qcv 更关键,因为聚焦区域就是靠对比度和梯度区分。做医学融合,Qcv 和 SCD 优先。选型时先明确融合任务的目标,再挑两到三个指标组合,不要一股脑全上,全上反而看不出问题在哪。

3. 把仓库跑起来:环境、目录与最小调用

3.1 环境准备与依赖确认

这类评估仓库通常是 MATLAB 和 Python 混合的,MATLAB 版本指标实现全但需要授权,Python 版本轻量但部分指标要自己补。先确认你手上是哪种。如果是 Python,常见依赖是 numpy、scipy、opencv-python、scikit-image。建议用虚拟环境隔离,避免和已有项目冲突。

python -m venv fusion_eval_env source fusion_eval_env/bin/activate # Windows 用 fusion_eval_env\Scripts\activate pip install numpy scipy opencv-python scikit-image

这三行做完,基础环境就有了。numpy 和 scipy 负责矩阵运算和卷积,opencv 读图,scikit-image 提供部分滤波函数。如果仓库里有 requirements.txt,优先用它,版本冲突少。

3.2 目录结构与文件对应关系

解压后一般能看到类似这样的结构:主目录下分 metrics 文件夹放各指标实现,utils 放读图和预处理,examples 放测试图对,还有一个 run_eval 入口脚本。metrics 里通常一个指标一个文件,比如 qabf.py、cc.py、scd.py、nabf.py、qcv.py。examples 里会有红外图、可见光图、融合结果图三张一组。先别改代码,用自带示例跑一遍,确认能出数。

import cv2 import numpy as np from metrics.qabf import qabf from metrics.scd import scd # 读图统一转灰度,融合评估大多在灰度域做 ir = cv2.imread('examples/ir.png', cv2.IMREAD_GRAYSCALE).astype(np.float64) vis = cv2.imread('examples/vis.png', cv2.IMREAD_GRAYSCALE).astype(np.float64) fused = cv2.imread('examples/fused.png', cv2.IMREAD_GRAYSCALE).astype(np.float64) # 归一化到 0-1,多数指标实现假设输入在这个范围 ir, vis, fused = ir / 255.0, vis / 255.0, fused / 255.0 print('Qabf:', qabf(ir, vis, fused)) print('SCD:', scd(ir, vis, fused))

这段代码的关键点有三个:读图必须转灰度,因为梯度类指标在彩色图上算会引入通道间干扰;归一化到 0-1 是多数实现的隐含假设,不归一化数值会偏;调用顺序按指标函数签名来,一般是源图1、源图2、融合图。跑通后你会看到两个浮点数,这就是基线分数。

3.3 批量评估与结果汇总

单张跑通后,实际项目里要批量。写个循环遍历文件夹,把每组的三个文件名对应起来,结果存 CSV。

import os import csv results = [] base = 'examples' for name in os.listdir(base): if name.endswith('_fused.png'): prefix = name.replace('_fused.png', '') ir = cv2.imread(f'{base}/{prefix}_ir.png', cv2.IMREAD_GRAYSCALE) / 255.0 vis = cv2.imread(f'{base}/{prefix}_vis.png', cv2.IMREAD_GRAYSCALE) / 255.0 fused = cv2.imread(f'{base}/{name}', cv2.IMREAD_GRAYSCALE) / 255.0 row = {'name': prefix, 'qabf': qabf(ir, vis, fused), 'scd': scd(ir, vis, fused)} results.append(row) with open('eval_results.csv', 'w', newline='') as f: writer = csv.DictWriter(f, fieldnames=['name', 'qabf', 'scd']) writer.writeheader() writer.writerows(results)

命名约定是批量评估的前提,源图和融合图用统一前缀加后缀区分,脚本才能自动配对。CSV 方便后续用 pandas 做统计和画图。如果仓库自带的命名不一样,改 replace 里的后缀即可,别去改指标代码。

4. 参数怎么设:窗口、归一化与显著性权重

4.1 局部窗口大小的选择

Qabf、Nabf、Qcv 都涉及局部窗口,窗口大小直接影响分数。窗口太小,梯度估计噪声大,分数波动;窗口太大,边缘定位模糊,分数偏低。常见默认值是 3x3 或 5x5。3x3 对细纹理敏感,适合多聚焦融合;5x5 更稳,适合红外可见光这种边缘较粗的场景。改窗口一般在指标函数入口参数里,比如 qabf(ir, vis, fused, win=5)。改完要重新跑基线,别拿不同窗口的分数直接比。

4.2 归一化方式与数值范围

不同仓库对输入范围的假设不一样。有的要求 0-255 整数,有的要求 0-1 浮点。判断方法很简单:看指标函数里有没有除以 255 或乘以 255 的操作。如果没有,而你的图是 0-255,梯度值会大得离谱,分数直接失真。稳妥做法是统一转 0-1 浮点再传入,绝大多数实现都兼容。如果分数出现负数或大于 1 很多,先查归一化。

4.3 显著性权重的调整

Qabf 和 Nabf 里的显著性权重决定哪些区域对最终分数贡献大。默认实现通常用局部方差或梯度幅值当显著性。如果你的融合任务特别关注某个区域(比如医学里的病灶区),可以传入自定义权重图。但要注意,自定义权重后分数就不能和文献里的默认值直接比了,只能自己前后对比。工程上我一般先用默认权重跑一遍,确认趋势后再决定要不要定制。

参数常见取值影响调整建议
局部窗口3x3 / 5x5小窗口噪声敏感,大窗口边缘模糊细纹理用 3,粗边缘用 5
输入范围0-1 浮点不归一化导致分数失真统一转 0-1
显著性权重方差 / 梯度决定区域贡献默认优先,定制需谨慎
降采样比例1 / 2影响 Qcv 速度大图降采样后再算

5. 避坑与排查:配准、灰度与数值异常

5.1 源图没配准导致 SCD 虚高

现象:SCD 分数异常高,但融合图肉眼看着一般。原因:两张源图没对齐,差值图里全是错位边缘,相关性计算把这些错位当成了新增信息。解决:评估前先做配准,用特征点匹配或光流对齐,确认源图在空间上一致再算 SCD。配准误差控制在 1 像素以内,SCD 才可信。

5.2 彩色图直接传入导致梯度指标失真

现象:Qabf 分数偏低且波动大。原因:彩色图三通道分别算梯度再平均,通道间梯度方向不一致,互相抵消。解决:统一转灰度再算,或者用亮度通道。融合评估的梯度类指标几乎都假设灰度输入,彩色图要么转灰度,要么明确用哪个通道。

5.3 输入未归一化导致分数越界

现象:Qabf 大于 1 或 CC 出现负值。原因:输入是 0-255,指标内部没做归一化,梯度幅值过大。解决:传入前除以 255,或者查指标实现里有没有归一化步骤,没有就自己加。归一化后分数回到合理范围。

5.4 窗口大小不一致导致横向对比失效

现象:自己的 Qabf 比文献低很多。原因:文献用 3x3 窗口,你用 5x5,或者反过来。解决:对比前确认窗口大小一致,论文里通常会在实验设置里写明。自己实验时固定一个窗口,所有方法用同一套参数。

5.5 Qcv 在大图上跑得极慢

现象:Qcv 计算耗时几分钟甚至更久。原因:局部对比度加敏感度函数,逐像素滑动,复杂度高。解决:先降采样到长边 512 再算,或者用积分图加速。降采样后分数会有小幅变化,但趋势一致,工程上可接受。

6. 进阶技巧:用指标反推融合算法的短板

跑完指标不是终点,指标的价值在于定位问题。我的习惯是先把五个指标排成一张表,看哪个明显偏低。Qabf 低说明边缘保留差,回去查融合规则是不是过度平滑;SCD 低说明信息整合不足,看权重图是不是偏向单张源图;CC 过高说明融合图太像某张源图,可能另一张源图的信息没进来;Qcv 低说明对比度不够,检查亮度映射曲线。有一次我做的红外可见光融合 Qabf 一直上不去,查了两天以为是梯度算子问题,最后发现是可见光图预先做了降噪,边缘被磨掉了,源图本身梯度就弱,换了一张没降噪的源图,Qabf 直接涨了 0.08。这个血泪经验告诉我,评估之前先检查源图质量,别让预处理把评估基准毁了。

另一个技巧是用指标做消融。改一个融合参数,跑一遍全部指标,看哪个指标响应最明显,那个指标就是这个参数的主要影响维度。比如调整融合权重后 SCD 变化最大,说明权重主要影响信息整合量。这样几轮下来,你对每个参数的作用就有数了,写论文时实验分析也有的说。

验证指标实现是否正确,可以用极端输入:把融合图直接设成源图1,Qabf 应该接近源图1 的自相似分数,SCD 应该接近 0,CC 应该接近 1。如果不符合,说明实现或调用有问题。这个自检方法我每次换仓库都会先跑一遍,比看文档快。

最后说个习惯:评估脚本和融合算法分开跑,融合结果存成图,评估脚本只读图。这样换算法不用动评估代码,换评估指标也不用重跑融合算法。中间用统一命名约定衔接,省得每次重新配对。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进