2016-10-24 19:16:57 ybuiipl 阅读数 11960


1.基于谱残差法的显著性检测

(Saliency Detection: A Spectral Residual Approach)

给定一幅图像,I(x)首先计算其2维离散傅里叶变换,将其从空间域转换到频域,对幅值取对数后得到log谱L(f):


式中F代表2维离散傅里叶变换,I·I代表其幅值,φ代表其相位。

由于log曲线满足局部线性条件,所以用局部平均滤波器hn(f)对其进行平滑,获得log谱的大致形状:


hn(f)是一个nxn矩阵定义为:


因此谱残差就是log谱和其进行均值滤波后的差,可按下面的式子计算:


谱残差能够描述一幅图像中的异常区域,因此可以用来进行显著目标检测。将谱残差和相位P(f)进行2维离散傅里叶反变换


由此可以重构出一幅图像,用来表示原图像各像素的显著性,称为显著图(saliencymap)。

下面为基于谱残差法显著性检测的matlab代码


function [srmap] = sr(rgb, sigma)
%计算利用最基本普残差得到显著图,即不包含颜色亮度分量等特征
F = fft2(rgb2gray(rgb));%将彩色图像转为灰度图像(即亮度)后进行二维离散傅立叶变换

Af = abs(F);%对傅立叶变换结果取绝对值(即求变换后图像的幅度图像)
Pf = angle(F);%求变换后图像的相位谱图像
Lf = log(Af);%得到幅度值的Log谱

filt = fspecial('average', 3);%创建局部平均滤波算子[3,3]为默认尺寸

%circular'图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
Rf = Lf - imfilter(Lf, filt, 'circular');% 幅度值的Log谱-局部平均滤波器进行平滑处理后的Log谱得到普残差

srmap = ifft2((exp(Rf+i*Pf)));%将相位谱和谱残差进行二维傅立叶反变换得到显著图
srmap = abs(srmap);%取上面计算图像的幅值部分即位显著图(saliency map)
srmap = srmap .^ 2;%将显著图矩阵中各个元素平方,即为进行二维卷积运算,利用了“复数和它的共轭复数的乘积是复数模的平方”这一结论

srmap = mat2gray(imfilter(srmap, fspecial('gaussian',[3 3], sigma)));%对处理后的显著图进行滤波(高斯低通滤波尺寸为[3,3],Sigma为滤波器的标准差),然后归一化

end


以下为谱残差法显著性检测的C++实现

// opencvtest1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <cv.h>
#include <highgui.h>

using namespace cv;
using namespace std;

int _tmain(int argc,char** argv)
{
	//读取图片
	const char *filename = (argc >=2 ? argv[1]:"1.jpg" );
	Mat I = imread(filename);
	if (I.empty())
	{
		return -1;
	}
	//彩色图转成灰色图
	if (I.channels()==3)
	{
		cvtColor(I,I,CV_RGB2GRAY);
	}
	Mat planes[] = { Mat_<float>(I), Mat::zeros(I.size(), CV_32F) };
	Mat complexI;
	//构造复数双通道矩阵
	merge(planes,2,complexI);
	//快速傅里叶变换
	dft(complexI,complexI);
	Mat mag, pha, mag_mean;
	Mat Re, Im;
	//分离复数到实部和虚部
	Re = planes[0]; //实部
	split(complexI, planes); 
	Re = planes[0]; //实部
	Im = planes[1]; //虚部
	//计算幅值
	magnitude(Re, Im, mag); 
	//计算相角
	phase(Re, Im, pha); 

	float *pre, *pim, *pm, *pp;
	//对幅值进行对数化
	for (int i = 0; i<mag.rows; i++)
	{
		pm = mag.ptr<float>(i);
		for (int j = 0; j<mag.cols; j++)
		{
			*pm = log(*pm);
			pm++;
		}
	}
	//对数谱的均值滤波
	blur(mag, mag_mean, Size(5, 5)); 
	//求取对数频谱残差
	mag = mag - mag_mean; 

	for (int i = 0; i<mag.rows; i++)
	{
		pre = Re.ptr<float>(i);
		pim = Im.ptr<float>(i);
		pm = mag.ptr<float>(i);
		pp = pha.ptr<float>(i);
		for (int j = 0; j<mag.cols; j++)
		{
			*pm = exp(*pm);
			*pre = *pm * cos(*pp);
			*pim = *pm * sin(*pp);
			pre++;
			pim++;
			pm++;
			pp++;
		}
	}
	Mat planes1[] = { Mat_<float>(Re), Mat_<float>(Im) };
	//重新整合实部和虚部组成双通道形式的复数矩阵
	merge(planes1, 2, complexI); 
	// 傅立叶反变换
	idft(complexI, complexI, DFT_SCALE); 
	//分离复数到实部和虚部
	split(complexI, planes); 
	Re = planes[0];
	Im = planes[1];
	//计算幅值和相角
	magnitude(Re, Im, mag); 
	for (int i = 0; i<mag.rows; i++)
	{
		pm = mag.ptr<float>(i);
		for (int j = 0; j<mag.cols; j++)
		{
			*pm = (*pm) * (*pm);
			pm++;
		}
	}
	GaussianBlur(mag, mag, Size(7, 7), 2.5, 2.5);
	Mat invDFT, invDFTcvt;
	//归一化到[0,255]供显示
	normalize(mag, invDFT, 0, 255, NORM_MINMAX); 
	//转化成CV_8U型
	invDFT.convertTo(invDFTcvt, CV_8U); 
	imshow("SpectualResidual", invDFTcvt);
	imshow("Original Image", I);

	waitKey(0);
	return 0;
}



2.基于相位谱的显著性检测

下面给出基于相位谱的显著性检测matlab代码
function [pftmap] = pft(rgb)

% [row,col,page] =size(rgb);

gimg = rgb2gray(rgb);%将彩色图像转为灰度图像

F = fft2(gimg);%对灰度图像进行二维离散傅里叶变换

amp = abs(F);%得到幅值图像
ph = angle(F);%得到相位图

s = ifft2(1 * exp(1i*ph));%不加入幅值图像部分,只对相位谱进行二维离散傅里叶反变换
filt = fspecial('gaussian', [3 3]);%标准差为sigma的二维高斯滤波算子

Pftmap = mat2gray(imfilter(abs(s).*abs(s), filt, 'circular'));
pftmap = mat2gray(Pftmap);%归一化
end


3.基于四元傅里叶变换的显著性检测

(Spatio-temporal Saliency Detection Using Phase Spectrum of Quaternion Fourier Transform)

定义t时刻的输入图像F(t)(t=1,2,...,T,T表示输入视频的总帧数),r(t)、g(t)、b(t)分别表示F(t)的红、绿、蓝三通道,则其独立的颜色通道R(红)G(绿)B(蓝)Y(黄)分别定义为:

F(t)的亮度特征I(t)和运动特征M(t)定义如下:


根据人眼视觉系统的生理结构!研究发现人类视觉皮层存在红/绿、蓝/黄神经元,用RG(t)、BY(t)表示如下:

研究表明!在人类视觉系统,M(t)、I(t)、RG(t)、BY(t)这四个特征通道几乎是独立的。因此!可以用一个四元数q(t)表示视频帧的上述四个特征),定义加权图像四元数表示如下:

其中


可将q(t)写为如下形式:

q(t)可写为四元傅里叶变换(Quaternion Fourier Transform)的形式:


四元傅里叶变换的逆变换可写为如下形式:

我们用Q(t)表示频域的q(t),Q(t)可以写为极数形式:

其中表示Q(t)的相位谱部分,u是四元数的虚数单位。
则Q(t)中只保留相位谱信息,对其进行傅里叶变换的逆变换得到q'表示如下:

最终的显著图定义为:


下面为基于四元傅里叶变换的显著性检测matlab代码:
function [qpftmap, RG, BY,I1] = qpft(rgb, sigma )%-1
%四元傅里叶相位谱显著性检测
[row ,col, page] = size(rgb);

%计算四元数
r = double(rgb(:,:,1));  g = double(rgb(:,:,2)); b = double(rgb(:,:,3));%r红通道g绿通道b蓝通道
R = r - (g + b)/2; %调整后的红色通道
G = g - (r + b)/2; %调整后的绿色通道
B = b - (r + g)/2; %调整后的蓝色通道
Y = (r + g)/2 - (abs(r - g))/2 - b;%黄色通道

u1=1;%I
u2=1;%RG


RG = R - G;%红/绿对立神经元

BY =B - Y;%蓝/黄对立神经元

I1 = ((r+g+b)./3).*u1;%-0 计算亮度特征
%I0=rgb2gray(rgb);
 %I1=grayslice(I0,64);
 %I1=double(I1);
%level = graythresh(I0);  %OTSU阈值确定-1
%I1=im2bw(I0,level); %转为二值图像-1

M = zeros(row, col); %创建一个全0数组(运动特征)

%定义加权四元数表示如下
 f1 = M + RG * 1i; 
 f2 = BY + I1* 1i;
 %进行傅里叶变换
 F1 = fft2(f1);
 F2 = fft2(f2);


phaseQ1 = angle(F1);%得到相位谱
phaseQ2 = angle(F2);%得到相位谱
ifftq1 = ifft2(exp(phaseQ1 * 1i));%对相位谱进行傅里叶反变换
ifftq2 = ifft2(exp(phaseQ2 * 1i));%对相位谱进行傅里叶反变换
absq1 = abs(ifftq1);%得到幅值图像
absq2 = abs(ifftq2);%得到幅值图像


squareq=(absq1+absq2).*(absq1+absq2);


L = fspecial('gaussian', [5 5], sigma);%标准差为sigma的二维高斯滤波算子

Squareq = mat2gray(imfilter(squareq, L, 'circular'));%L表示标准差为sigma的二维高斯滤波器
qpftmap = mat2gray(Squareq);%最终显著图为归一化后的二维矩阵
end





4.实验结果

从测试图像库中选取10幅不同类型的图片作为实例进行展示。如下图所示,其中每组图片第一列为输入图像,第二列为谱残差法输出的显著图,第三列为相位谱法获得的显著图,第四列为四元傅立叶变换法得到的显著图。由图可见谱残差法虽然能检测出人所感兴趣的人或物体,但当背景比较复杂时,显著性检测效果不佳,如在第3、第6幅图像的谱残差法显著图中背景在显著图中占大部分。单纯的相位谱法虽然能剔除一些稍复杂的背景,获得相对满意的结果,但却不能突出图像颜色对比强烈的地方,如第3幅图中相位谱法虽然剔除了黄色的背景,但却并没有检测出图像中的红色警示部分。第2幅图中,基于四元傅立叶变换的显著性检测法能够很好的检测出广告牌中红色警示部分,第3、4、5幅图中四元傅立叶变换检测法最为准确,特别是在第5和第7幅图中,四元傅立叶变换法不仅检测出了完整的花朵边缘部分,而且检测出了颜色不同于花瓣的花芯部分。第8幅图中,三种方法均检测出了人像,四元傅立叶变换法和前两种方法比对人的轮廓检测更为准确,而且对图像中的一些细节例如摩托车和人像橘黄色的部分检测为显著区域。第6幅图,三种方法均没有检测出动物部分,四元相位谱检测法将背景中绿色部分检测为显著区域,并没有将人真正注意的动物部分检测为显著区域,可能原因为缺乏先验知识、动物部分与背景对比度弱等。第9幅图,3种方法均没有明确的检测出感兴趣区域说明上述三种方法仍需要改进。

第1-6幅图像的实验结果

第7-10幅图的实验结果

5.参考文献

  1. Hou X, Zhang L. Saliency Detection: A Spectral Residual Approach[J]. 2007,2007:1-8.
  2. 刘娟妮,彭进业,李大湘,.基于谱残差和多分辨率分析的显著目标检测[J].中国图象图形学报,2011, 16(2):244-249.
  3. Guo C,Ma Q, Zhang L.Spatio-temporal Saliency detection using phase spectrum of quaternionfouriertransform[C]// IEEE Computer Society Conference on Computer Vision &Pattern Recognition IEEE Computer Society Conference onCvpr.2008:1-8.
  4. 李富生,李霞,陈宇.基于改进四元傅里叶变换的显著性检测及其视频编码应用[J].计算机应用研究,2015(5):1540-1545.
延边大学智能信息处理研究室
方志明
刘星辰

2015-09-21 15:22:57 tyq101010 阅读数 16212


1.Mingming Cheng,Global Contrast based Salient Region Detection,CVPR2011

1) HC:基于直方图对比度的方法,每一个像素的显著性值是由它与图像中所有其他像素的颜色差异来确定,得到全分辨率显著性图像;

2) RC:基于局部对比度的方法,先将图像分割成小区域,采用的分割方法是基于图的分割,基本分割思想是将每个像素点作为无向图的顶点,两个像素点之间的不相似度作为边的权重,要求连接相同区域内的两个顶点的边的最大权重要小于连接不同区域的顶点的边的最小权重,在迭代过程中进行顶点归纳与区域合并,具体参见论文Efcient graph-based image segmentation;每个区域的显著性值由它与其他所有区域的空间距离和区域像素数加权的颜色差异来确定;空间距离为两个区域重心的欧氏距离,较远区域分配较小权值;

3) 细节加速:

① 基于直方图的加速:将每个颜色通道由256个颜色值量化到12个颜色值后,对输入图像计算颜色直方图,保留高频颜色,覆盖95%图像像素,剩下颜色舍弃,用直方图中距离最近的颜色代替;

② 颜色空间平滑:减小量化误差,每个颜色的显著性值被替换为相似颜色显著性的加权平均;在RGB空间进行量化,用Lab空间度量距离;

4) 评价:基于HC的理论方法很简单,根据全局对比度计算显著度,计算速度快,对于背景较简单的图像效果也不错;RC改变了处理单元,由单个像素到图像块,速度较慢,效果并没有比HC提高很多,个人认为基于图的分割结果不够好,导致saliency map不均匀。

 

2.Yulin Xie,Visual Saliency Detection Based on Bayesian Model,ICIP2011

1) 基本流程:

① 检测显著目标的角点:颜色增强Harris角点检测。对输入的彩色图像计算颜色增强矩阵Mboost,用Mboost对输入图像进行颜色转换,计算颜色增强后的图像的Harris角点能量函数得到能量图,选取能量图中能量值最大的几个点,并剔除图像边界附近的点,得到较准确的显著点;

② 用一个凸包将所有显著点包围起来,得到显著区域的大致位置;

③ 将显著度计算等价为贝叶斯后验概率的计算:

 

a. 先验概率p(sal):计算每个像素显著度。将输入图像进行超像素分割,计算每个超像素的平均颜色和空间位置;对凸包内外的超像素分别进行K-means聚类,计算凸包内每个cluster与凸包外所有clusters的平均颜色距离,最大距离对应的那个cluster为显著cluster;其他所有超像素的显著度由它与显著cluster内的超像素的空间和颜色距离来确定;将计算的所有显著值归一化到[0,1],作为贝叶斯框架的先验概率。

b. 观测概率p(x|sal)p(x|bk):分别计算凸包内区域和凸包外区域的Lab颜色直方图,对于任意像素点x特征值为Lab,分别找凸包内外直方图相同Lab值对应的各通道bin,计算各通道bin包含像素个数占总像素个数的百分比,三个百分比相乘。即框内外元素在框内和框外直方图占的比例。

④ 由贝叶斯公式计算最终的saliency map

2) 评价:对于简单背景,效果也很好。Saliency map的准确度也很大部分取决于凸包的准确性,稍复杂背景会有很多的角点被检测到,经常会有显著范围过大的情况,即false positive

 

3.Yun Zhai,Mubarak Shah,Visual Attention Detection in Video Sequences Using Spatiotemporal Cues,ACM2006

1) 系统框架:

 

① 时域显著度模型

检测连续视频帧中的兴趣点,用SIFT建立兴趣点之间的对应,根据对应点计算单应性矩阵检测运动平面,RANSAC算法估计多个单应性矩阵来描述不同的运动模块;根据单应性矩阵得到投影点与实际点之间的投影误差计算该像素点的运动对比度,并加入单应性矩阵的跨越区域作为权重调节,避免纹理变化导致显著点分布不均匀的问题。

② 空域显著度模型

计算像素级的saliency map:该像素点颜色与图像中所有其他像素点的color distance map与其他像素点颜色直方图频率的乘积;

计算区域级的saliency map:采用区域增长算法,根据前面计算的显著点对显著区域进行初始化,以其为中心生成种子区域,通过计算区域边缘的能量进行迭代扩张,最终得到一个矩形显著区域。扩展的区域重叠时,采用区域合并技术;

③ 时域空域模型结合

动态结合,运动对比度较大时给时域显著度模型赋予较大权重,否则给空域显著度模型赋予较大权重。

2) 评价:基于视频的显著度检测,考虑帧间运动显著性信息,和图像自身显著性,值得进一步探索。速度较快,效果也比较稳定。

 

4.Xiaohui Shen,Ying Wu,A Unified Approach to Salient Object Detection via Low Rank Matrix Recovery,CVPR2012

1) 基本流程:文章提出了一种新的图像表示方法,将其表示为一个低秩矩阵(非显著区域)加上稀疏噪音(显著区域),再利用Robust PCA技术进行低秩矩阵恢复,得到的噪音就是显著区域,再根据高层次的先验知识来帮助修正显著区域。

2) 图像矩阵:

① 提取特征:RGBhuesaturation3尺度下4个方向共12steerable pyramids响应,3尺度8方向共12Gabor fileters响应,加起来一共53维。

② 矩阵构造:先利用Mean-shift算法将图像分割成很多较小的segments再用每个segment中所有特征向量的均值来表示这个segment,从而构造成为矩阵。

③ 特征空间变换:保证特征向量为低秩。

3) 高层先验融合:位置先验(基于图像中心高斯分布),语义先验(人脸检测),颜色先验(暖色更明显)

4) 评价:对图像的表示比较新颖,但实验效果一般,saliency map不均匀,提取特征多,计算量大,低秩矩阵恢复速度也比较慢

 

6.Ali Borji,Boosting Bottom-up and Top-down Visual Features for Saliency Estimation,CVPR2012

1) 主要贡献:

① 本文的主要出发点是一个贝叶斯公式的推导,在具有特征f的某位置xsalient的概率p是等式的左边,有如下:

此处假设fx相互独立,且先验概率p(s)相同,所以可以得到正相关最右。又有:

 

即与图片中心点的欧式距离相关,所以本文主要研究的是特征点和salient的对应关系。

② 将bottom-uptop-down联合,底层特征有方向,颜色,强度,颜色通道直方图及概率,金字塔模型,现有的底层显著图例如GBVSTorralba模型,AWS模型;高层特征包括水平线检测,人车检测,人脸检测等。底层和高层加起来,每个pixel就对应一个34维的feature

③ 测试了多种分类器对于显著图计算的贡献,采用online learning,先将feature matrix归一化,使其平均数是0,标准差是1,然后建立一个等大小的label map,每个点取值+1/-1,人眼观测的预测结果,top 20%标注+1bottom 40% 标注-1他将数据集分为N组,然后使用leave-one-out的方式进行训练和测试。测试分类器有回归分类器(regression),线性核的SVMAdaBoost非线性分类器。实验表明Adaboost效果最好。

④ 评估指标:AUC值为ROC曲线与x轴之间距离的积分;NSS归一化扫描路径的显着性,描述saliency可以描述fixation的程度;线性相关系数CC表示saliency map和人眼关注map之间的线性关系,计算协方差。

2) 评价:论文内容上新意不大,底层特征与高层知识的结合,倒是提供了不少特征提取参考,以及各种分类器和评估准则的测试;没有进行代码测试,觉得计算量应该很大。

 

7.Federico Perazzi,Philipp Krahenbuhl,Saliency Filters: Contrast Based Filtering for 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较均匀,但公布的代码缺少一些实验细节,没有论文的公布结果好。

2016-01-11 15:20:54 zzb4702 阅读数 3866

1.Saliency detection via background and foreground seed selection, Jianpeng Wang, Huchuan Lu, Neurocomputing
  这篇文章是利用前背景种子对图像的显著性进行提取,而这篇文章值得参考的地方就是文中对前背景种子的定义以及提取方法。算法的大致流程如下图:
  BFS
  从上图可以明确看出,论文先由背景种子生成基于背景的显著图,并从该图中提取出前景区域得到前景种子。接着由前景种子生成一个基于前景的显著图,最终将两图合并在经过平滑处理后就得到最终结果。
(1)背景种子及基于背景的显著图:论文首先是对背景种子进行提取(之所以先提取背景元素是因为在没有先验的情况下我们能正确选中背景超像素的概率更大),论文首先假设图像边界超像素为背景种子集(论文认为目标通常情况下是出现在图像中心的)而对于那些处于边界区域的前景部分,论文使用了一种边缘权重算法去从背景集中排除可能的前景。具体方法是:先利用(Learning to Detect Natural Image Boundaries Using Local Brightness, Color, and Texture Cues)得到图像边界,然后计算每个超像素所包含的边界权重,从而排除前景区域。在得到背景种子集后。利用空间和颜色距离信息计算出基于背景的显著图Sbi:

Sbi=ni,nBGd(ci,cn)(1d(Ii,In)/θ)

这里c表示颜色I表示空间然后在取其平均做为最终结果(公式见论文)。
(2)前景种子及其显著图:在得到基于背景的显著图后,论文利用自适应阈值算法(matlab内置程序)对其进行阈值分割从而得到显著值较大的区域,就是前景区域,这样也就提取出了前景种子集FG。然后,按照下述公式计算出基于前景的显著图Sfi:
Sfi=ni,nFGλd(ci,cn)+αd(Ii,In)

(3)最后将来那个幅显著图融合并进行再定义以后就得到了最终的显著图。部分实验结果如下图:
BFS
论文地址:Saliency detection via background and foreground seed selection

2.Hierarchical Saliency Detection, Qiong Yan, Li Xu, CVPR2013
  这篇论文的贡献在于多尺度图层的运用,这里的多尺度图层与一般的多尺度图像分割不同。所谓图层在我看来是对原图不同尺度的模糊,这样在保留图像基本颜色信息的基础上,通过区域合并排除了一些小区域的干扰,保证区域整体一致性从而达到了目标的完整性。其大致过程如下图:
  HSL
  从上图中可以看出,不同尺度的图层对与原图细节的保留也大不相同,大尺度的图层可以除去背景干扰(如图中的花,是背景但很好可能被误检测为显著目标)。但同样也有其缺点,比如多目标检测(某个目标较小)很可能就将小目标融合到背景区域。但论文中使用多尺度的图层在一定程度上缓解了这个问题。
(1)图层构建:论文中图层的构建其实是一个区域的合并过程。首先,对于每个区域的尺寸,文中将其定义为该区域所能包含最大正方形的边长(像素数)。在得到区域尺寸后,论文设定了一个阈值(上图中3个图层分别为3,17,33),将小于这个阈值的区域与距其最近(在CIELUV颜色空间)的区域合并,并对合并后区域的颜色(平均颜色)尺寸更新。将图层1作(阈值为3)为底层,图层3(阈值为33)作为顶层(关于区域尺寸计算看论文)。
(2)单层显著图:在图层建立起来之后,论文基于每个图层都构建对应的显著图。其构建思路主要包含两个:局部颜色对比,空间位置先验,前者其实相当于程明明RC算法中的区域对比度(即空间加权的颜色对比度),其公式如下:

Ci=j=1nω(Rj)ϕ(i,j)cicj2

这其实就和RC算法很相似ω(Rj) 是区域大小加权,ϕ(i,j) 是空间位置加权,后一项则是颜色对比。而后者则是对目标出现位置的猜想和上一个算法的想法相似(目标更可能出现在图像中心),其公式如下:
Hi=1ω(Rj)xiRiexp(λxixc2)

这其实就是空间中心加权。
(3)显著图融合:在三层显著图计算出来以后,论文先是自底向上更新每个节点(区域)显著值最小能量表达式,在自顶向下更新显著值。其中在自底向上过程中采用能量函数极小化求解新的显著值的表达式(新值作为变量),在自顶向下中通过优化已有的能量表达式更新显著值。部分结果:
HS
论文地址:Hierarchical Saliency Detection
3.Saliency Detection via Absorbing Markov Chain, Bowen Jiang1, Lihe Zhang1, Huchuan Lu,ICCV2013
  这篇文章的思路以及原理都非常值得借鉴,是一篇非常不错的检测算法。文章主要是运用连通表以及马尔科夫链的原理,将图像的每个超像素节点映射为markov链的状态,通过状态之间的转移来确定超像素到背景的转移时间,若时间越长这该超像素越显著。在实现时,该马尔科夫链的状态转移矩阵是通过计算两两超像素间的权重得到的,权重越大表明两者间的转移概率越大,时间越短。论文中的吸收态是指到达该状态不再转移到其他状态,即转移的终点论文中指的是背景超像素。
(1)关联矩阵构建:论文中是通过构建关联矩阵求解转移矩阵P,即P=D1A,实际上就是对A 进行归一化处理,但在代码中归一化时在A 的基础上另外加上了超像素到背景集的权重以用来突出背景超像素(个人认为)。对于关联矩阵的构建文中使用了两个因素:空间邻近和颜色相似,对于空间邻近论文通过构建以超像素节点双层无向图(图论)G(V,E),将空间邻近局限在一定范围;对于后者就是一个颜色对比ωij=ed(ci,cj)θ,然后,在巧妙地利用下面的融合公式,将问题转化为求局部的颜色对比(即认为图像中处于某一局部区域是目标,即某一局部区域的颜色越相近则该区域越可能是目标):
aij=ωij10Eij0i=jotherwise

(2)显著图生成:这样就得到关联矩阵A ,相应的状态转移矩阵P 就可求得。通过P得到基础矩阵N 后每个瞬态(所有超像素)到吸收态(背景超像素)的转移时间便可计算得到,此时间就是显著值的衡量。
y=N×c=(IQ)1×c

这里c是单位列向量。
(3)对于上述显著图,论文还对其中一些较差的结果进行了改进,其具体过程见论文。实验结果:
这里写图片描述
该算法检测检测效果不错,而且时间较快,性能非常不错。
论文地址:Saliency Detection via Absorbing Markov Chain
类似论文:Saliency Region Detection Based on Markov Absorption Probabilities(这篇论文最后的导向滤波挺好用的)。

2018-03-14 10:44:02 qq_36130482 阅读数 1393

SalBenchmark使用笔记

项目地址下载项目
项目结构如图这里写图片描述
其中Data里存放数据集,code里是opencv和MATLAB代码,result是跑完工程之后的结果。

1. 改动MATLAB

进入 ./Code/matlab/运行RunAll.m

clear; close all; clc;
RootDir = 'C:/Users/ThinkCentre/Desktop/saliency/evaluate/SalBenchmark-master/Data/';
%SubNames = {'DataSet1/' , 'DataSet2/'};
SubNames = {'DataSet3/'};
%MethodNames = {'CA', 'COV', 'DSR', 'FES', 'GR', 'ICVS', 'MC', 'PCA', 'RBD', 'SEG', 'SeR', 'SIM', 'SR', 'SUN', 'SWD'};
% You can chose these methods to produce SaliencyMap as follow.
MethodNames = {'CA', 'COV', 'DSR', 'FES', 'GR', 'ICVS', 'MC', 'PCA'};

%MethodNames = {'COV','SWD'};

RunDatasets(SubNames, MethodNames, RootDir);

MethodNames里存放方法的名字,MATLAB的算法存放在对应算法名称XXX的文件夹,接口文件命名为GetXXX.m,接口函数写法如下:

function [ saliencyMap ] = GetXXX(fileName)

end

增加自己算法需要改动两点

  • RunAll.m文件里在MethodNames 添加自己算法的名称’XXX’
  • GetSal.m文件里66行添加
  • case 'XXX'
    sMap = GetXXX(fileName);

    接下来就可运行自己代码了,需要注意的一点:迭代自己算法时需要删除对应算法的结果,结果存放在/Data/DataSet1/Saliency/中。否则可能会出现算法结果不更新的情况。

    最后如果自己需要跑自己下载的数据集的话,仿照DataSet1和DataSet2的结构建立自己的DataSet3,DataSet4等等,然后在RunAll.m修改SubNames 即可
    这里写图片描述

2. 改动opencv代码

打开./Code/Demo.sln,编译整个项目,可能会出现关于opencv的一些错误,这时候需要在报错的文件里加上opencv的头文件opencv2/opencv.hpp即可。
在运行过程中可能会出现跑代码跑一半挂掉的情况,这时候删掉Demo.cpp文件里第18行里删掉程序挂掉的那一步对应的算法。
需要跑自己的数据集的话再修改const char* _dbNames[] = { "DataSet1","DataSet2"};即可

3. 改动Results文件夹

运行完opencv的代码之后会在SalBenchmark-master文件夹下生产Results文件夹,运行对应的数据集生成的DataSetXPrRocAuc文件,之后可能会报错说xTickLabels未定义,注释掉对应报错行的代码对应的if(....) end,即可出现所有的评价结果图。

2019-03-04 20:02:00 weixin_30215465 阅读数 2

   图像显著性检测-Saliency Detection via Graph-Based Manifold Ranking

         显著性检测是很多计算机处理的预处理,有限的计算机资源来处理数以亿计的图片,不仅耗资巨大,而且往往时间复杂度高。

        那么如果说将这些资源集中在图片的显著性区域,就往往可以取得更好的成果,最直接的就是可以摒弃掉一些背景信息,使得“重要部分”能够凸显出来。目前关于图像显著性检测的论文有好多种类。

        其中本人正在研究的一篇是《Saliency Detection via Graph-Based Manifold Ranking》,是2013年发表在IEEE上面的一篇文章,这篇文章很经典,被引用的次数也非常多,是经典的“自下而上”方法,值得我们大家反复研读和思考,这篇paper提到了一种核心算法“流形排序”,这种算法可以算是“page rank”也就是佩奇算法的延展,效果不错。下面来简单介绍一下这篇paper。

        这篇文章的出发点,是有关于前景也就是目标有着很强的内相关性,放在关联矩阵中能够明显看出来和背景不一样。如下图所示蓝、红、绿色分别代表对象-内部,背景-内部,背景-目标,最高的蓝色表示对象内部之间有着很强的关联性,根据这个特点就可以在图像内部将图像前景和背景分离开。

    

           其中最重要的也是最核心的算法就是“流形排序”。下面具体讲一下算法过程:

 

 

          首先将图片利用SLIC方法分割成数量相对固定的超像素集合,将每个超像素看成一个节点,再设某些点为查询点,将超像素节点作为图G中的节点E,构造k-正则图,根据其他节点和查询点之间的关联进行排序,根据排名结果重新赋予超像素灰度值,形成显著图。

 

          以上边界为例子解释一下算法:首先以上边界为种子节点(queries),然后每个节点都与其周围两圈节点相连,也就是说“每个节点不仅与它相邻节点相连,而且与相邻节点相连”,再将四周节点两两之间相连接,如上图所示,以上边界所有节点为种子点,其他的为未标记节点,由于连线太多影响观看,因此仅仅展示部分连接,实际上是每个节点都按照上述规则进行连接。连接之后根据超像素在Lab色彩空间的平均值来赋予边的权重。其中ci与cj是控制节点在CIE Lab色彩空间节点的平均值。

       

           再通过优化下列问题来选取最佳排名。其中y是指示向量  [y1,y2,y3,...yn],如果每一个yi对应一个节点,如果该节点为种子点,则yi为1,否则为0。dii 与 djj 是度矩阵中的的项,D=diag{d11,d22,d33,...,dnn},其中dii为从 j=1到n, wij的和。fi与fj为第i,j个节点与其他所有节点的相关性和。

    其模型化简之后得到核心模型。阿尔法 为一常数,在代码中设置为0.99。W是关联矩阵,wij是 i节点和 j节点的边的权重。

   

          得到的 f* 是一个N维向量,每一个元素为一个节点个背景种子点的相关性,归一化该向量 [0,1] ,节点的显著性为:

      

          其中i表示索引图中的超像素节点, f*(i)表示归一化向量。

         类似地,我们使用底部,左侧和右侧图像边界作为种子点来计算其他三个边界Sb,S1和Sr的显著性映射。我们注意到,显著图是用不同的指标向量y计算的,而权重矩阵和度矩阵D是固定的。也就是说,我们需要为每个图像计算一次矩阵的逆(D-αW)。由于超像素的数量很小,因此矩阵在方程3中的逆矩阵可以有效地计算。因此,四个映射的总计算负荷很低。通过以下过程整合四个显著性图:

        由此可以得到第一阶段的显著图。在第二阶段,要根据第一阶段产生的显著图得到的前景超像素节点,作为前景种子点,继续进行流形排序,再将两幅显著图结合,得到最终的显著图。使用SC方法生成显著性图有两个原因。首先,不同侧面的超像素通常不相似,应该具有较大的距离。如果我们同时使用所有边界超像素作为种子点(即,指示这些超级像素是相似的),则标记结果通常不太理想,因为这些节点不可压缩(如图4)。其次,它减少了不精确种子点的影响,即参考真实的突出节点被无意中选择作为后台种子点。如图5的第二列所示,使用所有边界节点生成的显著性图很差。由于标记结果不精确,具有显著对象的像素具有低显著性值。通过整合四个显著性图,可以识别对象的一些显著部分(尽管整个对象未被均匀地突出显示),这为第二阶段检测过程提供了足够的提示。

      

          虽然显著对象的大部分区域在第一阶段突出显示,但某些背景节点可能无法被充分抑制(参见图4和图5)。为了缓解这个问题并改善结果,特别是当对象出现在图像边界附近时,通过使用前景种子点进行排名来进一步改进显著性图。

clear all;close all;clc;
addpath('./function/');
%%------------------------设置参数---------------------%%
theta = 0.1;                            % 控制边缘的权重
alpha = 0.99;                          % 控制流行排序成本函数两个项的平衡
spnumber = 200;                    % 超像素的数量
imgRoot = './test/';                 % 测试图像的路径
saldir = './saliencymap/';         % 显著性图像的输出路径
supdir = './superpixels/';         % 超像素标签的文件路径
mkdir(supdir);
mkdir(saldir);
imnames = dir([imgRoot '*' 'jpg']);
 
disp(imnames);
imname = [imgRoot imnames.name];
[input_im,w] = removeframe(imname);            %预处理去掉边框
[m,n,k] = size(input_im);
 
%%----------------------生成超像素--------------------%%
  imname = [imname(1:end-4) '.bmp'];       %SLIC软件仅支持bmp格式的图片
  comm = ['SLICSuperpixelSegmentation' ' ' imname ' ' int2str(20) ' ' int2str(spnumber) ' ' supdir];  %<filename> <spatial_proximity_weight> <number_of_superpixels> <path_to_save_results>
  system(comm);   
  spname = [supdir imnames.name(1:end-4)  '.dat'];
   
  %超像素标签矩阵
  fid = fopen(spname,'r');
  A = fread(fid, m * n, 'uint32');     %fread(fid, N, 'str')  N代表读入元素个数, 'str'是格式类型
  A = A+1;     %把A变成正整数或逻辑值
  B = reshape(A,[n, m]);
  superpixels = B';
  fclose(fid);
  spnum = max(superpixels(:));  %实际的超像素数目 
   
 %%----------------------设计图形模型--------------------------%%
 %计算特征值 (mean color in lab color space)
 %对于每个超像素
    input_vals = reshape(input_im, m*n, k);
    rgb_vals = zeros(spnum,1,3);
    inds = cell(spnum,1);
    for i = 1:spnum
        inds{i} = find(superpixels==i);
        rgb_vals(i,1,:) = mean(input_vals(inds{i},:),1);
    end 
  lab_vals = colorspace('Lab<-', rgb_vals);            %rgbzhuan转换成lab空间
  seg_vals = reshape(lab_vals,spnum,3);                 % 每个超像素点的特征
   
 % 求得边界
 %求邻接矩阵
  adjloop = zeros(spnum,spnum);
  [m1 n1] = size(superpixels);
 for i = 1:m1-1
    for j = 1:n1-1
        if(superpixels(i,j)~=superpixels(i,j+1))
            adjloop(superpixels(i,j),superpixels(i,j+1)) = 1;
            adjloop(superpixels(i,j+1),superpixels(i,j)) = 1;
        end;
        if(superpixels(i,j)~=superpixels(i+1,j))
            adjloop(superpixels(i,j),superpixels(i+1,j)) = 1;
            adjloop(superpixels(i+1,j),superpixels(i,j)) = 1;
        end;
        if(superpixels(i,j)~=superpixels(i+1,j+1))
            adjloop(superpixels(i,j),superpixels(i+1,j+1)) = 1;
            adjloop(superpixels(i+1,j+1),superpixels(i,j)) = 1;
        end;
        if(superpixels(i+1,j)~=superpixels(i,j+1))
            adjloop(superpixels(i+1,j),superpixels(i,j+1)) = 1;
            adjloop(superpixels(i,j+1),superpixels(i+1,j)) = 1;
        end;
    end;
end;   
bd = unique([superpixels(1,:),superpixels(m,:),superpixels(:,1)',superpixels(:,n)']);
for i = 1:length(bd)
    for j = i+1:length(bd)
        adjloop(bd(i),bd(j)) = 1;
        adjloop(bd(j),bd(i)) = 1;
    end
end
    
    edges = [];
   for i = 1:spnum
        indext = [];
        ind = find(adjloop(i,:)==1);
        for j = 1:length(ind)
            indj = find(adjloop(ind(j),:)==1);
            indext = [indext,indj];
        end
        indext = [indext,ind];
        indext = indext((indext>i));
        indext = unique(indext);
        if(~isempty(indext))
            ed = ones(length(indext),2);
            ed(:,2) = i*ed(:,2);
            ed(:,1) = indext;
            edges = [edges;ed];
        end
   end
  
  % 计算关联矩阵
   valDistances = sqrt(sum((seg_vals(edges(:,1),:)-seg_vals(edges(:,2),:)).^2,2));
   valDistances = normalize(valDistances); %Normalize to [0,1]
   weights = exp(-valDistances/theta);
   W=sparse([edges(:,1);edges(:,2)],[edges(:,2);edges(:,1)], ...
       [weights;weights],spnum,spnum);  
   
 
   % 最优化关联矩阵 (公式3)
   dd = sum(W); D = sparse(1:spnum,1:spnum,dd); clear dd;      %S = sparse(i,j,s,m,n,nzmax)由向量i,j,s生成一个m*n的含有nzmax个非零元素的稀疏矩阵S;即矩阵A中任何0元素被去除,非零元素及其下标组成矩阵S
   optAff = eye(spnum)/(D-alpha*W);
   mz = diag(ones(spnum,1));
   mz = ~mz;     %将A的对角元素设置为0
   optAff = optAff.*mz;
   
   %%-----------------------------显著性检测第一阶段--------------------------%%
  % 为每个超像素计算显著性值
  % 作为种子点的上边界
    Yt = zeros(spnum,1);
    bst = unique(superpixels(1,1:n));
    Yt(bst) = 1;
    bsalt = optAff*Yt;
    bsalt = (bsalt-min(bsalt(:)))/(max(bsalt(:))-min(bsalt(:)));       %正规化数据
    bsalt = 1-bsalt;                  %补码为显著性度量
   
  % down
    Yd = zeros(spnum,1);
    bsd = unique(superpixels(m,1:n));
    Yd(bsd) = 1;
    bsald = optAff*Yd;       %f*(i) 此向量中的每个元素表示节点与背景种子点的相关性
    bsald = (bsald-min(bsald(:)))/(max(bsald(:))-min(bsald(:))); 
    bsald = 1-bsald; 
    
% right
    Yr = zeros(spnum,1);
    bsr = unique(superpixels(1:m,1));
    Yr(bsr) = 1;
    bsalr = optAff*Yr;
    bsalr = (bsalr-min(bsalr(:)))/(max(bsalr(:))-min(bsalr(:)));
    bsalr = 1-bsalr;
   
% left
    Yl = zeros(spnum,1);
    bsl = unique(superpixels(1:m,n));
    Yl(bsl) = 1;
    bsall = optAff*Yl;
    bsall = (bsall-min(bsall(:)))/(max(bsall(:))-min(bsall(:)));
    bsall = 1-bsall;  
    
% combine
    bsalc = (bsalt.*bsald.*bsall.*bsalr);
    bsalc = (bsalc-min(bsalc(:)))/(max(bsalc(:))-min(bsalc(:)));
   
% 为每个像素分配显著性值
  tmapstage1 = zeros(m,n);
  for i = 1:spnum
      tmapstage1(inds{i}) = bsalc(i);
  end
  tmapstage1 = (tmapstage1-min(tmapstage1(:)))/(max(tmapstage1(:))-min(tmapstage1(:)));
   mapstage1 = zeros(w(1),w(2));
   mapstage1(w(3):w(4),w(5):w(6)) = tmapstage1;
   mapstage1 = uint8(mapstage1*255); 
    
  outname = [saldir imnames.name(1:end-4)  '_stage1' '.png'];
  imwrite(mapstage1,outname);
   
  %%----------------------显著性检测第二阶段-------------------------%%
  % 自适应阈值二值化
  th = mean(bsalc);                    %阈值被设置为整个显著图上的平均显著性
  bsalc(bsalc<th)=0;
  bsalc(bsalc>=th)=1;
   
  % 为每个超像素计算显著性值
  fsal = optAff*bsalc;
   
  % 为每个像素分配显著性值
    tmapstage2 = zeros(m,n);
    for i = 1:spnum
        tmapstage2(inds{i}) = fsal(i);  
    end
    tmapstage2 = (tmapstage2-min(tmapstage2(:)))/(max(tmapstage2(:))-min(tmapstage2(:)));
     
    mapstage2 = zeros(w(1),w(2));
    mapstage2(w(3):w(4),w(5):w(6)) = tmapstage2;
    mapstage2 = uint8(mapstage2*255);
    outname = [saldir imnames.name(1:end-4)  '_stage2' '.png'];  
    imwrite(mapstage2,outname);

 

 

 

 

 

 

 

 

 

 

      

 

 

 

 

 

转载于:https://www.cnblogs.com/lf-cs/p/salicency_detecting.html

视觉显著性检测

阅读数 29631

显著性检测

阅读数 614

没有更多推荐了,返回首页