Saliency_Detection_A_Spectral_Residual_Approach.pdf
:::info
首先介绍一下作者:侯晓迪,2003年进入上海交大,大三于CVPR发表本论文,影响因子已经3700+
他的大学经历可以参看这个知乎回答,虽然匿名,但这样的大神太容易被认出来了。
:::
简要介绍
该方法的思想很简单,就是基于频谱残差的方法,找到图像中的显著点。
Spectral Residual Model
从信息论文的角度来看, effective coding 应该能将图像信息 H(Image)
分成两个部分:H(Image)
= H(Innovation)
+H(Prior Knowledge)
H(Prior Knowledge)
是先验信息,这部分对应着自然环境中图像的某种统计不变性。H(Innovation)
就是图像中的新信息,也就是我们需要的显著性信息。
Log spectrum representation
在图像的不变统计量中,尺度不变性是最重要也是最广泛应用的一种,该性质导出了 1/f 法则
:
其中 是自然图像中傅里叶光谱频率
对应的振幅,从平均意义上来说,振幅与频率成反比。
简单来说,一张图像中,一般低频信息较多,而高频信息较少,可以从下面的傅里叶变换图就可以看出来。
无论是自然图像,还是人造物的图像,一般都近似服从这个分布
log-log spectrum 理论已经非常成熟,但在单个图片上并不好用:
- 在单个图像中很难找到尺度不变性(没看懂)
- 采样点分布不均:在低频稀疏,在高频密集,并容易受到噪声干扰
因此作者使用log spectrum代替log-log spectrum,把坐标的横轴由 Log frequency 变成了 Frequency,而纵轴则一直沿用 Log Intensity.
:::info
在横轴去掉一个log,等价于在纵轴加上一个log,因此确实可以使曲线更平滑。
当然这也带来一个问题,因为从理论上来说, log-log spectrum是线性关系,而 log spectrum 则是变成了对数关系。
:::
然后作者发现在不同的图像中,log spectrum图的曲线是相似的,并且随着图片的增多,取平均后会变得非常平滑,这暗示着 averaged log spectrum 中存在着局部线性性质。
从谱残差到显著图
很明显,使得曲线不平滑的点就是异常点,也就是携带着额外信息的点。
我们用 来表示输入图像的 log spectrum,用
表示 averaged log spectrum 曲线。
那么我们所求的显著性信息就为:
我们用 来代表图像的 spectral residual.
由于 log spectrum 图具有局部线性性质,代表着可以用局部均值滤波 来近似
,其中 n 代表卷积核的大小,这里取 n=3,实验证明 n 的变化对结果的影响很小。
那么 可以通过对输入图像做卷积来近似:
就是简单的均值滤波:
那么谱残差 很容易就能算出来:
举例
用一张图像的例子来做说明:
实验证明卷积核的大小对结果并不影响
总结
对于输入图像 ,要找出图片的显著点,只需进行以下五步操作:
思考
作者是在 log spectrum 上减去了一个均值滤波,这个操作有点像unsharp-masking,区别在于unsharp-masking是在原图减去一个模糊滤波,而这个是在谱图上做,感觉两者之间存在着某种等价关系。
我认为把 log-log spectrum 改成 log spectrum 的意义不大,反而把全局线性性质变成了局部线性性质。
最大的问题,把一张图片傅里叶变换之后得到 Magnitude 和 Phase,其中 Phase 的重要性远远大于 Magnitude,甚至仅**需 Phase 信息就能得到和作者实验一样的结果,也就是为什么卷积核的尺寸大小不敏感的原因,作者在 log spectrum 上减去均值滤波的意义仅仅是削弱了Magnitude 信息**。
将两张图的Magnitude 和 Phase混合得到的结果,说明Phase 更重要
程序测试
clear
clc
%% Read image from file
inImg = im2double(rgb2gray(imread('2.jpg')));
inImg = imresize(inImg, 256/size(inImg, 1));
figure
imshow(inImg);
%% Spectral Residual
myFFT = fft2(inImg);
myLogAmplitude = log(abs(myFFT));
myPhase = angle(myFFT);
mySmooth = imfilter(myLogAmplitude, fspecial('average', 3), 'replicate');
mySpectralResidual = myLogAmplitude - mySmooth;
saliencyMap = abs(ifft2(exp(mySpectralResidual + i*myPhase))).^2;
%%
% figure
% A=abs(fftshift(myLogAmplitude));
% plot(A(size(A,1)/2,size(A,2)/2:size(A,2)));
%
% B=abs(fftshift(mySpectralResidual));
% figure
% plot(B(size(B,1)/2,size(B,2)/2:size(B,2)));
%
% C=abs(fftshift(mySmooth));
% figure
% plot(C(size(C,1)/2,size(C,2)/2:size(C,2)));
%
% figure
% imagesc(A);
% figure
% imagesc(myPhase);
% figure
% imagesc(B);
%% After Effect
figure
% saliencyMap = mat2gray(imfilter(saliencyMap, fspecial('gaussian', [10, 10], 2.5)));
saliencyMap = imfilter(saliencyMap, fspecial('disk', 3));
saliencyMap = mat2gray(saliencyMap);
imshow(saliencyMap);
figure
saliencyMap2 = abs(ifft2(exp(i*myPhase))).^2;
saliencyMap2 = mat2gray(imfilter(saliencyMap2, fspecial('disk', 3)));
imshow(saliencyMap);
图1是原图,图2是论文方法得到的显著图,图3是仅用Phase信息恢复的图,说明作者在Magnitude 上做的一系列操作都没啥意义。
具体可以参考下这篇论文