Saliency_Detection_A_Spectral_Residual_Approach.pdf

:::info 首先介绍一下作者:侯晓迪,2003年进入上海交大,大三于CVPR发表本论文,影响因子已经3700+
image.png
他的大学经历可以参看这个知乎回答,虽然匿名,但这样的大神太容易被认出来了。 :::

简要介绍

该方法的思想很简单,就是基于频谱残差的方法,找到图像中的显著点。

Spectral Residual Model

从信息论文的角度来看, effective coding 应该能将图像信息 H(Image) 分成两个部分:
H(Image)= H(Innovation)+H(Prior Knowledge)
H(Prior Knowledge) 是先验信息,这部分对应着自然环境中图像的某种统计不变性。
H(Innovation) 就是图像中的新信息,也就是我们需要的显著性信息。

Log spectrum representation

在图像的不变统计量中,尺度不变性是最重要也是最广泛应用的一种,该性质导出了 1/f 法则
Saliency Detection: A Spectral Residual Approach - 图2
其中 Saliency Detection: A Spectral Residual Approach - 图3 是自然图像中傅里叶光谱频率Saliency Detection: A Spectral Residual Approach - 图4 对应的振幅,从平均意义上来说,振幅与频率成反比。
简单来说,一张图像中,一般低频信息较多,而高频信息较少,可以从下面的傅里叶变换图就可以看出来。

Saliency Detection: A Spectral Residual Approach - 图5

无论是自然图像,还是人造物的图像,一般都近似服从这个分布
image.png
log-log spectrum 理论已经非常成熟,但在单个图片上并不好用:

  1. 在单个图像中很难找到尺度不变性(没看懂)
  2. 采样点分布不均:在低频稀疏,在高频密集,并容易受到噪声干扰

image.png
因此作者使用log spectrum代替log-log spectrum,把坐标的横轴由 Log frequency 变成了 Frequency,而纵轴则一直沿用 Log Intensity. :::info 在横轴去掉一个log,等价于在纵轴加上一个log,因此确实可以使曲线更平滑。
当然这也带来一个问题,因为从理论上来说, log-log spectrum是线性关系,而 log spectrum 则是变成了对数关系。 ::: image.png
然后作者发现在不同的图像中,log spectrum图的曲线是相似的,并且随着图片的增多,取平均后会变得非常平滑,这暗示着 averaged log spectrum 中存在着局部线性性质
image.png

从谱残差到显著图

很明显,使得曲线不平滑的点就是异常点,也就是携带着额外信息的点。
我们用 Saliency Detection: A Spectral Residual Approach - 图10 来表示输入图像的 log spectrum,用 Saliency Detection: A Spectral Residual Approach - 图11 表示 averaged log spectrum 曲线。
那么我们所求的显著性信息就为:
Saliency Detection: A Spectral Residual Approach - 图12
我们用 Saliency Detection: A Spectral Residual Approach - 图13 来代表图像的 spectral residual.
由于 log spectrum 图具有局部线性性质,代表着可以用局部均值滤波 Saliency Detection: A Spectral Residual Approach - 图14 来近似 Saliency Detection: A Spectral Residual Approach - 图15,其中 n 代表卷积核的大小,这里取 n=3,实验证明 n 的变化对结果的影响很小。

那么 Saliency Detection: A Spectral Residual Approach - 图16 可以通过对输入图像做卷积来近似:
Saliency Detection: A Spectral Residual Approach - 图17
Saliency Detection: A Spectral Residual Approach - 图18 就是简单的均值滤波:
Saliency Detection: A Spectral Residual Approach - 图19
那么谱残差 Saliency Detection: A Spectral Residual Approach - 图20 很容易就能算出来:
Saliency Detection: A Spectral Residual Approach - 图21

举例

用一张图像的例子来做说明:
image.png
image.png
实验证明卷积核的大小对结果并不影响

总结

对于输入图像 Saliency Detection: A Spectral Residual Approach - 图24,要找出图片的显著点,只需进行以下五步操作:
Saliency Detection: A Spectral Residual Approach - 图25

思考

  • 作者是在 log spectrum 上减去了一个均值滤波,这个操作有点像unsharp-masking,区别在于unsharp-masking是在原图减去一个模糊滤波,而这个是在谱图上做,感觉两者之间存在着某种等价关系。

  • 我认为把 log-log spectrum 改成 log spectrum 的意义不大,反而把全局线性性质变成了局部线性性质。

  • 最大的问题,把一张图片傅里叶变换之后得到 Magnitude 和 Phase,其中 Phase 的重要性远远大于 Magnitude,甚至仅** Phase 信息得到和作者实验一样的结果,也就是为什么卷积核的尺寸大小不敏感的原因,作者在 log spectrum 上减去均值滤波的意义仅仅是削弱了Magnitude 信息**。

image.png
将两张图的Magnitude 和 Phase混合得到的结果,说明Phase 更重要

程序测试

  1. clear
  2. clc
  3. %% Read image from file
  4. inImg = im2double(rgb2gray(imread('2.jpg')));
  5. inImg = imresize(inImg, 256/size(inImg, 1));
  6. figure
  7. imshow(inImg);
  8. %% Spectral Residual
  9. myFFT = fft2(inImg);
  10. myLogAmplitude = log(abs(myFFT));
  11. myPhase = angle(myFFT);
  12. mySmooth = imfilter(myLogAmplitude, fspecial('average', 3), 'replicate');
  13. mySpectralResidual = myLogAmplitude - mySmooth;
  14. saliencyMap = abs(ifft2(exp(mySpectralResidual + i*myPhase))).^2;
  15. %%
  16. % figure
  17. % A=abs(fftshift(myLogAmplitude));
  18. % plot(A(size(A,1)/2,size(A,2)/2:size(A,2)));
  19. %
  20. % B=abs(fftshift(mySpectralResidual));
  21. % figure
  22. % plot(B(size(B,1)/2,size(B,2)/2:size(B,2)));
  23. %
  24. % C=abs(fftshift(mySmooth));
  25. % figure
  26. % plot(C(size(C,1)/2,size(C,2)/2:size(C,2)));
  27. %
  28. % figure
  29. % imagesc(A);
  30. % figure
  31. % imagesc(myPhase);
  32. % figure
  33. % imagesc(B);
  34. %% After Effect
  35. figure
  36. % saliencyMap = mat2gray(imfilter(saliencyMap, fspecial('gaussian', [10, 10], 2.5)));
  37. saliencyMap = imfilter(saliencyMap, fspecial('disk', 3));
  38. saliencyMap = mat2gray(saliencyMap);
  39. imshow(saliencyMap);
  40. figure
  41. saliencyMap2 = abs(ifft2(exp(i*myPhase))).^2;
  42. saliencyMap2 = mat2gray(imfilter(saliencyMap2, fspecial('disk', 3)));
  43. imshow(saliencyMap);

image.png
图1是原图,图2是论文方法得到的显著图,图3是仅用Phase信息恢复的图,说明作者在Magnitude 上做的一系列操作都没啥意义。

具体可以参考下这篇论文

参考链接