Itti1998 A Model of saliency Based Visual Attention for Rapid Scene Analysis 算法复现

网上有很多该论文的解析,点击打开链接这篇较为详细,参考做了代码实现。

论文的意义

这里引用程明明大牛的观点:这篇论文虽然只是个short paper,但是在这个领域有着不可磨灭的绝对重要性。其最大的贡献在于将Visual attention的问题用计算模型表达出来,并展示出来这个问题可以在一定程度上得到有意义的结果。其中提到的Center-Surround difference在后续的很多工作中都被以不同的形式表现出来。除了生成saliency map (后续的很多方法只生成saliency map),这篇文章也探讨了注视点的转移机制。总之,说这篇论文是saliency Detection computation的开山之作也不为过,此文对后续工作有着深刻的影响。体现了最牛的一种创新境界“提出新问题”。

 

框架:

 

Itti1998 A Model of saliency Based Visual Attention for Rapid Scene Analysis 算法复现_第1张图片

算法:

    上图为整个模型的结构图,首先输入一张彩色图片,采用高斯金字塔对该图片进行下采样,生成9张尺度图,其中尺度0表示该尺度图像与原图像的像素面积比例是1:1,尺度8表示该尺度图像与源图像面积为1:256。“Center-surround” difference operations,即中央周边差操作,是根据人眼生理结构设计的。人眼感受野对于视觉信息输入中反差大的特征反应强烈,例如中央亮周边暗的情况、中央是绿色周边是红色的情况等,这都属于反差较大的视觉信息。在高斯金字塔中,尺度较大的图像细节信息较多,而尺度较小的图像由于高斯平滑和减抽样操作使得其更能反映出局部的图像背景信息,因而将尺度较大的图像和尺度较小的图像进行跨尺度减操作(across-scale),能得到局部中心和周边背景信息的反差信息。跨尺度减的具体算法如下:通过将代表周边背景信息的较小尺度的图像进行线性插值,使之与代表中心信息的较大尺度的图像具有相同大小,然后进行点对点的减操作,即中央周边差操作,这样的跨尺度减操作使用符号Θ表示。对每个特征通道的高斯金字塔进行中央周边差操作,依次检测图像中的特征不联系性,即中心和周边背景信息反差对比强烈的区域,很好地模仿了视网膜上探测突出目标的生理机制。在模型中,代表中心信息的图像尺度c取c∈{2,3,4},代表周边背景信息的图像尺度s取s=c+δ,其中δ∈{3,4},从而在每个特征通道里可以产生6个尺度对,即{2-5,2-6,3-6,3-7,4-7,4-8},在每个特征通道可以产生6张中央周边差结果图,所以7个通道共有42张中央周边差图,中央周边差结果图在该模型中被称为特征图(Feature Map)。

Itti1998 A Model of saliency Based Visual Attention for Rapid Scene Analysis 算法复现_第2张图片

特征提取:

①、亮度提取,用r,g,b分别表示图像红、绿、蓝三个通道的值,因此亮度I可以表示为I=(r+g+b)/3,由于输入图片是9个尺度的高斯金字塔图片,所以I也对于9个尺度高斯金子塔亮度图。

②、颜色提取,r,g,b通道采用I进行归一化以从亮度中解耦色调。产生了四个宽调谐(broadly-tuned)的颜色通道,从这些颜色通道中产生四个高斯金字塔R,G,B,Y。

R=r-(g+b)/2,G=g-(r+b)/2,B=b-(r+g)/2,Y=(r+g)/2-|r-g|/2-b,如果为负数则设为0。

③、方向特征,方向特征主要是使用Gabor滤波器对图像的亮度特征在0°,45°,90°,135°四个主要方向上进行滤波得到的。因此,Gabor滤波器可以很好地模拟人类视皮层简单细胞的信号处理特点,其结果直接体现了图像局部方向特征的信息。在Gabor滤波器某个方向的滤波结果中,给定区域的能量可以反映该区域灰度图在该方向的特征是否强烈,即反映了区域内的该方向的直线或者规则纹理的朝向特征是否明显。因此方向特征的提取可以直接使用几个方向的Gabor滤波器进行滤波获得。

参考:gabor原理点击打开链接,gabor代码参考点击打开链接

 

第一组特征图集:中心细尺度c和周围粗尺度s之间的中心围绕差值产生特征图。模拟灵长类动物的中心围绕机制,所有类型的敏感性是在六个I(c,s)图(六尺度)中同时计算的:

I(c,s)=|I(c)ΘI(s)| c∈(2,3,4),s=s+δ,δ∈(3,4),六个尺度对,生成显著图

 

 

第二组特征图集:模拟皮层中的“颜色双竞争” 系统表示:在接受野中心,神经元被一种颜色激活而禁止另外一种颜色,而在周围区域则是相反的。在主视觉皮层中,红/绿,绿/红,蓝/黄,黄/蓝颜色对都存在这种空间和色彩竞争关系。因此,产生RG(c,s)和BY(c,s)特征图来反映双竞争关系。

RG(c,s)=|(R(c)-G(c))Θ(G(s)-R(s))|,RG有六个尺度对,生成六个显著图

 

BY(c,s)=|(B(c)-Y(c))Θ(Y(s)-B(s))|,BY有六个尺度对,生成六个显著图

第三组特征图集:采用方向Gabor金字塔得到局部方向信息,采用4角度和6尺度来表示角度和方向。最后得到方向特征图:O(c,s,θ)=|O(c,θ)ΘO(s,θ)|; 每个角度有六个尺度对,生成六个feature map,共生成24个feature map

 

总体来说,计算出来了42个特征图:6个亮度图,12个颜色图和24个方向图。

 

显著图:I表示灰度,C表示颜色,O表示方向,三个显著图经过归一化后,求和,作为显著性图的最终输入S。

 

Matalb实现:main.m

clc;
clear;

img = imread('D:/Code/Image/img.jpg');
img = imresize(img, [480, 640]); % 论文中图像大小
img = double(img);

img_gauss{1} = gaussian(img); % 尺度0,与原图像比1:1

img_gauss{2} = imresize(img_gauss{1}, 0.5); % 下采样
img_gauss{2} = gaussian(img_gauss{2}); % 尺度1,原图像比1:2

img_gauss{3} = imresize(img_gauss{2}, 0.5); % 下采样
img_gauss{3} = gaussian(img_gauss{3}); % 尺度2,原图像比1:4

img_gauss{4} = imresize(img_gauss{3}, 0.5); % 下采样
img_gauss{4} = gaussian(img_gauss{4}); % 尺度3,原图像比1:8

img_gauss{5} = imresize(img_gauss{4}, 0.5); % 下采样
img_gauss{5} = gaussian(img_gauss{5}); % 尺度4,原图像比1:16

img_gauss{6} = imresize(img_gauss{5}, 0.5); % 下采样
img_gauss{6} = gaussian(img_gauss{6}); % 尺度5,原图像比1:32

img_gauss{7} = imresize(img_gauss{6}, 0.5); % 下采样
img_gauss{7} = gaussian(img_gauss{7}); % 尺度6,原图像比1:64

img_gauss{8} = imresize(img_gauss{7}, 0.5); % 下采样
img_gauss{8} = gaussian(img_gauss{8}); % 尺度7,原图像比1:128

img_gauss{9} = imresize(img_gauss{8}, 0.5); % 下采样
img_gauss{9} = gaussian(img_gauss{9}); % 尺度8,原图像比1:256, 论文中scale0-8

%% 先提取最简单的亮度图, 9个亮度图
for i = 1:9
    img_ga_current = img_gauss{i}; % 9个尺度高斯金子塔亮度图
    luminace{i} = (img_ga_current(:,:,1) + img_ga_current(:,:,2) + img_ga_current(:,:,3)) ./ 3;
    luminace{i} = mat2gray(luminace{i});
end

%% 再求亮度特征
luminace_fature = get_feature(luminace);

%% 求颜色图,rgb图像金字塔,生成四个金字塔(R, G, B, Y金字塔)
for i = 1:9
    current_rgb = img_gauss{i};
    r = current_rgb(:,:,1);
    g = current_rgb(:,:,2);
    b = current_rgb(:,:,3);
    R{i} = r - (g + b) / 2;
    R{i}(R{i} < 0) = 0;
    
    G{i} = g - (r + b) / 2;
    G{i}(G{i} < 0) = 0;
    
    B{i} = b - (r + g) / 2;
    B{i}(B{i} < 0) = 0;
    
    Y{i} = (r + g) / 2 - abs(r - g) / 2 - b;
    Y{i}(Y{i} < 0) = 0;
end

%% 再求颜色特征图
% 之前是R(c,s)=|(R(c))Θ(R(s))| , 现在RG(c,s)=|(R(c)-G(c))Θ(G(s)-R(s))|,RG有六个尺度对
RG_feature = compete(R, G);
BY_feature = compete(B, Y);

%% 求方向图,Gabor滤波器对图像的亮度特征在0°,45°,90°,135°四个主要方向上进行滤波得到的
for i = 1:9
    [Eim,Oim,orientation_map_90{i}]=spatialgabor(luminace{i},3,0,0.5,0.5,1);%90-vertical
    [Eim,Oim,orientation_map_0{i}]=spatialgabor(luminace{i},3,90,0.5,0.5,1);%=0-horizontal
    [Eim,Oim,orientation_map_45{i}]=spatialgabor(luminace{i},3,135,0.5,0.5,1);%45-horizontal
    [Eim,Oim,orientation_map_135{i}]=spatialgabor(luminace{i},3,45,0.5,0.5,1);%135-horizontal
end
% 最后得到方向特征图:O(c,s,θ)=|O(c,θ)ΘO(s,θ)|; 每个角度有六个尺度对,生成六个feature map,共生成24个feature map
orientation_map_feature_0 = get_feature(orientation_map_0); % 0度方向特征金字塔
orientation_map_feature_45 = get_feature(orientation_map_45); % 0度方向特征金字塔
orientation_map_feature_90 = get_feature(orientation_map_90); % 0度方向特征金字塔
orientation_map_feature_135 = get_feature(orientation_map_135); % 0度方向特征金字塔

% 对所有特征进行归一化到0到1之间,再求和
nor_luminace_feature = normalize_minmax(luminace_fature);

nor_RG_feature = normalize_minmax(RG_feature);
nor_BY_feature = normalize_minmax(BY_feature);

nor_orientation_map_feature_0 = normalize_minmax(orientation_map_feature_0);
nor_orientation_map_feature_45 = normalize_minmax(orientation_map_feature_45);
nor_orientation_map_feature_90 = normalize_minmax(orientation_map_feature_90);
nor_orientation_map_feature_135 = normalize_minmax(orientation_map_feature_135);

luminace_smap = zeros(480, 640); % 亮度显著图
RG_smap = zeros(480, 640); % 亮度显著图
BY_smap = zeros(480, 640); % 亮度显著图
orientation0_smap = zeros(480, 640); % 亮度显著图
orientation45_smap = zeros(480, 640); % 亮度显著图
orientation90_smap = zeros(480, 640); % 亮度显著图
orientation135_smap = zeros(480, 640); % 亮度显著图
for i = 1:6
    nor_luminace_feature{i} = imresize(nor_luminace_feature{i}, [480, 640]); % 所有尺度放大到同一尺度,相加
    luminace_smap = luminace_smap + nor_luminace_feature{i};
    
    nor_RG_feature{i} = imresize(nor_RG_feature{i}, [480, 640]);
    RG_smap = RG_smap + nor_RG_feature{i};
    
    nor_BY_feature{i} = imresize(nor_BY_feature{i}, [480, 640]);
    BY_smap = BY_smap + nor_BY_feature{i};
    
    nor_orientation_map_feature_0{i} = imresize(nor_orientation_map_feature_0{i}, [480, 640]);
    orientation0_smap = orientation0_smap + nor_orientation_map_feature_0{i};
    
    nor_orientation_map_feature_45{i} = imresize(nor_orientation_map_feature_45{i}, [480, 640]);
    orientation45_smap = orientation45_smap + nor_orientation_map_feature_45{i};
    
    nor_orientation_map_feature_90{i} = imresize(nor_orientation_map_feature_90{i}, [480, 640]);
    orientation90_smap = orientation90_smap + nor_orientation_map_feature_90{i};
    
    nor_orientation_map_feature_135{i} = imresize(nor_orientation_map_feature_135{i}, [480, 640]);
    orientation135_smap = orientation135_smap + nor_orientation_map_feature_135{i};
    
end

figure, imshow(mat2gray(luminace_smap));
figure, imshow(mat2gray(RG_smap));
figure, imshow(mat2gray(BY_smap));
figure, imshow(mat2gray(orientation0_smap));
figure, imshow(mat2gray(orientation45_smap));
figure, imshow(mat2gray(orientation90_smap));
figure, imshow(mat2gray(orientation135_smap));

final_smap = luminace_smap + RG_smap + orientation0_smap + orientation45_smap + orientation90_smap + orientation135_smap;
figure, imshow(mat2gray(luminace_smap));





function img_gauss = gaussian(img)
    sigmma = 1.6;
    window=double(uint8(3*sigmma)*2+1);%窗口大小一半为3*sigma  
    H=fspecial('gaussian', window, sigmma);
    img_gauss=imfilter(img,H,'replicate');  
end
function feature = compete(R, G)

% {3-6,3-7,4-7,4-8,5-8,5-9}, Θ:同样大小后,相减
% 之前是RG(c,s)=|(RG(c))Θ(RG(s))| , 现在RG(c,s)=|(R(c)-G(c))Θ(G(s)-R(s))|,RG有六个尺度对
m = 1;
for i = 1:3 % 每次循环处理两对,循环三次
    disp(i)
    R_first_c = R{i+2}; % c 比如第一对3-6左边,应对的是3
    G_first_c = G{i+2}; % c 比如第一对3-6左边,应对的是3
    
    R_first_s = R{i+5}; % s 比如第一对右边,应对的是6
    G_first_s = G{i+5}; % s 比如第一对右边,应对的是6 
    
    temp_c = abs(R_first_c - G_first_c); % (R(c)-G(c))
    temp_s = abs(R_first_s - G_first_s); % (G(s)-R(s)
    
    temp_s = imresize(temp_s, size(temp_c)); 
    feature{m} = abs(temp_c - temp_s);
    feature{m} = mat2gray(feature{m});
%     figure, imshow(mat2gray(feature{1}));
    
    
    R_second_c = R{i+2}; % c 比如第二对左边,应对的是3
    G_second_c = G{i+2}; % c 比如第二对左边,应对的是3
    
    R_second_s = R{i+5}; % s 比如第二对右边,应对的是7
    G_second_s = G{i+5}; % s 比如第二对右边,应对的是7
    
    temp_c = abs(R_second_c - G_second_c); % (R(c)-G(c))
    temp_s = abs(R_second_s - G_second_s); % (G(s)-R(s)
    
    temp_s = imresize(temp_s, size(temp_c)); 
    feature{m+1} = abs(temp_c - temp_s);
    feature{m+1} = mat2gray(feature{m+1});

    m = m + 2;
end

end

 

function luminace_feature = get_feature(luminace)

% 再求6个亮度特征,6个尺度对{2-5,2-6,3-6,3-7,4-7,4-8},应用到这里matlab就是{3-6,3-7,4-7,4-8,5-8,5-9}
m = 1;
for i = 1:3 % 每次循环处理两对,循环三次
    disp(i)
    first_1 = luminace{i+2}; % 比如第一对3-6左边,应对的是3
    first_2 = luminace{i+5}; % 比如第一对右边,应对的是6
    first_2 = imresize(first_2, size(first_1));
    luminace_feature{m} = abs(first_1 - first_2);
    luminace_feature{m} = mat2gray(luminace_feature{m});
%     figure, imshow(mat2gray(luminance_feature{1}));
    
    second_1 = luminace{i+2}; % 比如第二对左边,应对的是3
    second_2 = luminace{i+6}; % 比如第二对右边,应对的是7
    second_2 = imresize(second_2, size(second_1));
    luminace_feature{m+1} = abs(second_1 - second_2);
    luminace_feature{m+1}  = mat2gray(luminace_feature{m+1} );
    
    m = m + 2;
end

end
function [Eim, Oim, Aim] = spatialgabor(im, wavelength, angle, kx, ky, showfilter)
if nargin == 5
     showfilter = 0;
 end

 im = double(im);
 [rows, cols] = size(im);
 newim = zeros(rows,cols);

 % Construct even and odd Gabor filters
 sigmax = wavelength*kx;
 sigmay = wavelength*ky;

 sze = round(3*max(sigmax,sigmay));
 [x,y] = meshgrid(-sze:sze);
 evenFilter = exp(-(x.^2/sigmax^2 + y.^2/sigmay^2)/2)...
.*cos(2*pi*(1/wavelength)*x);

 oddFilter = exp(-(x.^2/sigmax^2 + y.^2/sigmay^2)/2)...
.*sin(2*pi*(1/wavelength)*x);    


 evenFilter = imrotate(evenFilter, angle, 'bilinear');
 oddFilter = imrotate(oddFilter, angle, 'bilinear');    


 % Do the filtering
 Eim = filter2(evenFilter,im); % Even filter result
 Oim = filter2(oddFilter,im);  % Odd filter result
 Aim = sqrt(Eim.^2 + Oim.^2);  % Amplitude 

 if showfilter % Display filter for inspection
     figure(1), imshow(evenFilter,[]); title('filter'); 
 end
function nor_feature = normalize_minmax(feature)
    for i = 1:6
        current_feature = feature{i};
        Maxv = max(current_feature(:));
        Minv = min(current_feature(:));
        nor_feature{i} = (current_feature - Minv) ./ (Maxv - Minv);
    end
end

 

实现结果,最终的各个特征下的显著图:

 

Itti1998 A Model of saliency Based Visual Attention for Rapid Scene Analysis 算法复现_第3张图片

 

在尺度2下,即尺度对为2-5下,显著图:

Itti1998 A Model of saliency Based Visual Attention for Rapid Scene Analysis 算法复现_第4张图片

总结:

颜色和亮度特征对于显著性检测比较有用,方向特征起不到效果,尤其是0度和90度,都是噪声。

算法特点:速度非常快,原因主要的算法步骤是做差分,即尺度大的(细节图)A,减去尺度小的(背景图)B,得到对比度图

优化方向:可以考虑换其他方式提取方向信息
 

你可能感兴趣的:(论文复现,Matlab,Salient,Obejct,Detection)