欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于导向滤波的图像融合(GGF)(附Matlab代码)

程序员文章站 2022-07-14 16:42:25
...

论文学习——基于导向滤波的图像融合(GGF)

原文 Image Fusion with Guided Filtering - 2013

简介

  本文提出了一种基于导向滤波的图像融合方法。融合的对象可以是多光谱图像,不同焦点的图像,不同曝光的图像等。论文比较创新点就是提出了一种不同幅图像的权重计算方法,引入了像素显著性和图像空间连续性的概念。并且使用了引导滤波来重建权重,最终得到了高效和不错的融合效果。
  文中提到,该方法的优点

  • 只需要获取图片两个尺度,而过去的方法往往要在多个尺度上进行重建。这里所谓的尺度,即将一幅图像分解为基层(Base Layer)和细节层(Detail Layer),这个方法在如今的话已经广泛使用,例如基于滤波的RGB+NIR图像融合 - 2017
  • 提出了像素显著性(pixel saliency)和空间连续性(d spatial consistency)的概念,用于构建不同图像的权重,这将在下文介绍。并且使用局部滤波的方法代替了最优化的方法,提高了效率。即使用了导向滤波,如对导向滤波尚有疑问,可参考导向滤波
  • 在具体实验中发现,在对不同层的融合时,像素显著性和空间连续性表现出的效果是不一样的。

算法

  算法本身并不复杂,只是灵活地利用了不同滤波器所获得的图像信息,其主要流程如下图所示:
基于导向滤波的图像融合(GGF)(附Matlab代码)
  接下来结合上述流程和matlab代码,详解算法。(图是论文里截的,讲究看吧……)

im1 = double(imread('2.jpg'))/255;
im2 = double(imread('1.jpg'))/255;

基于导向滤波的图像融合(GGF)(附Matlab代码)

A.Two-Scale Image Decomposition(双尺度分解)

  一个简单的均值滤波来获取图像的基层和细节层,滤波器越大,得到的基层模糊程度越高。而细节层是原图减去基层图,随着滤波半径的增大,细节层的信息也会相应增加。论文中给出的建议滤波器大小为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;

基于导向滤波的图像融合(GGF)(附Matlab代码)

基于导向滤波的图像融合(GGF)(附Matlab代码)

B. Weight Map Construction With Guided Filtering(构建权重图)

  第二步就是利用导向滤波进行权重重建,上述流程图中应该是各个通道单独处理的,这里直接放一起处理了。
  首先对原图进行拉普拉斯滤波得到高频细节,然后再对得到的高频细节进行一次高斯滤波。这两个滤波器一个是高通滤波,一个是低通滤波。在这里对高频信息再进行一次低通滤波,应该是为了去除噪声影响。同时文中也给出了高斯滤波的建议参数,窗口为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');

基于导向滤波的图像融合(GGF)(附Matlab代码)
  然后就是本文提出的像素显著性和空间连续性。
Pnk={1if  Snk=max(S1k,S2k,...,SNk)0otherwiseP_n^k= \begin{cases} 1& if\ \ S_n^k=\max(S_1^k,S_2^k,...,S_N^k) \\ 0&otherwise \end{cases}
其中,NN是源图像的数量,SnkS_n^k是在第nn幅图像中某位置像素点kk的显著值。比如我们现在是两幅图,把两幅高频细节图的第一个通道拿过来,每个像素点都取两个矩阵中大的值,就得到了一幅显著值图,再用着两个图分别和这个显著值图去比较,如果某点的像素值相等,那权重图就是1,否则就是0。如下:
                基于导向滤波的图像融合(GGF)(附Matlab代码)

function out = wmap(i1,i2)
%权重映射,因为每张图都要求解权重,因此写成函数
%对于输入的两张RGB图,返回图1的三通道权重图
[w, h, d] = size(i1);
out = zeros(w, h, d);
for i=1:d
    maxmap = max(cat(3, i1(:,:,i), i2(:,:,i)), [], 3); %求显著值图
    temp = double(maxmap==i1(:,:,i)); % 求解权重图
    out(:,:,i) = temp;
end

调用

P1 = wmap(S1, S2);
P2 = wmap(S2, S1);

基于导向滤波的图像融合(GGF)(附Matlab代码)
  因为是三通道显示,所以和流程图中有所差异。这样我们就得到了关于各个源图像的粗略权重值。但是由于多个图像间容易产生噪声,并可能存在不完全对齐等问题,很容易造成融合后的图像有伪影等,因此在基于空间连续性的思想下,需要对得到的权重图进行导向滤波。关于导向滤波的最优参数,作者并没有给出,但是不同层的权重图将用不同参数进行滤波,我自己试验的参数如下,这部分将在后面作更多讨论。

%% 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步骤中得到的四个图对应的四个权重图,已经可以做最后的融合了。

C. Two-Scale Image Reconstruction(融合重建)

  对两个尺度层分别加权,然后相加就得到了最后的输入。在相加前,将每个像素点的权重之和,归化到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;

结果和对比如下:
基于导向滤波的图像融合(GGF)(附Matlab代码)


总结

  关于像素显著性和空间连续性。像素显著性是一个建立在梯度域的指标,对于待融合的多幅图像中的某个相同位置的像素,我们认为其中最大值就是最显著的像素值,并为拥有显著值的图像权重设为1,其余为0。通俗地说,对任意一个像素,我们选择一个最佳来源,拥有最大的对比度。但是当存在噪声或者不对齐或者在某处多幅图像恰好相同时,可能会出现多个显著值的情况,例如某个像素点在多幅图像中的值为[0.1 0.3 0.3 0.2],那么就拥有两个显著值0.3,即两幅图在这个点的权重都为1,这是有问题的。因此,我们考虑空间连续性,即对于这个像素点,它周围的像素点和这个点都有近似的亮度时,才认为这个点的显著值是可靠的。而用原图作为引导图对权重图作导向滤波时,原图表征的是图像的连续性,当某个平滑区域的噪声点拥有1的权重,由于原图中该点周围都是平滑的,因此该权重点也将会被平滑,适当降低。
  从另一个角度讲,我们一开始在得到基层和细节层的时候。基层是用一个31×31的均值滤波器得到的,它的平滑程度是很大了,因此在计算它的权重图的时候,我们也相应给它更大的平滑处理,即采用较大的滤波器和较大的模糊系数。而对于细节层,这是图像融合质量的重要组成部分,我们期望保留更多更精准的细节,因此对细节层我们采取较小的滤波器和较小的模糊系数。


更多应用

[留空]


下载

Matlab代码  提取码: wemq