4、图像融合基础:融合层次与评价指标
各位同学好,我是老张。做图像融合这行十几年了,今天咱们聊聊融合的底层逻辑。
很多人一上来就问我:「张工,哪种融合方法最好?」
说实话,这个问题没法直接回答。你得先搞清楚——你在哪个层次做融合?
4.1 融合的三个层次
图像融合不是只有一种玩法。我个人习惯把它分成三个层次:像素级、特征级、决策级。这三个层次,说白了就是「数据在哪一层合并」的问题。
4.1.1 像素级融合
这是最底层、最直接的融合方式。直接把两幅图像的像素值做运算,比如加权平均、取最大值、取最小值等等。
优点:信息保留最完整,细节最丰富。
缺点:计算量大,对配准精度要求极高。稍微偏几个像素,融合结果就糊了。
4.1.2 特征级融合
先分别从两幅图像中提取特征(比如边缘、角点、纹理),然后在特征空间里做融合。
你想想看,这样做的好处是什么?
- 对配准误差容忍度高一些
- 计算量比像素级小
- 可以针对性地保留重要信息
我在做安防监控项目时,就常用特征级融合。热像图提取高温目标轮廓,可见光图提取纹理细节,然后在特征层合并。效果比像素级稳定得多。
4.1.3 决策级融合
这是最高层次的融合。每幅图像先独立做目标检测或分类,然后对结果做融合决策。
举个例子:热像图检测到一个人形高温区域,可见光图检测到一个人形轮廓,两个结果一综合——嗯,确定是个人。
优点:抗干扰能力强,对传感器故障有容错性。
缺点:信息损失最大,细节基本没了。
| 融合层次 | 信息保留度 | 计算复杂度 | 配准要求 | 典型应用 |
|---|---|---|---|---|
| 像素级 | 高 | 高 | 极高 | 医学影像、遥感 |
| 特征级 | 中 | 中 | 中 | 安防监控、目标检测 |
| 决策级 | 低 | 低 | 低 | 多传感器融合、自动驾驶 |
4.2 融合评价指标
融合做完了,怎么评价好坏?不能光靠眼睛看,得有量化指标。
我常用的指标有四个:熵、互信息、SSIM、VIF。下面一个个说。
4.2.1 熵(Entropy)
熵衡量图像的信息量。熵越大,说明图像包含的信息越丰富。
import numpy as np
def entropy(image):
# 计算直方图
hist, _ = np.histogram(image.flatten(), bins=256, range=[0, 256])
# 归一化
hist = hist / hist.sum()
# 避免log(0)
hist = hist[hist > 0]
# 计算熵
return -np.sum(hist * np.log2(hist))
嗯,这里要注意:熵不是越高越好。如果融合结果全是噪声,熵也会很高。所以熵要结合其他指标一起看。
4.2.2 互信息(Mutual Information, MI)
互信息衡量融合图像与源图像之间的相关性。说白了,就是看融合结果从源图像中「继承」了多少信息。
公式我就不写了,你记住一点:MI越大,融合效果越好。
4.2.3 结构相似性(SSIM)
SSIM衡量两幅图像的相似度,包括亮度、对比度、结构三个维度。取值范围[-1, 1],越接近1越好。
为什么需要SSIM?因为熵和互信息只看信息量,不看结构保真度。你想想看,如果融合结果把目标的形状都扭曲了,信息量再大也没用。
4.2.4 视觉信息保真度(VIF)
VIF是我个人比较偏爱的指标。它模拟人眼视觉系统,评估融合图像的信息保真度。
VIF的优点是:与人眼主观评价一致性很高。缺点是计算慢,不适合实时场景。
| 指标 | 衡量什么 | 取值范围 | 计算速度 |
|---|---|---|---|
| 熵 | 信息量 | [0, 8] | 快 |
| 互信息 | 信息继承度 | [0, +∞) | 中 |
| SSIM | 结构相似性 | [-1, 1] | 快 |
| VIF | 视觉保真度 | [0, +∞) | 慢 |
4.3 经典融合方法
理论讲完了,咱们上点干货。三种经典方法:加权平均、PCA、拉普拉斯金字塔。
4.3.1 加权平均
最简单的方法,没有之一。
def weighted_average(img1, img2, alpha=0.5):
return alpha * img1 + (1 - alpha) * img2
alpha是权重系数。热像图和可见光图融合时,我一般设alpha=0.6,给热像图多一点权重,因为热像图的目标信息更关键。
优点:简单、快速、实时。
缺点:对比度下降,细节模糊。
4.3.2 PCA融合
主成分分析(PCA)的核心思想:找到数据方差最大的方向,把信息集中到主成分上。
具体步骤:
- 将两幅图像拉成向量
- 计算协方差矩阵
- 求特征值和特征向量
- 用第一主成分的系数作为融合权重
from sklearn.decomposition import PCA
def pca_fusion(img1, img2):
# 拉成向量
vec1 = img1.flatten()
vec2 = img2.flatten()
# PCA
pca = PCA(n_components=1)
pca.fit(np.stack([vec1, vec2], axis=1))
# 权重就是第一主成分的系数
w = pca.components_[0]
w = w / w.sum() # 归一化
return w[0] * img1 + w[1] * img2
PCA融合比加权平均好在哪里?权重是自适应计算的,不需要手动调参。
4.3.3 拉普拉斯金字塔
这是我最喜欢的方法。它的思路是:把图像分解成不同频率的子带,然后在每个频率上分别融合。
为什么这样做?因为热像图和可见光图在不同频率上的信息优势不同:
- 低频:热像图的整体亮度分布好
- 高频:可见光图的边缘细节好
拉普拉斯金字塔融合的步骤:
- 构建高斯金字塔(下采样)
- 构建拉普拉斯金字塔(高斯金字塔相邻层相减)
- 每层分别融合(低频用平均,高频用取大)
- 重建图像(从顶层往下叠加)
def laplacian_pyramid_fusion(img1, img2, levels=4):
# 构建拉普拉斯金字塔
pyr1 = build_laplacian_pyramid(img1, levels)
pyr2 = build_laplacian_pyramid(img2, levels)
# 融合
fused_pyr = []
for l in range(levels):
if l == levels - 1: # 最顶层(低频)
fused_pyr.append((pyr1[l] + pyr2[l]) / 2)
else: # 其他层(高频)
fused_pyr.append(np.maximum(pyr1[l], pyr2[l]))
# 重建
return reconstruct_from_laplacian_pyramid(fused_pyr)
嗯,这里要注意:金字塔层数不能太多。我一般用3-5层。层数太多,重建时会有振铃效应。
4.4 本章小结
今天咱们聊了三个核心问题:
- 融合层次:像素级、特征级、决策级,各有各的适用场景
- 评价指标:熵、互信息、SSIM、VIF,别只看一个
- 经典方法:加权平均、PCA、拉普拉斯金字塔,从简单到复杂
我个人建议:刚入门时,先把加权平均和拉普拉斯金字塔玩熟。这两个方法虽然简单,但能帮你理解融合的本质。PCA嘛,等你对数据分布有感觉了再碰。
下一章咱们聊多尺度变换融合,那才是真正的好戏开场。