2013-04-20 25 views
16

私はSciPyとNumpyを使って2D行列の畳み込みをしようとしていますが失敗しました。 SciPyについては、Numpyのためにsepfir2dとscipy.signal.convolveとConvolve2Dを試しました。 Matlab for Pythonにconv2のような単純な関数がありますか?ここで2D畳み込みPythonでMatlabのconv2に似て

は一例です:

A= [ 5  4  5  4; 
     3  2  3  2; 
     5  4  5  4; 
     3  2  3  2 ] 

私は[0.707 0.707]

でそれを畳み込むしたいとMATLABからCONV2などによって結果が

3.5350 6.3630 6.3630 6.3630 2.8280 
2.1210 3.5350 3.5350 3.5350 1.4140 
3.5350 6.3630 6.3630 6.3630 2.8280 
2.1210 3.5350 3.5350 3.5350 1.4140 

でこの出力を計算するために、いくつかの機能ですPython?私は応答に感謝します。

答えて

-5

自分で実装しないのはなぜですか?conv2は空間形式で2次元の畳み込み方程式を直接正式に実装しています。 aとbがn1とn2 2つの離散変数の関数である場合、aとbの2次元コンボリューションのための式は、実際には enter image description here

しかし、CONV2は、有限の時間間隔のために畳み込みを計算します。

+5

私はもちろん、私が方法を見つけなかったなら、私は持っている必要があります。しかし、私の実装は最適化されないと思うので、私はパッケージを探しています。 – user1343318

+0

@downvoter:なぜ、下降音をなぜ説明してもらえますか? – Daniel

+3

@ダニエル - 畳み込みを計算するためのツールがすでに存在するときには、むしろ非効率な解決法を提案しているからです。また、OPの質問の文脈から判断すると、彼らはパッケージを使いたいと思う。私はあなたにdownvoteをしなかったが、私が悪い方法で感じていたら、私はそうだった。 – rayryeng

5

scipyのダウンロードのconvolved1d()少しだけ違ったエッジを扱い、あなたが欲しいものを行います。

sp.ndimage.filters.convolve1d(A,[0.707,0.707],axis=1,mode='constant') 

はあなたを与える:

array([[ 6.363, 6.363, 6.363, 2.828], 
     [ 3.535, 3.535, 3.535, 1.414], 
     [ 6.363, 6.363, 6.363, 2.828], 
     [ 3.535, 3.535, 3.535, 1.414]]) 

あなたは正確に同じ結果をしたい場合は、単に追加このように、ゼロのコラム:

sp.ndimage.filters.convolve1d(np.c_[np.zeros((4,1)),A],[0.707,0.707],axis=1,mode='constant') 

とあなたが取得します:

array([[ 3.535, 6.363, 6.363, 6.363, 2.828], 
     [ 2.121, 3.535, 3.535, 3.535, 1.414], 
     [ 3.535, 6.363, 6.363, 6.363, 2.828], 
     [ 2.121, 3.535, 3.535, 3.535, 1.414]]) 

私の経験から、あなたはMatlabで行うことのほとんどをscipy/numpyで行うことができます。

+0

おかげでBitwise、私はそれを試してみるつもりです。 – user1343318

30

scipyではさまざまな方法がありますが、2Dコンボルーションはnumpyに直接含まれていません。 (それはあなたがscipyのダウンロードの依存を避けるために必要がある場合、のみnumpyのを使用してFFTを実装するのも簡単です。)

scipy.signal.convolve2dscipy.signal.convolvescipy.signal.fftconvolve、およびscipy.ndimage.convolveすべての異なる中の2D畳み込みを(最後の三つがたNdある)処理されます方法。

scipy.signal.fftconvolve fftドメイン内の畳み込み(単純な乗算)です。多くの場合、これははるかに高速ですが、エッジ効果の違いがディスクリートの場合と比べて非常に小さくなり、この特定の実装ではデータが浮動小数点に強制されます。さらに、より大きな配列を持つ小さな配列を畳み込むときには、不要なメモリ使用量があります。概して、fftベースのメソッドは劇的に高速になりますが、scipy.signal.fftconvolveが理想的な解決策ではない一般的な使用例がいくつかあります。

,scipy.signal.convolveおよびscipy.ndimage.convolveはすべて、Cで実装された離散畳み込みを使用しますが、さまざまな方法で実装します。

scipy.ndimage.convolveは同じデータ型を保持し、メモリ使用量を最小限に抑えるために出力の場所を制御します。 uint8(画像データなど)を畳み込んでいる場合は、しばしば最適なオプションです。出力は常に最初の入力配列と同じ形状になりますが、画像には意味がありますが、より一般的な畳み込みではないでしょう。 ndimage.convolveは、mode kwarg(これはscipy.signalmodekwargとはまったく異なります)を通して、エッジ効果の処理方法を大幅に制御します。

2次元アレイで作業している場合はscipy.signal.convolveを避けてください。これはN-dの場合に有効ですが、2次元配列では最適ではないので、まったく同じことをやや効率的に行うにはscipy.signal.convolve2dが存在します。 scipy.signalの畳み込み関数は、mode kwargを使用して出力シェイプを制御します。 (デフォルトでは、matlabのconv2のように動作します)。これは一般的な数学的畳み込みには便利ですが、画像処理にはあまり役に立ちません。しかし、scipy.signal.convolve2dは、通常、scipy.ndimage.convolveよりも遅いです。

異なるサブモジュールの重複のために部分的に多くのオプションがありますが、一部には異なるパフォーマンスのトレードオフを持つ畳み込みを実装するさまざまな方法があるためです。

ユースケースについてもう少し詳しく説明できる場合は、より良いソリューションをお勧めします。おおよそ同じサイズの2つの配列を畳み込んでいて、すでに浮動小数点の場合はfftconvolveが最適です。そうでなければ、scipy.ndimage.convolveがそれを打ち負かすかもしれません。

+0

Joeに詳細な対応をお願いします。私はノイズ除去に使用される画像の静止ウェーブレット変換を実行しようとしています。それは私がそれを使いたい場所です。 – user1343318

+1

その場合、 'scipy.ndimage.convolve1d'というBitwiseがおそらく最良の選択です。これは、1d配列と2d配列を畳み込む特定のユースケースに対して最適化されています。希望が助けてくれる! –

+1

また、 'A 'に0を埋め込む必要がない場合は、' scipy.signal.convolve2d'が良い選択肢かもしれません。返される配列の形状は、デフォルトでmatlabの 'conv2'のようになります。 (私は元々答えにその情報を含めるのを忘れていました)イメージで作業しているのであれば、返された配列をオリジナルと同じ形にしたいと思うでしょう。その場合、 'ndimage'が最善の策です。 –

関連する問題