2013-12-11 11 views
1

Я пытаюсь научить себя некоторым основам FFT, используя python. На данный момент я пытаюсь воспроизвести результат дифракции Matlab FFT2 с использованием python и связанных библиотек.Преобразование примера дифракции Matlab fft2 в Python

Пример, который я пытаюсь моделировать можно найти здесь: http://www.mathworks.ch/ch/help/matlab/math/fast-fourier-transform-fft.html#brfb2vw-3

В нижней части страницы вы увидите этот MatLab код:

D1 = fft2(M); 
D2 = fftshift(D1); 

imagesc(abs(D2)) 
axis image 
colormap(hot) 
title('{\bf Diffraction Pattern}') 

Это превращает преобразует круговую диафрагму изображения (они фактически создают это как массив, если это имеет значение) в дифракционную картину.

[Круговая диафрагма] www.mathworks.ch/help/releases/R2013b/matlab/math/aperture.gif

[результат вычисления в Matlab] www.mathworks.ch/help/releases/R2013b/ matlab/math/difraction1.gif

Проблема в том, что, когда я беру свое изображение с круговой апертурой (как графическое изображение) и применяю эквивалентные инструкции Scipy FFT2, я получаю другой результат. Почему это различие и каков правильный способ создания дифракционной картины. Есть ли аналогичные ошибки для возврата от дифракционной картины обратно к образу, который сделал это? Это работает только в том случае, если вы создаете апертуру как массив?

Мой питон код выглядит следующим образом:

import sys 
import numpy as np 
import pylab as py 
from scipy import misc, fftpack 

image = misc.imread(sys.argv[1]) 

D1 = fftpack.fft2(image) 
D2 = fftpack.fftshift(D1) 

abs_image = np.abs(D2) 
py.imshow(abs_image) 
py.show() 

Я скачал и использовали их круговую диафрагму изображения в качестве входных данных (после обрезки весов и т.д.), но я получаю цветной перекрестие на синем фоне в виде результат. Есть что-то похожее на маленькую точку посреди перекрестия. Является ли этот результат результатом того, что я использую загруженное изображение с круговой апертурой с его квадратными краями или это связано с кодом?

Большое спасибо заранее

ответ

1

Моя версия scipy.misc.imread даст вам W * H * 4 массив RGBA цветов, а не значения интенсивности и БПФ на это, вероятно, даст вам разные результаты.

Я портировал пример код Matlab для генерации M в numpy:

import numpy as np 
import pylab as py 
from scipy import misc, fftpack 

n = 2**10 
I = np.arange(1, n) 
x = I - n/2 
y = n/2 - I 

R = 10 

X = x[:, np.newaxis] 
Y = y[np.newaxis, :] 

M = X**2 + Y**2 < R**2 

D1 = fftpack.fft2(M) 
D2 = fftpack.fftshift(D1) 

abs_image = np.abs(D2) 
py.imshow(abs_image) 
py.show() 

Это дает лучший результат:

Result

+0

Спасибо. Простое объяснение, простой ответ, вера восстановлена ​​:) – user3090569

+0

Рад помочь :) Если вы считаете, что это правильно ответит на ваш вопрос, пожалуйста, примите ответ, нажав на значок галочки слева от него. –

Смежные вопросы