显著性检测—基于上下文内容感知方法

基于上下文感知的显著性检测方法,不同于眼睛注视和显著目标检测,它的目的是检测代表场景的图像区域。根据心理学文献中观察到的四个原则,提取了图像的代表性区域,得到了更好的显著性图。在下面的实验中,会分析每一步的结果,通过调试参数的设置,比较结果对saliency map的影响。
点击查看原文《Context-Aware Saliency Detection》

介绍

一般地,显著性检测算法分为两种,眼动点预测和显著物体检测。第一种主要是识别注视点,即那些引起人类观察者第一眼的注意。这种显著性有利于理解人类的注意力和视觉机制。显著物体检测则是完整分割图像中的显著对象,受计算机视觉的高级任务驱动,比如对象识别或分割。这篇论文提出一种新的显著性检测,即上下文感知显著性。观察许多图像得知,一些背景对于传达场景是至关重要的。所以这个任务的目标是突出的区域不仅要包含突出的对象,还要包含背景中传达语境的部分。

情境感知显著性遵循了人类视觉注意的四个基本原则,并得到了心理学证据的支持:

*****局部的低层次考虑,包括对比度和颜色等因素。
*****全局考虑,它会抑制经常出现的特性,同时维护偏离常规的特性。
*****视觉组织规则,这表明视觉形式可能拥有一个或几个组织形式的重心。
*****高层次的因素,比如人脸。

Detection of context-aware saliency

1.超像素分割
计算local-global single-scale saliency需要把图像划分成许多小patch,比较常见的方法是将图像平均分为r大小的正方格,r为尺度。但在本实验中,将图像进行超像素分割,分割的数量可以根据scale调整。基于超像素计算的saliency map减少了方形patch带来的块状效应,使得边缘更加平滑。不同scale的超像素分割结果如图1所示,(a)(b)(c)(d)分别为尺度=1、2、4、8时的超像素分割结果,scale越大,像素块的面积越大。
在这里插入图片描述
2.估算每个patch的saliency
计算saliency map,首先需要计算每个patch的颜色和位置表示。每个patch的位置为其所包含像素的中心位置,颜色为所有像素Lab空间的平均颜色。接下来计算每个patch之间的欧式颜色距离和位置距离,分别如下式所示:
在这里插入图片描述
在这里插入图片描述
其中dcolor(pi,pj)为patch i与j在Lab*空间中的颜色距离,dposition(pi,pj)为欧氏距离。

非相似性的度量与外观差异成正比,与位置距离成反比。根据不同的定义,公式如下:
在这里插入图片描述
其中c为可调参数。patch i与其他patch的差异越大,越显著。

在实践中,为了评估一个patch的唯一性,不需要考虑它与其他所有图像patch的不同。只要考虑K个最相似的patch就足够了。将patch在r尺度上的单尺度显著性值记为:
在这里插入图片描述
K是可以根据刻度调整的参数。设置适当的值可以有效地提高效果。

3.多尺度显著性增强
使R = {r1,…, rM}表示patch i需要考虑的patch大小集合。在实验方案中选择四个尺度,r分别= 1,2,3,4。这里的r并不表示patch面积为r*r,而是r越大,分割超像素的数量越少,patch越大。patch i的显著性是不同尺度的平均值。
在这里插入图片描述
这里M=4, Si为patch的多尺度显著性。如果将每个patch的显著性分配给它所包含的像素,就可以得到整个图像的像素级显著性映射。

4.显著性加权
显著性映
在这里插入图片描述
通过对显著性进行加权,可以增强多尺度平均显著性图。按照第三条规则,遵循视觉形式的法则,人眼环顾四周的许多区域,而不是漫无目的。

对于显著性映射,如果像素的显著性值超过设置的阈值T,则认为该像素属于关注区域。这个阈值需要根据图片调整。然后,对区域外每个像素到最近注意像素的欧氏距离进行加权。设置dfoci(i)为像素i与最近聚焦像素的欧氏距离,归一化到[0,1]的范围。将像素的显著性重新定义为:
在这里插入图片描述
下一步是利用检测到的高级特征,比如人脸,并继续加权。加载人脸检测器得到人脸区域,将人脸区域的像素dfoci(I)设置为0,即保留其原始显著性值,不加权值。

代码实现

clear all
format long

%% 读取图像
img_path='image\2.png';
img  = im2double(imread(img_path));%图像类型数据转换为double
%img=imresize(img,2);
shape=size(img); 
Scale=1;  %初始化尺度为1
Scale_index=0;  %尺度索引
Saliency_scales=zeros(shape(1),shape(2),4);%初始化多尺度saliency map [height,width,尺度数] 


%% 计算多尺度显著图
while(Scale<=8) 
Scale_index=Scale_index+1; %每循环一次尺度索引+1
    
%% 超像素分割
num_superpx=800/Scale;  %超像素数量  反映scale大小,scale越大相对应超像素数量越少
%num_superpx=floor(sqrt(shape(1)*shape(2))/Scale)
img_superpx= mexGenerateSuperPixel(img, num_superpx); %超像素分割  
max_superpx=max(max(img_superpx));%超像素图像的最大值  value[0-]  有的像素块value相同  
%img_superpx=img_superpx./max(max(img_superpx));
%imshow(img_superpx)  %显示超像素分割结果


%% 初始化patch 位置颜色矩阵
num_patch=0;  %有效像素块个数  像素块value相同的作为一个patch  
patch_position=zeros(max_superpx,2); %初始化每个patch最终计算的位置和颜色
patch_color=zeros(max_superpx,3); 
cform = makecform('srgb2lab'); %创建颜色转换结构  
lab = applycform(imread(img_path), cform); %执行颜色转换  至Lab空间
L=lab(:,:,1); a=lab(:,:,2); b=lab(:,:,3); %整个图像的三个颜色通道  为3个二维矩阵


%% 计算每个patch中心位置和颜色均值
for i=0:max_superpx   %最多共有max_superpx+1个patch  i=[0:max_superpx]
   [r_index,c_index]= find(img_superpx==i);  %像素value相同作为一个patch   r_index/c_index该patch 像素横纵坐标矩阵
   num_px=length(r_index);   %patch中包含的像素个数
   if num_px~=0       %若包含的像素个数不为0
       num_patch=num_patch+1;   %有效patch个数+1
       
       %计算该patch的中心坐标 赋给位置矩阵
       patch_position(num_patch,1)=mean(r_index);
       patch_position(num_patch,2)=mean(c_index);
       
       %计算该patch颜色均值 赋给颜色矩阵
       sum_L=0; sum_a=0; sum_b=0;
       for c =1:num_px     %遍历原像素  分别对Lab的值求和
           sum_L=sum_L+uint64(L(r_index(c),c_index(c)));
           sum_a=sum_a+uint64(a(r_index(c),c_index(c)));
           sum_b=sum_L+uint64(b(r_index(c),c_index(c)));
       end
       patch_color(num_patch,1)=sum_L/num_px;  %Lab的平均值作为patch的颜色特征  赋给颜色矩阵
       patch_color(num_patch,2)=sum_a/num_px;
       patch_color(num_patch,3)=sum_b/num_px;
   end
   clear r_index c_index sum_L sum_a sum_b c %局部变量用完及时清除
   
end     %循环完所有patch,得到完整的位置和颜色矩阵



%% 计算每个patch颜色距离和位置距离,得出非相似度
Dcolor = pdist(patch_color,'euclidean');  %计算color的各行向量,即各patch之间的距离   生成m(m–1)/2的行向量
Dposition = pdist(patch_position,'euclidean');

C=3; %系数可调 2/3
D=Dcolor./(1+C*Dposition);
Dissimilar=squareform(D);  %将非相似度行向量转化为 原对称距离矩阵


%% 找出每个patch最相似的K个patch,计算patch_saliency和pixel saliency
K=floor(120/Scale);  %参数可调,论文为64   k随着scale的增大而减少
Saliency_patch=zeros(num_patch,1); %每个patch的saliency矩阵
for i=1:num_patch
    sortD=sort(Dissimilar(i,:)); % i patch与其他非相似度的 升序排列
    kmin=sortD(K);  %选最低的k个值  即K个最相似的值
    Saliency_patch(i)=1-exp(-sum(sortD(1:K))/K);  % 计算patch saliency 
end
for i=1:shape(1)    %遍历图像像素 计算pixel saliency
   for j=1:shape(2)    %把patch的saliency值  赋给在Scale_index尺度下对应的各个像素 
       Saliency_scales(i,j,Scale_index)=Saliency_patch(img_superpx(i,j)+1); 
   end                                           %S_patch的索引从1开始,所以sp(i,j)要+1
end


%% 改变尺度变量 进行下次循环
Scale=Scale*2;  %为整个循环改变尺度  共4个尺度 1 2 4 8;
% s=strcat('ss',num2str(Scale_no),'.png');
% imwrite(S_pixel(:,:,Scale_no),s,'png');   %查看每个尺度的saliency map!!!
                                            %对比每个scale的不同结果
end      %While尺度循环结束处!!!


%% 计算多尺度平均saliency
Saliency_pixel=mean(Saliency_scales,3);   %计算每个像素的多尺度saliency平均 
%imshow(Saliency_pixel);


%% 寻找attention pixel
[x_foci,y_foci]=find(Saliency_pixel>0.08);%判断attention阈值 可调节 
set_foci=[x_foci,y_foci];    % attention二维矩阵 行数为focus attention pixel数,列为各个坐标
img_foci=zeros(shape(1),shape(2));  %构造foci map  与原图大小相同

if isempty(x_foci)           %若没有符合条件的pixel 调整阈值
    disp('Attention threshold error!');
end
for i=1:size(x_foci)    %在foci map中  对每个foci赋值
    img_foci(set_foci(i,1),set_foci(i,2))=0.8;    %foci(i,1),foci(i,2)为横纵坐标
end
%imshow(img_foci);  %显示attention pixel


%% 计算每个pixel到foci的最近距离 
Dfoci=zeros(shape(1),shape(2)); %每个pixel与foci的最近距离 二维矩阵
for i=1:shape(1)
    for j=1:shape(2)
        index=[i, j];
        D_matrix=pdist2(index,set_foci);  %计算每个pixel与foci距离矩阵
        Dfoci(i,j)=min(D_matrix);   %寻找最小距离  赋给dfoci
        clear D_matrix
    end
end
Dfoci=Dfoci./max(max(Dfoci));   %将Dfoci归一化  range[0,1]
%imshow(Dfoci)  %显示attention distance map


%% 高层特征 通过人脸检测 调整该区域的Dfoci
faceDetector = vision.CascadeObjectDetector;  %载入人脸检测器
bboxes = step(faceDetector,imread(img_path)); % Detect faces 
num_face=size(bboxes);  %检测到的人脸个数

if num_face(1)~=0  %将人脸的区域 dfoci替换为0 表示保留原saliency值 不进行加权!
    for i=1:num_face(1)
        x=bboxes(i,1);
        y=bboxes(i,2);
        w=bboxes(i,3);
        h=bboxes(i,4);
        Dfoci(y:y+h,x:x+w)=0;
    end
end


%% saliency map用Dfoci加权,并输出结果图
Saliency_weighted=Saliency_pixel.*(1-Dfoci);
Saliencymap = mat2gray(imfilter(Saliency_weighted, fspecial('gaussian', [5, 5], 2.5)));  %将saliency map高斯模糊
imshow(Saliencymap)  %显示结果图

结果分析

1.单尺度的显著性
不同的scale对saliency map有一定的影响,如图3所示,随着scale的增大,图像粒度增大,块状效应逐渐明显,细节逐渐丢失,通过人脸的轮廓和头巾可以看出来。所以将各个scale的saliency map进行平均既可以保留物体清晰的细节,又可以保证物体的区域性,多尺度平均saliency map的效果较好。
在这里插入图片描述

2.分步结果
所示,紫色的花田图像中那朵白花最为显著,若无高斯卷积,整张图像的saliency map值较低,显著区域不可见。所以为了方便观察,对距离加权前后的saliency map都进行了高斯滤波。对比图4的©和(d),加权前紫花部分较为明显,加权后紫花的saliency value明显降低,证明格式塔定律的正确性。
在这里插入图片描述
3.attention pixel阈值
Attention pixel threshold的选择对saliency map有一定的影响。如图5所示,(a)(b)©(d)分别为原始图像,阈值T为0.05、0.08和0.1显著性图,随着阈值T的增大,挑选出来的attention pixel 数量减少,有部分点的距离增大,加权后整体的saliency 值偏低,saliency map变暗。通过图中男士周围灯笼灰度即可得。
在这里插入图片描述
4.人脸区域加权
高阶因素的增强,例如人脸,对包含人的图像显著性检测效果有较大的提升。如图5所示,图中包含了4个人脸,在未经过人脸区域加权时,只有黑头发女生的人脸区域显著性较高,最左侧男声的人脸十分暗,经过加权后,左侧的两个人脸区域都被标识出来,人脸的显著性得到较好增强。
在这里插入图片描述

总结

本实验实现了context-aware saliency detection.该方法检测出来的区域不仅包括显著物体,还包括有文本意义的背景,所以检测结果对图片的场景有较强的表达性。但是不足之处是计算相对复杂,当输入图片较大且对分辨率要求较高时,计算时间较长。

[1]S. Goferman, L. Zelnik-Manor and A. Tal, “Context-Aware Saliency Detection,” in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 34, no. 10, pp. 1915-1926, Oct. 2012, doi: 10.1109/TPAMI.2011.272.

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值