1、A model of saliency-based visual attention for rapid scene analysis
受早期灵长类动物早期视觉系统的神经结构和行为所启发的视觉注意系统。,他将图像特征组合成显著性图。
模型:
*采用二进高斯金字塔产生9个空间比例:S0~S8;
*由灵长类动物的视觉特征:对中心敏感,对周围不敏感,由此实现
中心是尺度c={2,3,4}中的像素,周围(surround)是在尺度s=c+d,d={3,4}中相关位置的像素。两者先插值,再点对点相减
*用r,g,b三个颜色通道得到5个高斯金字塔,从而得到42张特征图(通过金字塔相减得到),特征图结合成3张显著性图,3张图归一化得到得到最后的输入S(显著性图SM),FOA指向显著性图的最大值处。
*把SM模拟为神经元,有阈值电流;SM为胜者为王神经网络提供输入
*胜者为王,注意焦点FOA转移:
a) SM中的神经元接受来自S的刺激输入
b) 显著性区域的神经元电势上升快
c) 每个神经元激发相应的WTA神经元
d) 直到胜者为王WTA达到阈值激发
3个同时机制:
- FOA转移到获胜的神经炎区域
- 所有WTA神经元抑制
- 在新的WTA位置,抑制被取消
*原程序的代码在http://www.saliencytoolbox.net/可以下载
*注意焦点转移示意图:
2、Salient region detection and segmentation
Salient region detection:应用文中的原话就是:saliency is determined as the local contrast of an image region with respect to its neighborhood at various scales. 我自己的理解为:在一个给定的尺度图上,通过每个像素的特征向量来获取一个特征融合的特征图,再将这些尺度不同的显著性图结合为一个显著性图;而不是像其他的一样,将一些不同特征的显著性图进行组合。而这些不同的尺度指的是外围区域R2的尺度。R2一般为1个像素,也可以是N x N像素。若图像的宽是w,则R2的宽在w/2和w/8之间
在一个给定的尺度,各个像素的显著性值为
再将不同尺度的显著性图逐像素相加
得最终的显著性图。
Salient region detection and segmentation:通过爬山算法用K—means算法过分割,爬山算法可以看做是在多维直方图空间中寻找最大的一种搜索窗体
代码粘贴:
% author = {Achanta, Radhakrishna and Extrada, Francisco and Süsstrunk, Sabine},
% booktitle = {{I}nternational {C}onference on {C}omputer
% {V}ision {S}ystems},
% year = 2008
% }
%---------------------------------------------------------
%
%
%---------------------------------------------------------
% Read image
%---------------------------------------------------------
img = imread(‘C:\Users\dell\Desktop\±?òμéè??\êμ?é??2?\100070.jpg‘);%Provide input image path
tic;%?aê???ê±
dim = size(img);
width = dim(2);height = dim(1);
md = min(width, height);%minimum dimension
%---------------------------------------------------------
% Perform sRGB to CIE Lab color space conversion (using D65)
%---------------------------------------------------------
cform = makecform(‘srgb2lab‘, ‘AdaptedWhitePoint‘, whitepoint(‘d65‘));%′′?¨??é?×a???á11
lab = applycform(img,cform);
l = double(lab(:,:,1));%μ?μ?3ì??÷
a = double(lab(:,:,2));
b = double(lab(:,:,3));
%If you have your own RGB2Lab function...
%[l a b] = RGB2Lab(gfrgb(:,:,1),gfrgb(:,:,2), gfrgb(:,:,3));
%---------------------------------------------------------
%Saliency map computation
%---------------------------------------------------------
sm = zeros(height, width);
off1 = int32(md/2); off2 = int32(md/4); off3 = int32(md/8);%R2μ?3?D3??è
for j = 1:height
y11 = max(1,j-off1); y12 = min(j+off1,height);
y21 = max(1,j-off2); y22 = min(j+off2,height);
y31 = max(1,j-off3); y32 = min(j+off3,height);
for k = 1:width
x11 = max(1,k-off1); x12 = min(k+off1,width);
x21 = max(1,k-off2); x22 = min(k+off2,width);
x31 = max(1,k-off3); x32 = min(k+off3,width);
lm1 = mean2(l(y11:y12,x11:x12));am1 = mean2(a(y11:y12,x11:x12));bm1 = mean2(b(y11:y12,x11:x12));
lm2 = mean2(l(y21:y22,x21:x22));am2 = mean2(a(y21:y22,x21:x22));bm2 = mean2(b(y21:y22,x21:x22));
lm3 = mean2(l(y31:y32,x31:x32));am3 = mean2(a(y31:y32,x31:x32));bm3 = mean2(b(y31:y32,x31:x32));
%---------------------------------------------------------
% Compute conspicuity values and add to get saliency value.
%---------------------------------------------------------
cv1 = (l(j,k)-lm1).^2 + (a(j,k)-am1).^2 + (b(j,k)-bm1).^2;%í?ò?????μ?2?í?ì??÷èúo?
cv2 = (l(j,k)-lm2).^2 + (a(j,k)-am2).^2 + (b(j,k)-bm2).^2;
cv3 = (l(j,k)-lm3).^2 + (a(j,k)-am3).^2 + (b(j,k)-bm3).^2;
sm(j,k) = cv1 + cv2 + cv3;%2?í?3??èμ?ì??÷2??áo?
end
end
toc
imshow(sm,[]);
3、Frequency-tuned Salient Region Detection
原文为:In our case we use the entire image as the neighborhood. This allows us to exploit more spatial frequencies than state-of-the-art methods (please refer to the paper for details) resulting in uniformly highlighted salient regions with well-defined borders. 将整个图像作为邻域
In simple words, our method find the Euclidean distance between the Lab pixel vector in a Gaussian filtered image with the average Lab vector for the input image.
原文代码:
%---------------------------------------------------------
% Copyright (c) 2009 Radhakrishna Achanta [EPFL]
% Contact: firstname.lastname@epfl.ch
%---------------------------------------------------------
% Citation:
% @InProceedings{LCAV-CONF-2009-012,
% author = {Achanta, Radhakrishna and Hemami, Sheila and Estrada,
% Francisco and S?sstrunk, Sabine},
% booktitle = {{IEEE} {I}nternational {C}onference on {C}omputer
% {V}ision and {P}attern {R}ecognition},
% year = 2009
% }
%---------------------------------------------------------
% Please note that the saliency maps generated using this
% code may be slightly different from those of the paper.
% This seems to be because the RGB to Lab conversion is
% different from the one used for the results in the C++ code.
% The C++ code is available on the same page as this matlab
% code (http://ivrg.epfl.ch/supplementary_material/RK_CVPR09/index.html)
% One should preferably use the C++ as reference and use
% this matlab implementation mostly as proof of concept
% demo code.
%---------------------------------------------------------
%
%
%---------------------------------------------------------
% Read image and blur it with a 3x3 or 5x5 Gaussian filter
%---------------------------------------------------------
img = imread(‘C:\Users\dell\Desktop\±?òμéè??\êμ?é??2?\100070.jpg‘);%Provide input image path
tic;%?aê???ê±
gfrgb = imfilter(img, fspecial(‘gaussian‘, 3, 3), ‘symmetric‘, ‘conv‘);
%---------------------------------------------------------
% Perform sRGB to CIE Lab color space conversion (using D65)
%---------------------------------------------------------
cform = makecform(‘srgb2lab‘, ‘AdaptedWhitePoint‘, whitepoint(‘d65‘));
lab = applycform(gfrgb,cform);
%---------------------------------------------------------
% Compute Lab average values (note that in the paper this
% average is found from the unblurred original image, but
% the results are quite similar)
%---------------------------------------------------------
l = double(lab(:,:,1)); lm = mean(mean(l));
a = double(lab(:,:,2)); am = mean(mean(a));
b = double(lab(:,:,3)); bm = mean(mean(b));
%---------------------------------------------------------
% Finally compute the saliency map and display it.
%---------------------------------------------------------
sm = (l-lm).^2 + (a-am).^2 + (b-bm).^2;
toc
imshow(sm,[]);
%---------------------------------------------------------
4、HC方法:基于直方图对比度的图像像素显著性检测方法(MingMingChen)
像素显著性 ==颜色显著性(通过颜色距离计算)——》基于直方图的加速(减少颜色数从而减少复杂度)——》色彩空间平滑操作(减少量化瑕疵使相似颜色有相近的显著性)
HC方法忽略了空间细节————》RC
RC方法:基于区域对比度的视觉显著性检测方法
1) 区域分割
2) 计算区域对比度(颜色距离)
3) 空间加权区域对比度(空间距离)
5、Saliency FiltersFrequency-tuned Salient Region Detection
1) 基本思想:显著性一直以来都被认为应该是一个滤波器,该文作者想到了将其使用滤波器的方法进行加速。这篇文章主要是对局部和全局两种显著特征的公式进行了分析,提出了一种可以再线性时间内计算的方法。
2) 方法流程:
① 图像分割:采用略微修改的超像素分割,根据CIElab空间的测地线图像距离进行K-means聚类,产生大体上均匀尺寸,并且可以保持颜色边界的超像素分割。
② 颜色独立性:
其中的权重与超像素空间位置的距离有关,如果这个值给予长距离很低的权重,这个颜色独立性就类似于中央周边的对比度,即距离远的像素对其显著性贡献较低;如果这个权重为常数,这个颜色权重就类似于Mingming Cheng论文里面的区域对比度。
这个公式也可以写成:
第一项的Σ结果是1,第二和第三项都可以看做是以ω为核的滤波器,分别对cj 和cj2滤波。本文将这个核写成了高斯的形式,并且借助Adams提出的permutohedral lattice embedding 滤波器来实现线性时间的计算。
③ 空间颜色分布:
权重是颜色的差距,前面是空间距离。根据ω(ci,cj)定义,颜色越接近近权重越大,即距离远但颜色相近的像素分布值大,和前一个特征刚好是相反,这个特征可以表示某种颜色在空间分布的广度。例如某种颜色分散在图像中,但是面积都很小,那么第一个特征计算出来这个颜色的独立性就比较高,但是第二个特征会告诉你这个颜色的分布很广,并不显著。
通过类似的推导,这个公式也可以写成高斯滤波的形式,借助Adams提出的permutohedral lattice embedding 滤波器来实现线性时间的计算,具体参考论文Fast High-Dimensional Filtering Using thePermutohedral Lattice。
④ 显著性融合:
由于空间颜色分布的区分度更大,因此作者将其放在了指数的位置,并加了一个权重调节。Di越大即颜色分布越广,对应显著性值越小;Ui越大对应颜色独立性越高,对应显著性值越大。
最后,特征被从超像素级映射到像素级。每个像素的显著性是通过其所在超像素以及周围的超像素进行高斯线性加权,权重取决于和颜色,位置的距离。最终的归一化也很重要,要求显著图至少包含10%的显著像素,这种归一化方式也会提升算法最终的评价指标。
3) 论文评价:考虑到颜色自身独立性与颜色分布对显著度的贡献结合,算法均在时域进行,并采用高斯滤波加速,得到很不错的效果。实际测试结果saliency map较均匀,但公布的代码缺少一些实验细节,没有论文的公布结果好。
6、SR方法
频域的显著性检测方法,将原图进行傅里叶变化,提取他的幅度谱和相位谱,保留相位谱,对幅度谱进行变化
作者发现大量图像的log幅度频谱的平均值是和频率呈现正比关系的
然后作者又提出了既然大量图像的log振幅谱都差不多趋近一条直线,那么一幅图像的log振幅谱减去平均log振幅谱不就是显著性部分了
L(f)是log振幅谱。h是一个n*n均值滤波的卷积核,作者设n=3,用来得到平均谱,R(f)就是显著性谱
代码:关键部分5行
clear
clc
%% Read image from file
inImg = im2double(rgb2gray(imread(‘102831.jpg‘)));
%%inImg = imresize(inImg, 64/size(inImg, 2));
%% Spectral Residual
myFFT = fft2(inImg);
myLogAmplitude = log(abs(myFFT));%abs()求振幅谱angle£()求相位谱
myPhase = angle(myFFT);
mySpectralResidual = myLogAmplitude - imfilter(myLogAmplitude, fspecial(‘average‘, 3), ‘replicate‘);
saliencyMap = abs(ifft2(exp(mySpectralResidual + i*myPhase))).^2;
%% After Effect
saliencyMap = mat2gray(imfilter(saliencyMap, fspecial(‘gaussian‘, [10, 10], 2.5)));%mat2grayêμ?????óμ?1éò??ˉ2ù×÷
imshow(saliencyMap);
效果图: