Saliency Detection: A Spectral Residual Approach

clear
clc

%% Read image from file 
inImg = im2double(rgb2gray(imread('yourImage.jpg')));
inImg = imresize(inImg, 64/size(inImg, 2));

%% Spectral Residual
myFFT = fft2(inImg); 
myLogAmplitude = log(abs(myFFT));
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)));
imshow(saliencyMap);

上面是频谱残差检测方法的实现源代码,方法实现依赖的焦点是mySpectralResidual保留的是什么信息;第二个是myPhase中包含的是什么信息。

傅里叶变换中,将信息按照高低频的形式进行统计分布,低频信息主要保存在频谱中,而高频信息则主要保存在相位中。也就是说频谱残差实际保留下来的是少部分的低频信息。而经过log处理之后,原先差异较大的低频信息被映射到很小的一个区间。因此使得频谱残差接近于0,从而恢复出来的基本上是高频信息。

在复旦大学的一篇论文中就有提到,如果直接将频谱残差置为0也可以得到和相类似的结果。当然,除了这一篇论文有论述到这一点之外,实际在作者的另一篇文章Image Signature中也有相类似的处理,文章得到显著性图的终点在于:idct2(sign(dct2(tImg(:,:,i))))。相较于频谱残差方法,显著性图的恢复只是用了正弦谱的符号。

你可能感兴趣的:(fft,Saliency)