本文参考知乎上一位大神 “冲上云霄” 的文章 融合算法一—TIF
作者在知乎上详细介绍了近年来常见的十几种融合算法,很有参考意义。
另外,知乎上 张星辰 对融合算法的整理,以及提出来的参考标准 VIFB: 一个可见光与红外图像融合Benchmark 可以多了解一下。

1 算法的核心思想

根据介绍,TIF算法是将图像分成基础层和细节层,之后再按加权相加。
基础层,就是将图像进行均值滤波(文中用的是35),均值滤波后的图像就是基础层,原图减去基础层就是细节层。
基础层的权重是0.5,细节层的权重计算,具体如下:

图像 A A A 按均值滤波(35)和中值滤波(3)分别产生两张图像,两张图像做差,产生一张差值图,就是右侧那个黑白的。假设将其命名为 ξ a \xi_a ξa ,由于是彩色图像,自己用的是欧拉距离,就是RGB三者的差的平方和再开根号。

同理,可以求出图像 B B B ξ b \xi_b ξb
细节层权重的确定就由这两个加权产生。
ω a = ξ a ξ a + ξ b ω b = ξ b ξ a + ξ b \omega_a=\frac{\xi_a}{\xi_a+\xi_b}\\ \omega_b=\frac{\xi_b}{\xi_a+\xi_b} ωa=ξa+ξbξaωb=ξa+ξbξb
我按文章 VIFB: 一个可见光与红外图像融合Benchmark 中提供的GitHub地址下载了测试图像:

红外图像

可见光图像
文中给出的测试结果:

自己做的结果

图像上目视感觉,结果差不多。
时间上单张测试时间是0.04s。

2 再来说下踩过的坑

作为初学者的我,踩的坑还是比较多的。

1 计算时的默认处理

编写代码的时候,主要是图像读取的时候我用的是

cv2.imread(p1_path, cv2.IMREAD_COLOR)

像素每一位默认是unit8,计算过程中的时候,超过255的数值会自动减去255再计算,或者用cv2.add、cv2.subtract这些,会对超过255的数默认为255。写代码的时候要注意这些。我是将unit8换成float来计算的。

2 分母出现NAN的处理

如前所述,计算 ω a = ξ a ξ a + ξ b \omega_a=\frac{\xi_a}{\xi_a+\xi_b} ωa=ξa+ξbξa 时,分母中出现了 0 值,造成最终图像结果上有一些黑点。对此,我是将 ξ a + 0.01 \xi_a+0.01 ξa+0.01 来避免 0 值出现的。

3 代码下载

MATLAB 的代码(Two scale image fusion),是从网上下载的,对此,我和测试图像同事打包成一个,放在下载文件里。
下载链接如下:
https://download.csdn/download/jayandchuxu/13631905

更多推荐

红外与可见光融合算法——TIF介绍及python和MATLAB代码实现