2016-01-28 47 views
0

我試圖實現光譜方法以獲得CImg圖像的顯着性,但是我無法到達那裏。 這可能看起來像是從這個問題(spectral residual saliency detection in C++ with CImg)轉發,但我想我解決了這個問題的兩個錯誤(atan2和FFT參數)。CImg - 使用光譜方法的顯着性

這裏是我的代碼:

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

首先,很明顯,你忘記使高斯濾波器平滑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) 

所有左點運算符意味着元素方面的操作。