Несоответствие между Matlab и Numpy + Python FFT2? - PullRequest
2 голосов
/ 24 марта 2011

Так что я делал домашнее задание по дифракции в Python с Numpy. Мои результаты просто не получились бы такими, какими они должны быть, и я был смущен.

Код, который я использовал для генерации БПФ, выглядит следующим образом:

Python:
aperaturearray = np.array(im) # Turn image into numpy array
Ta = np.fft.fftshift(np.fft.fft2(aperaturearray))
### I did some calculations here ###
ftfm = Image.fromarray(np.uint8(Utfm)) 
ftfm.save(("Path"))  

Matlab:
rect = imread('PATH\pyRectangle.jpg');
rectfft = fft2(rect);
imwrite(rectfft, 'C:\Users\Dan\Documents\python\DiffPhotos\matlabRectfft','jpg')
pyrectmat = ifft2(pyfftrect);
imwrite(pyrectmat, 'Path','jpg')

Изображения здесь -> http://imgur.com/a/3Cw81#EdFoA

Теперь, что здесь происходит? Почему изображения FFT такие разные? Разные реализации? Почему мой домашний код не работает: (

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Добавить к ответу mor22:

В Matlab вы можете использовать fftshift для перемещения самых низких частот к центру. Он просто меняет верхний левый угол на нижний правый квадрант (и верхний правый на нижний левый).

1 голос
/ 24 марта 2011

Начнем с того, что в Matlab значения, возвращаемые из fft2, являются сложными.Я не уверен, как imwrite справится с ними.Попытка этого кода, кажется, дает почти ощутимые результаты.(Принимая log10 помогает с отображением)

rect = imread('rect.jpg');
rectfft = fft2(rect);
pcolor(log10(abs(rectfft)));
shading flat

Изображение смещено относительно начала координат, потому что индекс пикселей, вероятно, связан с пространственной частотой изображения.т.е. низкие пространственные частоты появляются близко к 0,0.Более высокие пиксельные обозначения являются псевдонимами этих частот.Вы могли бы переставить изображение, чтобы поместить (0,0) в середину с некоторыми матричными манипуляциями.

...