БПФ2 Ненулевая мнимая часть для центросимметричного c объекта? - PullRequest
2 голосов
/ 10 июля 2020

Сейчас я тестирую пакет fft из numpy. Я создал искусственное центросимметричное изображение c и сделал на нем 2D FFT, я взял мнимую часть и заметил, что она не равна нулю. Я не понимаю почему, ты хоть представляешь? Может быть, есть что-то, что мне не хватает, когда я перехожу от радиального профиля 1D к изображению 2D, я действительно не знаю ...

НОВОЕ ОБНОВЛЕНИЕ (новый пример):

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt


I_min = 1.774E-6 #min(y_intensity[y_intensity!=0])
y = np.ones(50) #y_intensity[:50]
xv_3 = np.linspace(0,0.005,len(y))*1E3# x_intensity[:50]*1E3

new_r = np.linspace(-100,100,2**8)
interpol_index = interpolate.interp1d(xv_3, y)
X, Y = np.meshgrid(new_r,new_r)
profilegrid3 = np.ones(X.shape, float)
for i, x in enumerate(X[0, :]):
    for k, z in enumerate(Y[:, 0]):
        current_radius = np.sqrt(x**2 + z**2)
        
        cond=np.logical_or(current_radius>=max(xv_3),current_radius<=min(xv_3))
        if cond == True :
            profilegrid3[i, k] = I_min

        else :
            profilegrid3[i, k] = interpol_index(current_radius)

plt.figure()
plt.imshow(np.imag(np.fft.ifftshift(np.fft.fft2(np.fft.fftshift(profilegrid3)))))
plt.colorbar()
plt.show()

Изображение:

enter image description here

Imaginary Part :

введите описание изображения здесь

1 Ответ

2 голосов
/ 11 июля 2020

В вашем коде есть две проблемы:

  1. Используйте ifftshift, чтобы преобразовать изображение с исходной точкой посередине, чтобы исходная точка находилась в верхнем левом углу, где выполняется БПФ ожидает этого. И используйте fftshift, чтобы преобразовать результат БПФ так, чтобы начало координат было посередине. (Вы используете их неправильно.) Но обратите внимание, что эти две функции делают одно и то же для массивов одинакового размера, поэтому вы не заметите разницы после того, как исправите это.

  2. Ваш ввод должен иметь источник size//2. То, как вы создаете new_r, означает, что начало координат находится прямо между пикселями. Я думаю, что добавление endpoint=False к вашему np.linspace вызову исправит это.

...