11

私が見た限りでは、これらのメソッドは両方ともそれぞれの DLL で C 関数として実装されており、ndimageバージョンの方が高速であるように見えます (どちらの実装も blas や MKL の呼び出しなどの並列化されたコードを使用していません)。

また、次のコードを実行して同じ結果が返されることを確認しようとしたところ、同等性のアサーションに失敗しました。ドキュメントからは、2 つの方法の機能上の違いが正確にどうあるべきかを理解できませんでした (ドキュメントは0、カーネルの原点の位置に関連する意味についても明確ではありません。例から、中心にあると推測しました) 、しかし、私は間違っているかもしれません)。

from numpy import random, allclose
from scipy.ndimage.filters import convolve as convolveim
from scipy.signal import convolve as convolvesig

a = random.random((100, 100, 100))
b = random.random((10,10,10))

conv1 = convolveim(a,b, mode = 'constant')
conv2 = convolvesig(a,b, mode = 'same')

assert(allclose(conv1,conv2))

ありがとう!

4

2 に答える 2

4

非常に重要な違いがあります。画像パッケージの実装は、畳み込み後に「同じ」サイズの画像を実現するために画像処理で使用される典型的な制限付きバージョンのようです。したがって、上記の例のように mode='constant' を使用すると、信号処理パッケージの 'same' オプションと一致します。信号処理パッケージは、畳み込み演算子の実際の厳密な定義を実装しているようです。おそらくこの理由で遅くなります。まったく異なる結果をもたらすいくつかの例を同封してください。

In [13]: a=array([[1,2,1]])
In [14]: b=array([[1],[2],[1]])

In [17]: convolveim(a,b)
Out[17]: array([[4, 8, 4]])

In [18]: convolveim(b,a)
Out[18]: 
array([[4],
       [8],
       [4]])

In [19]: convolvesig(a,b)
Out[19]: 
array([[1, 2, 1],
       [2, 4, 2],
       [1, 2, 1]])

In [20]: convolvesig(b,a)
Out[20]: 
array([[1, 2, 1],
       [2, 4, 2],
       [1, 2, 1]])

信号処理パッケージの実装は、正しい畳み込みで予想されるように可換であることに注意してください。ただし、画像パッケージの実装はそうではなく、最初のパラメーターと「同じ」次元のソリューションを提供します。

于 2013-11-08T19:12:05.910 に答える