2017-03-24 8 views
0

このコードを使用して画像の緑色を検出しています。numpyでこのイメージの反復を最適化する方法は?

この繰り返しは本当に遅いです。

これを高速化するにはどうすればよいですか?それがnumpyを使用している場合、どのようにnumpyの方法でそれを行うには?

def convertGreen(rawimg): 
    width, height, channels = rawimg.shape 
    size = (w, h, channels) = (width, height, 1) 
    processedimg = np.zeros(size, np.uint8) 
    for wimg in range(0,width): 
     for himg in range(0,height): 
      blue = rawimg.item(wimg,himg,0) 
      green = rawimg.item(wimg,himg,1) 
      red = rawimg.item(wimg,himg,2) 
      exg = 2*green-red-blue 
      if(exg > 50): 
       processedimg.itemset((wimg,himg,0),exg) 

    return processedimg 

答えて

4

この単純にしてみてください。

blue = rawimg[:,:,0] 
green = rawimg[:,:,1] 
red = rawimg[:,:,2] 
exg = 2*green-red-blue 
processedimg = np.where(exg > 50, exg, 0) 
+1

あなたは完全に 'for'ループの使用を避けています! –

+0

このエラーが発生しました。 exg = 2 * green-red-blue ueError:オペランドを図形とともにブロードキャストできませんでした(480,640)(480,2,3) –

+1

おっと!編集を参照してください( 'red'定義の最後のカンマがありません) – Julien

1

私は唯一の趣味としてnumpyのに手を出してきましたが、私はあなたがから新しいNP配列を作成しますfromfunctionの利点を取ることができると信じています既存のものhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfunction.html

この場合、numpyの速度を利用すると思います:

def handle_colors(img, x, y): 
    blue = img.item(x,y,0) 
    green = img.item(x,y,1) 
    red = img.item(x,y,2) 
    exg = 2*green-red-blue 
    if exg > 50: 
     return (exg, green, red) 
    return blue, green, red 

def convertGreen(rawimg): 
    processedimg = np.fromfunction(lambda i, j: handle_colors(rawimg, i, j), rawimg.shape) 
    return processedimg 
関連する問題