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)));