以下代码在通过傅立叶相移移动图像时创建了人工制品:
相移本身的代码是:
def phase_shift(fimage, dx, dy):
# Shift the phase of the fourier transform of an image
dims = fimage.shape
x, y = np.meshgrid(np.arange(-dims[1] / 2, dims[1] / 2), np.arange(-dims[0] / 2, dims[0] / 2))
kx = -1j * 2 * np.pi * x / dims[1]
ky = -1j * 2 * np.pi * y / dims[0]
shifted_fimage = fimage * np.exp(-(kx * dx + ky * dy))
return shifted_fimage
实际移动图像并获取移动图像的用法:
def translate_by_phase_shift(image, dx, dy):
# Get the fourier transform
fimage = np.fft.fftshift(np.fft.fftn(image))
# Phase shift
shifted_fimage = phase_shift(fimage, dx, dy)
# Inverse transform -> translated image
shifted_image = np.real(np.fft.ifftn(np.fft.ifftshift(shifted_fimage)))
return shifted_image
工件显示在下面的图像中(图像具有偶数尺寸)。顶行是上下文(整个图像),底行是红色矩形中的特写。左:参考图像。中:与上述代码移位并受制于工件。右图:cv2.warpAffine()使用相同班次时的样子。
我在上面创建这个工件的代码中做错了什么?
[更新] 建议使用的评论之一scipy.ndimage.fourier.fourier_shift()。所以我就是这样做的:
fourier_shifted_image = fourier_shift(np.fft.fftn(image), shift)
shifted_image = np.fft.ifftn(fourier_shifted_image)
并绘制实部 ( shifted_image.real)
事实上,它也会产生完全相同的工件(见下图,右侧),我猜这排除了phase_shift()上面自定义代码中的错误?
慕斯王
LEATH
相关分类