0

anfft モジュールを使用して、検索画像とテンプレート画像の間の正規化された相互相関を計算する関数の速度を改善しようとしています。このモジュールは、FFTW CライブラリのPythonバインディングを提供し、2〜3倍高速であるようです。scipy.fftpack私の目的のために。

テンプレートのFFTを取得するときは、結果を検索画像と同じサイズにパディングして、それらを畳み込むことができるようにする必要があります。scipy.fftpack.fftnIを使用すると、パラメーターshapeを使用してパディング/切り捨てを実行しますが、anfft.fftnよりミニマルであり、ゼロパディング自体は実行しません。

自分でゼロパディングを実行しようとすると、使用した結果とは非常に異なる結果が得られshapeます。この例ではscipy.fftpack、だけを使用していますが、同じ問題がありanfftます。

import numpy as np
from scipy.fftpack import fftn
from scipy.misc import lena

img = lena()
temp = img[240:281,240:281]

def procrustes(a,target,padval=0):

    # Forces an array to a target size by either padding it with a constant or
    # truncating it

    b = np.ones(target,a.dtype)*padval
    aind = [slice(None,None)]*a.ndim
    bind = [slice(None,None)]*a.ndim
    for dd in xrange(a.ndim):
        if a.shape[dd] > target[dd]:
            diff = (a.shape[dd]-b.shape[dd])/2.
            aind[dd] = slice(np.floor(diff),a.shape[dd]-np.ceil(diff))
        elif a.shape[dd] < target[dd]:
            diff = (b.shape[dd]-a.shape[dd])/2.
            bind[dd] = slice(np.floor(diff),b.shape[dd]-np.ceil(diff))
    b[bind] = a[aind]
    return b

# using scipy.fftpack.fftn's shape parameter
F1 = fftn(temp,shape=img.shape)

# doing my own zero-padding
temp_padded = procrustes(temp,img.shape)
F2 = fftn(temp_padded)

# these results are quite different
np.allclose(F1,F2)

私は離散フーリエ変換にあまり精通していないので、おそらく非常に基本的な間違いを犯しているのではないかと思います。

4

1 に答える 1

1

逆変換を行うだけで、scipyがわずかに異なるパディング(上端と右端のみ)を行うことがわかります。

plt.imshow(ifftn(fftn(procrustes(temp,img.shape))).real)

plt.imshow(ifftn(fftn(temp,shape=img.shape)).real)
于 2012-09-17T14:38:18.973 に答える