24

scipy(または別の人気のあるライブラリ)に組み込まれているFFTベースの2D相互相関または畳み込み関数はありますか?

次のような関数があります。

  • scipy.signal.correlate2d-「によって実装される直接法はconvolveND、大きなデータの場合は遅くなります」
  • scipy.ndimage.correlate-「アレイは、正確な計算を使用して(つまり、FFTではなく)指定されたカーネルと相関しています。」
  • scipy.fftpack.convolve.convolve、私は本当に理解していませんが、間違っているようです

numarrayにはスイッチcorrelate2d()付きの関数がありましたfft=Trueが、numarrayがnumpyに折りたたまれていて、この関数が含まれているかどうかわかりません。

4

6 に答える 6

24

magnusからも指摘されているようscipy.signal.fftconvolveに、私は見つけましたが、それがn次元であることを当時は認識していませんでした。組み込みで適切な値を生成するため、理想的なソリューションのようです。

2D畳み込みの例から:

In [1]: a = asarray([[ 1, 2, 3],
   ...:              [ 4, 5, 6],
   ...:              [ 7, 8, 9]])

In [2]: b = asarray([[-1,-2,-1],
   ...:              [ 0, 0, 0],
   ...:              [ 1, 2, 1]])

In [3]: scipy.signal.fftconvolve(a, b, mode = 'same')
Out[3]: 
array([[-13., -20., -17.],
       [-18., -24., -18.],
       [ 13.,  20.,  17.]])

正しい!一方、STSCIバージョンでは、境界を正しくするために追加の作業が必要ですか?

In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]: 
array([[-12., -12., -12.],
       [-24., -24., -24.],
       [-12., -12., -12.]])

(STSCIメソッドもコンパイルが必要ですが、これは失敗しました(Python以外の部分をコメントアウトしたばかりです)。このようなバグがいくつかあり、入力を変更します([1、2]は[[1、2]]になります)、など。そこで、受け入れた回答を組み込みfftconvolve()関数に変更しました。)

もちろん、相関は畳み込みと同じですが、1つの入力が逆になります。

In [5]: a
Out[5]: 
array([[3, 0, 0],
       [2, 0, 0],
       [1, 0, 0]])

In [6]: b
Out[6]: 
array([[3, 2, 1],
       [0, 0, 0],
       [0, 0, 0]])

In [7]: scipy.signal.fftconvolve(a, b[::-1, ::-1])
Out[7]: 
array([[ 0., -0.,  0.,  0.,  0.],
       [ 0., -0.,  0.,  0.,  0.],
       [ 3.,  6.,  9.,  0.,  0.],
       [ 2.,  4.,  6.,  0.,  0.],
       [ 1.,  2.,  3.,  0.,  0.]])

In [8]: scipy.signal.correlate2d(a, b)
Out[8]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [3, 6, 9, 0, 0],
       [2, 4, 6, 0, 0],
       [1, 2, 3, 0, 0]])

最新のリビジョンは、内部で2の累乗のサイズを使用することで高速化されています(次に、実際の入力に実際のFFTを使用し、2の累乗の代わりに5つの滑らかな長さを使用することでさらに高速化されました:D

于 2009-11-20T03:22:54.417 に答える
8

scipy.signal.fftconvolve、signal.convolve、signal.correlateを見てください(signal.correlate2dがありますが、中央に配置されていない、シフトされた配列を返すようです)。

于 2009-09-25T13:22:24.360 に答える
5

scipy.stsciパッケージが必要だと思います。

http://docs.scipy.org/doc/scipy/reference/stsci.html

In [30]: scipy.__version__
Out[30]: '0.7.0'

In [31]: from scipy.stsci.convolve import convolve2d, correlate2d
于 2009-07-08T20:07:59.520 に答える
3

scipyでこのパッケージのステータスを追跡できなくなりましたが、ユーザーの便宜のために、stsci_pythonリリースパッケージの一部としてndimageが含まれていることはわかっています。

http://www.stsci.edu/resources/software_hardware/pyraf/stsci_python/current/download

または、必要に応じてリポジトリからプルできるはずです。

https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/ndimage/

于 2009-07-09T03:53:20.650 に答える
3

パディングとナンスを処理し、ここに単純な滑らかなラッパーを含む相互相関/畳み込みラッパーを作成しました。これは人気のあるパッケージではありませんが、numpy(またはより高速なfftsの場合はfftw)以外の依存関係もありません。

誰かが興味を持った場合に備えて、ここにFFT速度テストコードも実装しました。驚くべきことに、少なくとも私のマシンでは、numpyのfftがscipyのfftよりも速いことを示しています。

編集:ここでコードをN次元バージョンに移動しました

于 2011-12-10T02:45:41.773 に答える
2

オーバーラップ加算法を使用するScipy1.4以降にscipy.signal.oaconvolveがあることに注意してください。

于 2019-12-01T20:32:03.520 に答える