2017-03-24 2 views
1

Je tente d'animer une image sinusoïdale simple. Logiquement, ceci peut être accompli avec une image de Fourier-espace qui a la puissance dans exactement 1 composant réel (pixel), et changeant graduellement la composante imaginaire correspondante de pixel (valeur de phase). Le code ci-dessous produit un réseau horizontal qui se déplace très progressivement vers le bas. Pourtant, le décalage est lent, et une fois que la phase dépasse une certaine valeur, l'image ne s'anime plus. Quelles sont les unités et la gamme du composant de phase? Qu'est-ce que j'oublie ici?traduction dans l'espace Fourier

import numpy as np, matplotlib as mpimg 

f = (np.zeros([33, 33]) + 0j) # blank Fourier image 
f[14, 16] = (1 + 0j) # a single component with power 

steps = range(16) # number of images to produce 
for i in range(len(steps)): 
    c = np.fft.ifft2(np.fft.ifftshift(f, axes=[0, 1])) # grating image (cartesian) 
    mpimg.imsave('grating %02i.png' % i, c, cmap='gray') # save image 
    f[14, 16] += complex(0, 1/16.0) # increment phase 

Répondre

2

Le composant de phase n'est pas seulement le composant imaginaire. La composante de phase est atan2 (Im, Re). Pour déplacer l'image de façon linéaire, votre incrément devrait probablement modifier cette phase de 2 * pi/nsteps. Ce qui signifie qu'il doit modifier à la fois le composant réel et imaginaire.

+0

C'est tout! Mais énoncé plus clairement, d'abord calculer l'angle formé entre les composants réels et imaginaires avec 'atan2 (Im, Re)'. Puis incrémenter l'angle résultant d'une valeur de pas. Enfin, remplacez le composant de Fourier d'origine par 'complex (cos (new_angle), sin (new_angle)'. – jdobres