3

私は形状>(500、500)の3つの派手な配列を持っています。それらを同時に反復しようとしています。2 つの異なる方法を試しましたが、どちらも遅いです。

ここでIx_Ix_blurIx_Iy_blurIy_Iy_blurは同じサイズです。機能を見つけて OpenCV イメージに描画しようとしています。


方法 1:

for i in xrange (Ix_Ix_blur.shape[1]):
    for j in xrange(Ix_Ix_blur.shape[0]):
        A = np.array([ [Ix_Ix_blur[j][i], Ix_Iy_blur[j][i]], 
            [Ix_Iy_blur[j][i], Iy_Iy_blur[j][i]] ])
        detA = (A[0][0]*A[1][1])-(A[0][1]*A[1][0])
        traceA = A[0][0]+A[1][1]

        harmonic_mean = detA/traceA
        if(harmonic_mean > thresh):
            cv2.circle(img, (i,j), 1, (0, 0, 255), -1, 8)

これは7 seconds、512*512 のサイズの画像の場合に約かかります。


方法 2:

Ix_Iy_blur_iter = np.nditer(Ix_Iy_blur)
Iy_Iy_blur_iter = np.nditer(Iy_Iy_blur)
Ix_Ix_blur_iter = np.nditer(Ix_Ix_blur)

while(not Ix_Iy_blur_iter.finished):
    try:
        A = np.array([[Ix_Ix_blur_iter.next(), Ix_Iy_blur_iter.next()],[Ix_Iy_blur_iter.value, Iy_Iy_blur_iter.next()]])
    except StopIteration:
        break
    detA = (A[0][0]*A[1][1])-(A[0][1]*A[1][0])
    traceA = A[0][0]+A[1][1]

    harmonic_mean = detA/traceA
    if(harmonic_mean > thresh):
        i = Ix_Ix_blur_iter.iterindex/Ix.shape[0]
        j = Ix_Ix_blur_iter.iterindex - Ix.shape[0]*i
        cv2.circle(img, (j,i), 1, (0, 0, 255), -1, 8)

この方法も7 seconds、同じサイズの画像を反復処理するのにかかるようです。

反復に必要な時間を短縮できる他の方法はありますか?

構成:

  • Ubuntu 12.04
  • 第 3 世代コア i5 プロセッサー
  • 4GBのRAM
  • 2 GB ATI RADEON GPU (オフにしました)
4

1 に答える 1

4

Ix_Ix_blur[j, i]まず、の代わりに使用できますIx_Ix_blur[j][i]Ix_Ix_blur[j][i]非常に遅い一時的な配列を作成します。

ndarray を使用して要素へのアクセスを高速化するには、Python ネイティブの数値を返す item() メソッドを使用できます。一時的な配列 A を作成する必要はありません。ネイティブの数値を使用した計算は、numpy スカラーよりも高速です。

for i in xrange (Ix_Ix_blur.shape[1]):
    for j in xrange(Ix_Ix_blur.shape[0]):
        a, b, c = Ix_Ix_blur.item(j, i), Ix_Iy_blur.item(j, i), Iy_Iy_blur.item(j, i)
        detA = a*c - b*b
        traceA = a + c
        harmonic_mean = detA/traceA
        if harmonic_mean > thresh:
            cv2.circle(img, (i,j), 1, (0, 0, 255), -1, 8)

特定の問題については、ループで計算を行う必要はありません。次のことができます。

detA = Ix_Ix_blur * Iy_Iy_blur - Ix_Iy_blur**2
traceA = Ix_Ix_blur + Iy_Iy_blur
harmonic_mean = detA / traceA
for j, i in np.argwhere(harmonic_mean > thresh):
    cv2.circle(img, (i,j), 1, (0, 0, 255), -1, 8)
于 2013-02-06T12:19:08.307 に答える