最近完成了图像融合的仿真算法实现,对近期的工作进行总结。
一、Laplace变换的基本方法
二、Laplace融合的步骤与代码
三、伪彩色应用下,Laplace融合结果对效果展示的一些思考。
一、Laplace变换的基本方法
方法只是简单说明下一下,相关介绍的文章比较多。主要注意一点:基于高斯变换的时候,上采样过程实际包括了两个步骤,1、先进行隔行隔列的上采样。2、对上采样结果进行4倍高斯核滤波。
这个滤波动作是为了补充下采样过程中的能量损失,高斯滤波后会让像素值变小,所以需要对应的进行补充回去。4倍率的选择与参数高斯滤波运算的数量是相关的,可以简单用5*5的窗口直接推导下,补0的上采样图中,0不参与计算,正好差4倍。上采样过程与下采样过程是一一对应的。
所以,下采样过程如果使用均值滤波,那在上采样过程中则应该进行均值滤波的2倍处理,也可以使用双线性插值进行扩充,原则就是把下采样的能量/像素强度的丢失找回来。
以下是简单的变换过程示意图。其中G(0)为原图,L(0)为拉普拉斯的第0层。
- Laplace图像变换基于图像的高斯金字塔,LapAlace的顶层与高斯金字塔相同,其他层则是对高斯金字塔进行下采样结果(缩放后)进行上采样,再与原图相减的过程。
- Laplace图像变换的结果即生成了拉普拉斯金字塔,而其中顶层金字塔(最小尺寸)包含了图像的低频信息,其他层包含了图像的高频信息。借由LapLACE金字塔,图像被拆分成高频与低频两大部分
二、Laplace融合的步骤与代码
对于配准图像的融合,分三步:1、分解。2、选择对应的融合策略对高频和低频进行融合。3、对融合后的拉普拉斯金字塔进行逆变换。以下是简单示意:
一、分解过程
使用opencv的pyrDown和pyrUp可以容易的完成高斯上下采样。
def LPTrans(data, kernelSize=5, level=3):
"""
Apply laplacian filter transformation on the input data.
Parameters:
- data: Input data to be transformed.
- kernelSize (int): Size of the kernel used for blurring. Default is 5.
- level (int): Level of transformation. Default is 3.
Returns:
Transformed data after applying the laplacian filter.
"""
lpPyramid = []
current = data.copy()
if blurType == 1:
for i in range(level):
if i < level - 1:
downsampled=cv.pyrDown(current)
Laplace = current-cv.pyrUp(downsampled)#pyrUp方法为补0并卷积
lpPyramid.append(Laplace)
current = downsampled
else:
lpPyramid.append(current)
current = downsampled
return lpPyramid
二、逆变换过程
def LPInverseTrans(mixPyramid,kernelSize = 5):
levels = len(mixPyramid)
mixData = mixPyramid[-1].copy()
# 初始化重构的图像为金字塔的最后一层(最低分辨率的图像)
for level in range(levels - 2, -1, -1):
upsampled = cv.pyrUp(mixData)
mixData = mixPyramid[level] + upsampled
return mixData
三、整体流程
def FuseByLP(vLData,iRData):
# LP变换
kernelSize,level= 3,3
vLLpPyramid = LPTrans(vLData,kernelSize,level)
iRLpPyramid = LPTrans(iRData,,kernelSize,level)
#cv.imshow('vLLpPyramid[0]',vLLpPyramid[0])
#cv.imshow('vLLpPyramid[2]',vLLpPyramid[2])
# 融合
baseMixData = MixBase(vLLpPyramid[-1],iRLpPyramid[-1])
mixType = 2 #1:abs 2:region
detailMixData = MixDetail(vLLpPyramid[0:-1],iRLpPyramid[0:-1],mixType)
# LP逆变换
mixPyramid=[]
mixPyramid.extend(detailMixData)
mixPyramid.append(baseMixData)
fuseData = LPInverseTrans(mixPyramid,blurtype,kernelSize)
return fuseData
其中:MixBase 和 MixDetail表示分别对低频和高频图像进行融合,可以根据自己任务特点选择对应的融合策略。本文对于低频部分采用区域匹配的加权融合,高频部分则用区域能量取大的方法
四、部分分解过程图
从左到右分别为拉普拉斯分解的G(0),G(1),G(2)层。上半部分为红外图,下半部分为可见光图。
三、伪彩色应用下,Laplace融合结果对效果展示的一些思考
我们知道,红外图像采集为黑白图像,通常为了适应人眼的观察,会对红外图像进行色彩叠加。叠加的色彩通常与温度相关,如在红色模式的映射下,温度越高,颜色越红,最高处呈白色,反之则越暗。
而经过融合了可将光细节的红外图像,一定程度上发生了失真,其伪彩色不再能完全正确反应色彩与温度的关系。
对此,采用了两种伪彩色方式,两种叠加伪彩的时机对结果进行了对比。
每张图片中
第一行:红外图,可见光图,融合图
第二行:原始伪彩图,替换色彩伪彩图,重映射伪彩图
1、使用hot模式
2.使用RAINBOW模式