ホームページ  >  記事  >  バックエンド開発  >  Pythonの畳み込み関数の使い方

Pythonの畳み込み関数の使い方

WBOY
WBOY転載
2023-05-20 21:31:111732ブラウズ

畳み込み関数

pythonはさまざまな畳み込みスキームを提供しますが、ndimageで定義されている畳み込み関数は機能的には畳み込みよりも若干複雑です。 numpysignal。これは、入力パラメータの数だけでわかります。

numpy.convolve(a, v, mode='full')
scipy.ndimage.convolve1d(input, weights, axis=-1, output=None, mode='reflect', cval=0.0, origin=0)

scipy.signal.convolve(in1, in2, mode='full', method='auto')
scipy.ndimage.convolve(input, weights, output=None, mode='reflect', cval=0.0, origin=0)

最初の 2 つは 1 次元の畳み込み関数であり、ndimage は次のことを実行できます。単一の座標軸に沿った多次元配列に対する畳み込み演算であり、後の 2 つは多次元畳み込みです。

numpy と signal の畳み込み関数には 3 つのモードがあり、畳み込み後のエッジ特性を調整するために使用されます。2 つの入力畳み込みオブジェクトの次元が N NN と M MM の場合、これらの出力結果は次のようになります。 3 つのモードは

  • full: 出力次元は N M − 1 N M-1N M−1 で、最後のポイントの信号は完全に素です。オーバーラップしているため、エッジ効果が明らかです。

  • 同じ: 出力寸法 max ⁡ ( M , N ) \max(M,N)max(M,N)、エッジ効果は引き続き表示されます

  • ##valid: 出力次元 ∣ M − N ∣ |M-N|∣M−N∣、完全に重なっている領域のみが返されます。これは、点を次のように分割するのと同等です。エッジ効果

ndimageconvolve はエッジ効果のためにすべて削除され、画像が拡大され、その mode展開後の塗りつぶし形式が決まります。フィルタリングする配列が a b c d であると仮定すると、さまざまなモードで次のようにエッジを塗りつぶします

データ右パディングreflect a b c dd c b a##定数最寄りd c bc b aa b c da b c dk はパラメータ cval
##左パディング
d c b a
k k k k a b c d k k k k
a a a aa b c d d d d ##ミラー
a b c d ラップ
a b c d どこ,
によって設定されます。

境界を変更するこれら 5 つの方法は、scipy.ndimage の関数、特に標準の畳み込みを伴うフィルター関数の間で非常に一般的です。

比較テスト

次に、これらのさまざまな畳み込み関数のパフォーマンス テストを実行します。5 × 5 畳み込みテンプレートを使用して、1000 × 1000 行列で畳み込み計算を実行します。さまざまな実装の畳み込みとその速度を見てください。

import numpy as np
import scipy.signal as ss
import scipy.ndimage as sn
from timeit import timeit


A = np.random.rand(1000,1000)
B = np.random.rand(5,5)

timeit(lambda : ss.convolve(A, B), number=10)
# 0.418
timeit(lambda : sn.convolve(A, B), number=10)
# 0.126

それに比べて、

ndimage

の畳み込みは明らかに効率的です。

次に、1 次元の畳み込みのパフォーマンスをテストします。

A = np.random.rand(10000)
B = np.random.rand(15)

timeit(lambda : np.convolve(A, B), number=1000)
# 0.15256029999727616
timeit(lambda : ss.convolve(A, B), number=1000)
# 0.1231262000001152
timeit(lambda : sn.convolve(A, B), number=1000)
# 0.09218210000108229
timeit(lambda : sn.convolve1d(A, B), number=1000)
# 0.03915820000111125
対照的に、convolve1d

は実際に

1d

関数の畳み込みであり、最も高速です。一方、

numpy で提供される関数は最も遅いです。 畳み込みアプリケーション畳み込み演算は、画像のフィルタリングやエッジ抽出でよく使用されます。たとえば、以下のような行列を使用して、画像の垂直エッジを抽出できます。

簡単なテストをしてみましょう

from scipy.misc import ascent
import matplotlib.pyplot as plt
img = ascent()
temp = np.zeros([3,3])
temp[:,0] = -1
temp[:,2] = 1

edge = sn.convolve(img, temp)

fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(img)
ax = fig.add_subplot(122)
ax.imshow(edge)
plt.show()

以上がPythonの畳み込み関数の使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。