我正在尝试使用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最终都是类似噪声的图片,就像仍在频率空间中一样。 我不知道我在做什么有什么问题,如果你们可以帮助我吗?
感谢。
答案 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)
所有带左点的运算符都意味着按元素运算。