图像显著性检测——时域分析(谱残差法、相位谱法)


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

(Saliency Detection: A Spectral Residual Approach)

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

图像显著性检测——时域分析(谱残差法、相位谱法)_第1张图片

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

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


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

图像显著性检测——时域分析(谱残差法、相位谱法)_第2张图片

因此谱残差就是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 
#include 
#include 

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_(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(i);
		for (int j = 0; j(i);
		pim = Im.ptr(i);
		pm = mag.ptr(i);
		pp = pha.ptr(i);
		for (int j = 0; j(Re), Mat_(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(i);
		for (int j = 0; j



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(黄)分别定义为:
图像显著性检测——时域分析(谱残差法、相位谱法)_第3张图片
F(t)的亮度特征I(t)和运动特征M(t)定义如下:


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

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

其中


可将q(t)写为如下形式:
图像显著性检测——时域分析(谱残差法、相位谱法)_第4张图片
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种方法均没有明确的检测出感兴趣区域说明上述三种方法仍需要改进。
图像显著性检测——时域分析(谱残差法、相位谱法)_第5张图片
第1-6幅图像的实验结果
图像显著性检测——时域分析(谱残差法、相位谱法)_第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.
延边大学智能信息处理研究室
方志明
刘星辰

你可能感兴趣的:(显著性检测)