本文参考知乎上一位大神 “冲上云霄” 的文章 融合算法一—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.net/download/jayandchuxu/13631905