原文 Image Fusion with Guided Filtering - 2013
本文提出了一种基于导向滤波的图像融合方法。融合的对象可以是多光谱图像,不同焦点的图像,不同曝光的图像等。论文比较创新点就是提出了一种不同幅图像的权重计算方法,引入了像素显著性和图像空间连续性的概念。并且使用了引导滤波来重建权重,最终得到了高效和不错的融合效果。
文中提到,该方法的优点:
算法本身并不复杂,只是灵活地利用了不同滤波器所获得的图像信息,其主要流程如下图所示:
接下来结合上述流程和matlab代码,详解算法。(图是论文里截的,讲究看吧……)
im1 = im2double(imread('2.jpg'));
im2 = im2double(imread('1.jpg'));
一个简单的均值滤波来获取图像的基层和细节层,滤波器越大,得到的基层模糊程度越高。而细节层是原图减去基层图,随着滤波半径的增大,细节层的信息也会相应增加。论文中给出的建议滤波器大小为31×31。
%% Get B,D
h1 = fspecial('average',[31,31]); %定义一个滤波模板
B1 = imfilter(im1, h1, 'replicate'); %均值滤波得到图1基层 'replicate'是对边界值的处理模式
B2 = imfilter(im2, h1, 'replicate'); %均值滤波得到图2基层
D1 = im1-B1; %细节层
D2 = im2-B2;
第二步就是利用导向滤波进行权重重建,上述流程图中应该是各个通道单独处理的,这里直接放一起处理了。
首先对原图进行拉普拉斯滤波得到高频细节,然后再对得到的高频细节进行一次高斯滤波。这两个滤波器一个是高通滤波,一个是低通滤波。在这里对高频信息再进行一次低通滤波,应该是为了去除噪声影响。同时文中也给出了高斯滤波的建议参数,窗口为11×11,sigma=5。拉普拉斯滤波则采用默认的3×3窗口,同时注意在拉普拉斯滤波之后需要对滤波结果取一次绝对值,因为拉普拉斯滤波在求x,y方向梯度的时候会产生负值。
h2 = fspecial('laplacian', 0.2);
H1 = imfilter(im1, h2, 'replicate');
H2 = imfilter(im2, h2, 'replicate');
H1 = abs(H1); % 取绝对值
H2 = abs(H2);
h3 = fspecial('gaussian', [11,11], 5);
S1 = imfilter(H1, h3, 'replicate');
S2 = imfilter(H2, h3, 'replicate');
然后就是本文提出的像素显著性和空间连续性。
P n k = { 1 i f S n k = max ( S 1 k , S 2 k , . . . , S N k ) 0 o t h e r w i s e P_n^k= \begin{cases} 1& if\ \ S_n^k=\max(S_1^k,S_2^k,...,S_N^k) \\ 0&otherwise \end{cases} Pnk={10if Snk=max(S1k,S2k,...,SNk)otherwise
其中, N N N是源图像的数量, S n k S_n^k Snk是在第 n n n幅图像中某位置像素点 k k k的显著值。比如我们现在是两幅图,把两幅高频细节图的第一个通道拿过来,每个像素点都取两个矩阵中大的值,就得到了一幅显著值图,再用着两个图分别和这个显著值图去比较,如果某点的像素值相等,那权重图就是1,否则就是0。如下:
function out = wmap(i1,i2)
%权重映射,因为每张图都要求解权重,因此写成函数
%对于输入的两张RGB图,返回图1的三通道权重图
[w, h, d] = size(i1);
out = zeros(w, h, d);
for i=1:d
maxmap = max(i1(:,:,i), i2(:,:,i)); %求显著值图
temp = double(maxmap==i1(:,:,i)); % 求解权重图
out(:,:,i) = temp;
end
调用
P1 = wmap(S1, S2);
P2 = wmap(S2, S1);
因为是三通道显示,所以和流程图中有所差异。这样我们就得到了关于各个源图像的粗略权重值。但是由于多个图像间容易产生噪声,并可能存在不完全对齐等问题,很容易造成融合后的图像有伪影等,因此在基于空间连续性的思想下,需要对得到的权重图进行导向滤波。关于导向滤波的最优参数,作者并没有给出,但是不同层的权重图将用不同参数进行滤波,我自己试验的参数如下,这部分将在后面作更多讨论。
%% Guide Filter
eps1 = 0.3^2;
eps2 = 0.03^2;
for i=1:3
Wb1(:,:,i) = guidedfilter(im1(:,:,i) , P1(:,:,i) , 8, eps1);
Wb2(:,:,i) = guidedfilter(im2(:,:,i) , P2(:,:,i) , 8, eps1);
Wd1(:,:,i) = guidedfilter(im1(:,:,i) , P1(:,:,i) , 4, eps2);
Wd2(:,:,i) = guidedfilter(im2(:,:,i) , P2(:,:,i) , 4, eps2);
end
到此为止,我们得到了在A步骤中得到的四个图对应的四个权重图,已经可以做最后的融合了。
对两个尺度层分别加权,然后相加就得到了最后的输入。在相加前,将每个像素点的权重之和,归化到1。
Wbmax = Wb1+Wb2;
Wdmax = Wd1+Wd2;
Wb1 = Wb1./Wbmax;
Wb2 = Wb2./Wbmax;
Wd1 = Wd1./Wbmax;
Wd2 = Wd2./Wbmax;
B = B1.*Wb1+B2.*Wb2;
D = D1.*Wd1+D2.*Wd2;
im = B+D;
关于像素显著性和空间连续性。像素显著性是一个建立在梯度域的指标,对于待融合的多幅图像中的某个相同位置的像素,我们认为其中最大值就是最显著的像素值,并为拥有显著值的图像权重设为1,其余为0。通俗地说,对任意一个像素,我们选择一个最佳来源,拥有最大的对比度。但是当存在噪声或者不对齐或者在某处多幅图像恰好相同时,可能会出现多个显著值的情况,例如某个像素点在多幅图像中的值为[0.1 0.3 0.3 0.2],那么就拥有两个显著值0.3,即两幅图在这个点的权重都为1,这是有问题的。因此,我们考虑空间连续性,即对于这个像素点,它周围的像素点和这个点都有近似的亮度时,才认为这个点的显著值是可靠的。而用原图作为引导图对权重图作导向滤波时,原图表征的是图像的连续性,当某个平滑区域的噪声点拥有1的权重,由于原图中该点周围都是平滑的,因此该权重点也将会被平滑,适当降低。
从另一个角度讲,我们一开始在得到基层和细节层的时候。基层是用一个31×31的均值滤波器得到的,它的平滑程度是很大了,因此在计算它的权重图的时候,我们也相应给它更大的平滑处理,即采用较大的滤波器和较大的模糊系数。而对于细节层,这是图像融合质量的重要组成部分,我们期望保留更多更精准的细节,因此对细节层我们采取较小的滤波器和较小的模糊系数。
图像融合专题
Github仓库