1. 程式人生 > >影象顯著性檢測——時域分析(譜殘差法、相位譜法)

影象顯著性檢測——時域分析(譜殘差法、相位譜法)

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.
延邊大學智慧資訊處理研究室 方誌明 劉星辰