Prawidłowe użycie fft2 i fftshift dla kształtu z cieniowania

Próbuję odtworzyć klasyczny kształt z algorytmu cieniowania widoczny w tekście Trucco / Verri „Techniki wprowadzające dla 3d Computer Vision”, ale trudno mi zrozumieć funkcję fft w matlab. Zasadniczo muszę użyć ograniczenia integralności, aby uzyskać głębokość (Z) obrazu. Nie jestem pewien, kiedy użyć fftshift w tym scenariuszu. Oto kod, który mam do tej pory. Oparte nahttp://www.mathworks.com/matlabcentral/newsreader/view_thread/285244 Zasadniczo zapakowałem wszystkie moje FFT2 w przesunięcia fftshift, ale nie sądzę, aby było to poprawne użycie. Czy ktoś mógłby mi wyjaśnić użycie i co robię źle? Dziękuję Ci. Zasadniczo próbuję pobrać moje p i q (wartości będące aktualizacjami opartymi na intensywności pikseli) przekształcając je w domenę Fouriera, aby użyć ich w równaniu C. Następnie chcę przekształcić równanie C z powrotem w domena czasu, ponieważ daje mi to Z głębokości. Chcę także zaktualizować P i Q w oparciu o C w domenie Fouriera.

    wx = (2.* pi .* x) ./ m; 
    wy = (2.* pi .* y) ./ n; 
    wx = ifftshift(wx); wy=ifftshift(wy);

    Cp = fftshift(fft2(fftshift(p))); 
    Cq = fftshift(fft2(fftshift(q)));
    C = -1i.*(wx .* Cp + wy .* Cq)./(wx.^2 + wy.^2); 
    Z = abs((ifft2(ifftshift(C)))); 
    p = ifftshift(ifft2(ifftshift(1i * wx .* C))); 
    q = ifftshift(ifft2(ifftshift(1i * wy .* C)));

questionAnswers(1)

yourAnswerToTheQuestion