Xenion schreef:
Je afbeelding is niet vierkant, waarom definieer je dan een NxN grid?
Dan verder: de x en y grids die je definieert gaan van 0 tot het aantal rijen/kolommen. Als je het MATLAB voorbeeld volgt dan zie je dat die maar opbouwen tot de helft en dan negatief worden en weer opbouwen tot -1. Dit om rekening te houden met de volgorde waarin de fft functie het spectrum weergeeft.
Dat vierkant is omdat de uiteindelijke implementatie toch op GPU komt, en die doet enkel power-2 fft's.
Je oplossing is inderdaad juist. Ongelofelijk bedankt! Maar nu zit ik met het volgende probleem bij rotatie via het Fourier-domein. Weet je waar zo'n effect vandaan kan komen? Het heeft waarschijnlijk ook iets te maken met het kiezen van de N'en, aangezien het voor die aanpassing wel goed werkte (op die interpolatie met te hoge frequenties na, zoals in #1) maar ik zie begot niet wat dit effect kan veroorzaken.
- koe2.png (130.85 KiB) 498 keer bekeken
Code: Selecteer alles
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import math
N = 2048
img=mpimg.imread('koe.png')
f = np.zeros((N,N))
f[:img.shape[0],:img.shape[1]] = img[:,:,3]
f = f[::8,::8]
N=N/8
def fft(x):
return np.fft.fft2(x)
def ifft(x):
return np.fft.ifft2(x)
exp = np.exp
pi = np.pi
j = 1j
def convertfreqs(x):
return np.mod((x + N/2),N) - N/2
def s(r):
plt.figure()
#plt.imshow(np.real(r), vmin=0.0, vmax=1.0, interpolation='none')
plt.imshow(np.absolute(r), interpolation='none', vmin=0.0, vmax=1.0)
plt.colorbar()
x = np.tile(convertfreqs(np.arange(N)),(N,1)).T
y = x.T
freq = np.zeros((N,N),dtype='complex64')
S = 2
freq[:N/S:,:N/S:] = fft(f)[:N/S:,:N/S:]
freq[(S-1)*N/S::,(S-1)*N/S::] = fft(f)[(S-1)*N/S::,(S-1)*N/S::]
freq[(S-1)*N/S::,:N/S:] = fft(f)[(S-1)*N/S::,:N/S:]
freq[:N/S:,(S-1)*N/S::] = fft(f)[:N/S:,(S-1)*N/S::]
angle = pi/4
translation = (0.0,0.0) #( 0.5 * N , (-np.sqrt(2.)/2+0.5) * N)
a = np.cos(angle)
b = np.sin(angle)
x = np.tile(convertfreqs(np.arange(N)),(N,1)).T
y = x.T
z1 = exp( pi*1j * ( (x**2 - y**2)*a + 2*x*y*b)/N)
#still a bug!
t = np.zeros((4*N,4*N),dtype='complex64')
t[:N:,:N:]=z1 * freq * 1./N**2 * exp( 2*pi*1j* (x*translation[0] + y*translation[1]) / N )
x = np.tile(convertfreqs(np.arange(N-1,-N-1,-1)),(2*N,1)).T
y = np.tile(convertfreqs(np.arange(2*N-1,-1,-1)),(2*N,1))
big_z2 = np.zeros((4*N,4*N),dtype='complex64')
big_z2[:2*N,:2*N] = exp( pi*1j * ( (x**2 - y**2)*a + 2*x*y*b)/N)
c1 = ifft( fft(t) * fft(big_z2.conjugate()) )
c1 = c1[N:2*N, 2*N-1:N-1:-1]
c1 = c1 * z1.T.conjugate()
s(c1)
plt.show()