2

我正在尝试使用 2D FFT 和傅里叶变换移位定理来移位表示具有亚像素精度的图像的 2D 数组。当移位值是整数(像素精度)时效果很好,但是当移位值不是整数时,我会得到很多伪像,即像素的一小部分。代码如下:

import numpy as np
from scipy.fftpack import fftfreq
def shift_fft(input_array,shift):
    shift_rows,shift_cols = shift
    nr,nc = input_array.shape
    Nr, Nc = fftfreq(nr), fftfreq(nc)
    Nc,Nr = np.meshgrid(Nc,Nr)
    fft_inputarray = np.fft.fft2(input_array)
    fourier_shift = np.exp(1j*2*np.pi*((shift_rows*Nr)+(shift_cols*Nc)))
    output_array = np.fft.ifft2(fft_inputarray*fourier_shift)
    return np.real(output_array)

因此, shift_fft(input_array,[2,0]) 将起作用,但 shift_fft(input_array,[2.4,0]) 在没有工件的情况下将不起作用。我做错了什么?例如,考虑 128x128 像素的 Lena 图像。如果我想在每个方向上移动 10.4 像素,我会得到一些图像的摆动调制。图像如下:

前:

莉娜,换班前

后:

莉娜,换班后

4

1 回答 1

1

您可以尝试使用scipy.ndimage.shift。它移动像素类似于numpy.roll,但也允许使用插值进行小数移动值。

对于彩色图像,请确保为第 3 轴(通道)提供 0 的偏移。

import scipy.ndimage

scipy.ndimage.shift(input_array, (2.4, 0))

默认情况下,它将背景设置为黑色,但您可以调整模式以使其环绕或具有自定义颜色。

于 2020-06-08T14:57:22.160 回答