5

私は OpenCV、Python、および Numpy を使用するのは初めてですが、しばらくの間 Java、C++、C プログラマーでした。

次のことを行うシグマデルタ バックグラウンド検出器を実装しています。

i1 を最初の画像、i2 を 2 番目の画像とする

    for each pixel:
    if i1(x,y) > i2(x,y), then i2(x,y) = i2(x,y) + 1
    if i1(x,y) < i2(x,y), then i2(x,y) = i2(x,y) - 1

私は基本的に 2D 画像配列を反復処理し、ピクセル値を他の画像と比較しようとしていますが、for ループを使用して numpy 配列で動作させるのに苦労しています。ネストされた for ループを使用しようとしましたが、その配列の要素にアクセスできないというエラーが表示されます。

編集:

for x in range (width):
    for y in range (height):
        if Mt [x,y] > It[x,y]:
            Mt [x,y] = Mt[x,y]+1
        elif Mt [x,y] < It[x,y]:
            Mt [x,y] = Mt[x,y]-1

これは機能していますが、あまりエレガントでも効率的でもないようです。一刻も早い解決を望みます...

どんな提案でも大歓迎です

4

1 に答える 1

7

これは、説明とデモンストレーションのために、コードをベクトル化するのに最適な場所です。

#Generate two random arrays, shape must be the same
>>> Mt = np.random.rand(2,2)
>>> It = np.random.rand(2,2)
>>> Mt
array([[ 0.47961753,  0.74107574],
       [ 0.94540074,  0.05287875]])
>>> It
array([[ 0.86232671,  0.45408798],
       [ 0.99468912,  0.87005204]])

#Create a mask based on some condition
>>> mask = Mt > It
>>> mask
array([[False,  True],
       [False, False]], dtype=bool)

#Update in place
>>> Mt[mask]+=1
>>> Mt[~mask]-=1  #Numpy logical not
>>> Mt
array([[-0.52038247,  1.74107574],
       [-0.05459926, -0.94712125]])

現在、減算マスクはMt <= ItnotMt < Itであるため、おそらく 2 番目のマスクを作成する必要がありますが、これは論理否定を示すのに適した場所でした。


コードを正確に再現するには、代わりにこれを使用します。

Mt[Mt > It]+=1
Mt[Mt < It]-=1  

私はこれらのことに興味があるからです:

 def looper(Mt,It):
     for x in range (Mt.shape[0]):
         for y in range (Mt.shape[1]):
             if Mt [x,y] > It[x,y]:
                Mt [x,y] +=1
             elif Mt [x,y] < It[x,y]:
                Mt [x,y] -=1

nlooper = autojit(looper)

Mt = np.random.rand(500,500)
It = np.random.rand(500,500)

%timeit looper(Mt,It)
1 loops, best of 3: 531 ms per loop

%timeit Mt[Mt > It]+=1;Mt[Mt < It]-=1
100 loops, best of 3: 2.27 ms per loop

%timeit nlooper(Mt,It)
1 loops, best of 3: 308 µs per loop

autojitnumbaモジュールの python/numpy 用の JIT コンパイラです。

于 2013-09-12T17:49:43.730 に答える