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 ピクセルのレナの画像を考えてみます。各方向に 10.4 ピクセルずつシフトしたい場合、画像のウォブリング変調が発生します。画像は次のとおりです。
前:
後: