2つのスタックカーネルで指定された2つの値の間にあるすべてのピクセルの数を知りたい2次元配列を持っています。ボーダーはカウントから除外する必要があります。例えば範囲内のナンシーカスタム移動ウィンドウカウントセル
:これを行うには
input = np.array([[1, 0, 0, 2, 1],
[0, 2, 1, 1, 7],
[2, 0, 6, 4, 1],
[1, 2, 3, 0, 5],
[6, 5, 4, 3, 2]])
kernel_min=np.array([[0, 1, 0],
[0, 1, 2],
[0, 0, 1]])
kernel_max=np.array([[2, 3, 2],
[2, 2, 4],
[2, 2, 3]])
min_max = np.dstack((kernel_min,kernel_max))
outcome= [[0, 0, 0, 0, 0],
[0, 7, 7, 9, 0],
[0, 8, 8, 8, 0],
[0, 8, 8, 8, 0],
[0, 0, 0, 0, 0]]
私は、入力配列のすべての要素をループするスクリプトを作成しました。各要素の周りには、カーネルのサイズの領域が抽出され、カーネルの範囲内のセルが数えられます。
しかし、このすべての要素をループすることはかなり時間がかかります(私は巨大な配列を持っています)。 2つのカーネルの範囲内のピクセル数を高速化する方法はありますか?たとえば、すべての値をカウントする移動ウィンドウ関数です。
これは本当にひどかった。スピードアップをテストするために、1035×1400ピクセルの8ビットイメージを使用しました。 は私のスクリプト-with計算は、約100秒を要したview_as_windows - 抜け は、それはそれは私がより大きな画像を処理していたときにこれは多くの時間を節約する約17秒 を取った第二のアプローチ-with約20秒に を取った機能します。どうもありがとう! Iは、サイズ(50から70)カーネルを増加させ、同じ画像を使用する場合 –
は: - with_strides = 56秒(フルmemmory)を - 第2の方法は、より最適であるようkernel_loops = 32秒 はですね! –