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

前:

レナ、シフト前

後:

レナ、シフト後

4

1 に答える 1