Sub-pixel shift via Fourier geeft rare resultaten
Geplaatst: ma 15 dec 2014, 15:31
Ik probeer via het Fourier-domein een functie op andere plaatsen te sampelen, bijvoorbeeld om te zien wat er gebeurt met mijn afbeelding als ik het een halve pixel opschuif. Dat doe ik met de translatie-eigenschap in het Fourier domein: https://en.wikipedia.org/wiki/Fourier_transform#Basic_properties
Zie bijvoorbeeld de publicaties:
http://www.mathworks.com/matlabcentral/fileexchange/18401-efficient-subpixel-image-registration-by-cross-correlation/content/html/efficient_subpixel_registration.html
Het einddoel: http://spin.ecn.purdue.edu/fmri/PDFLibrary/TongR_MRM_1999_41_253_256.pdf
De resultaten zijn daar steeds erg bevredigend, maar bij mij loopt er nog iets mis. Als ik bijvoorbeeld de afbeelding van mijn koe een halve pixel opschuif, krijg ik het volgende:
Origineel:
Het resultaat:
Ik plaats er nog even een minimal working code example in python bij:
Weet er iemand raad? Hoe kan ik wel een redelijk resultaat bekomen?
Zie bijvoorbeeld de publicaties:
http://www.mathworks.com/matlabcentral/fileexchange/18401-efficient-subpixel-image-registration-by-cross-correlation/content/html/efficient_subpixel_registration.html
Het einddoel: http://spin.ecn.purdue.edu/fmri/PDFLibrary/TongR_MRM_1999_41_253_256.pdf
De resultaten zijn daar steeds erg bevredigend, maar bij mij loopt er nog iets mis. Als ik bijvoorbeeld de afbeelding van mijn koe een halve pixel opschuif, krijg ik het volgende:
Origineel:
Het resultaat:
Ik plaats er nog even een minimal working code example in python bij:
Code: Selecteer alles
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
N = 2048
img=mpimg.imread('koe.png') #http://www.clipartbest.com/cliparts/RiA/yXL/RiAyXLriL.png
f = np.zeros((N,N))
f[:img.shape[0],:img.shape[1]] = img[:,:,3]
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 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(np.arange(N),(N,1)).T
y = x.T
result = ifft( fft(f)* np.exp(1j*2*np.pi*(-0.5*x/N-0.5*y/N)) )
s(result)
s(f)
plt.show()