CImg - 光谱法的显着性

时间:2016-01-28 11:01:44

标签: c++ image-processing cimg

我正在尝试使用CImg实现光谱方法以获得图像的显着性,但是我无法到达那里。 这似乎是这个问题的转贴(spectral residual saliency detection in C++ with CImg),但我认为我从这个问题(atan2和FFT参数)中得到了两个错误。

这是我的代码:

int main(int argc, char * argv[]) {

    const char * input_file = "img/pic.png";

    CImg<float> input = CImg<float>(input_file);
    const CImg<float> mask(3,3,1,1,1.0f/9.0f);

    resize_fft(input); // Resize for fft
    CImg<float> gray = any2gray(input); // to single channel grayscale

    CImgList<float> fft = gray.get_FFT();

    CImg<float> amp = (fft[0].get_pow(2) + fft[1].get_pow(2)).get_sqrt();
    CImg<float> amp_log = (amp + 1.0f).get_log().get_normalize(0, 255);

    CImg<float> phase = fft[1].get_atan2(fft[0]);
    CImg<float> residual = amp_log - amp_log.get_convolve(mask);
    CImg<float> real = residual.get_exp();
    CImg<float>::FFT(real, phase, true);

    real.save("img/001.png");
    real.normalize(0, 255).save("img/002.png");

    return 1;
}

保存图片001和002最终都是类似噪声的图片,就像仍在频率空间中一样。 我不知道我在做什么有什么问题,如果你们可以帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:0)

首先,很明显你忘了用高斯滤波器来平滑real

其次,行CImg<float>::FFT(real, phase, true);是可疑的。我不了解CImg图书馆,但我能理解你在表达什么。当你inverse fft时,我认为真实部分和想象部分都是错误的。文中的公式有点误导,阅读the matlab code更清晰 如果您熟悉复数,您会发现此处不需要变量phase 替换该行的伪代码在这里:

fft[0] = fft[0] ./ amp .* residual;
fft[1] = fft[1] ./ amp .* residual;
//Inverse Fourier Transform
CImg<float>::FFT(fft[0], fft[1], true);
real = fft[0].get_pow(2) + fft[1].get_pow(2);
real.get_convolve(Gaussian filter with sigma = 8)

所有带左点的运算符都意味着按元素运算。