Image Fusion with Guided Filtering读后感(附有python代码)
前言
本文提出了一种快速有效的图像融合方法,通过对多幅图像进行融合,生成高信息量的融合图像。该方法将图像分解为包含大规模强度变化的基层和捕捉小尺度细节的细节层。提出了一种基于引导滤波的加权平均技术,充分利用空间一致性实现了基层和细节层的融合。实验结果表明,该方法能够实现多光谱、多焦点、多模态和多曝光图像的融合。
一、算法的具体步骤
上图是算法具体的流程图。下面主要叙述一下算法的具体步骤和相应的代码实现。
第一步:将两幅待融合的图像im1和im2,经过一次高斯模糊分别得到基础图像b1和b2,分别用原图减去基础图,可以得到细节图像d1和d2。
第二步:就是利用导向滤波计算权重。原图像经过拉普拉斯滤波,要对滤波后的进行取绝对值,防止有负值出现,这样是为了得到高频细节。将滤波后的图像在经过高斯滤波。高斯滤波器属于低通滤波器,这一步估计是为了去除噪声。本文暂且叫两幅高频细节图叫s1和s2。将两幅图像矩阵在一起比较,用一个新的图像矩阵记录两幅图像相对应的像素点的最大值。在分别用s1和s2与两幅图像进行比较相等的记录为1不相等录为0,具体看下面的代码便可以知道咋回事。这样分别得到im1相对im2显著图p1和im2相对im1显著图p2。由于多个图像间容易产生噪声,并可能存在不完全对齐等问题,很容易造成融合后的图像有伪影等,因此在基于空间连续性的思想下,需要对得到的权重图进行导向滤波。
第三步融合:具体看代码
二、python代码实现
############导向滤波#######################
def Guidedfilter(im,p,r,eps):
mean_I = cv2.boxFilter(im,cv2.CV_64F,(r,r));
mean_p = cv2.boxFilter(p, cv2.CV_64F,(r,r));
mean_Ip = cv2.boxFilter(im*p,cv2.CV_64F,(r,r));
cov_Ip = mean_Ip - mean_I*mean_p;
mean_II = cv2.boxFilter(im*im,cv2.CV_64F,(r,r));
var_I = mean_II - mean_I*mean_I;
a = cov_Ip/(var_I + eps);
b = mean_p - a*mean_I;
mean_a = cv2.boxFilter(a,cv2.CV_64F,(r,r));
mean_b = cv2.boxFilter(b,cv2.CV_64F,(r,r));
q = mean_a*im + mean_b;
return q;
#################基于导向滤波的图像融合#####################
def GuideFuison(im1,im2):
r_1 = 45
eps_1 = 0.3
r_2 = 7
eps_2 = 0.000001
#### 图像双尺度分层############################################################
b1 = np.array(cv2.blur(im1, (31, 31)), np.int16)
d1 = np.array(im1, np.int16) - b1
# d1=Ga.Gamma(d1.astype('uint8'))
cv2.imshow("d1",d1)
b2 = np.array(cv2.blur(im2, (31, 31)), np.int16)
d2 = np.array(im2, np.int16) - b2
# d2=Ga.Gamma(d2.astype('uint8'))
cv2.imshow("d2",d2)
#### 细节图提取###########################################################################
laplacian1 = abs(cv2.Laplacian(im1, cv2.CV_64F))
s1 = cv2.GaussianBlur(laplacian1, (5, 5), 0)
laplacian2 = abs(cv2.Laplacian(im2, cv2.CV_64F))
s2 = cv2.GaussianBlur(laplacian2, (5, 5), 0)
#### 权重图提取##############################################################################
p1 = np.zeros(im1.shape, np.uint8)
p2 = np.zeros(im2.shape, np.uint8)
p1[s1 >= s2] = 1
p2[s2 > s1] = 1
####权重图进行导向滤波######################################################################
#w1 = guidedFilter(p1, im1, r_1, eps_1)
#w2 = guidedFilter(p2, im2, r_2, eps_2)
w1=Guidedfilter(im1,p1,r_1,eps_1)
w2=Guidedfilter(im2,p2,r_2,eps_2)
#### 融合图像#################################################################
# Fuse base and detail images using refined maps from guided filter
bf = w1 * b1 + w2 * b2
df = w1 * d1 + w2 * d2
# Final fused image
fused_im = np.array(bf + df, np.uint8)
return fused_im;
二、仿真(随便将两幅图片融合的)
im1
im2
fusion