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越大,融合效果越好

💡 个人经验:我在做红外与可见光融合时,MI值低于1.5的基本都是垃圾融合。好的融合结果,MI通常在2.0以上。

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)的核心思想:找到数据方差最大的方向,把信息集中到主成分上。

具体步骤:

  1. 将两幅图像拉成向量
  2. 计算协方差矩阵
  3. 求特征值和特征向量
  4. 用第一主成分的系数作为融合权重
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融合比加权平均好在哪里?权重是自适应计算的,不需要手动调参。

⚠️ 注意:PCA假设数据是线性的。如果热像图和可见光图的分布差异很大,PCA效果会打折扣。我曾经在强噪声场景下用PCA,结果权重全偏到噪声小的那张图上去了。

4.3.3 拉普拉斯金字塔

这是我最喜欢的方法。它的思路是:把图像分解成不同频率的子带,然后在每个频率上分别融合。

为什么这样做?因为热像图和可见光图在不同频率上的信息优势不同:

  • 低频:热像图的整体亮度分布好
  • 高频:可见光图的边缘细节好

拉普拉斯金字塔融合的步骤:

  1. 构建高斯金字塔(下采样)
  2. 构建拉普拉斯金字塔(高斯金字塔相邻层相减)
  3. 每层分别融合(低频用平均,高频用取大)
  4. 重建图像(从顶层往下叠加)
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嘛,等你对数据分布有感觉了再碰。

下一章咱们聊多尺度变换融合,那才是真正的好戏开场。


公众号:蓝海资料掘金营,微信 deep3321