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))))。相较于频谱残差方法,显著性图的恢复只是用了正弦谱的符号。