2016-05-05 2 views
2

不要な背景を取り除くためにいくつかの画像をフィルタリングしていますが、これまでにopenCVを使用してBGRのピクセルをチェックして成功しました。より多くの同様のif文のカップルがあります画像を繰り返し処理する複数の条件を持つPythonのnumpy配列

h, w, channels = img.shape 
    for x in xrange(0,h): 
     for y in xrange (0,w): 
      pixel = img[x,y] 
      blue = pixel[0] 
      green = pixel[1] 
      red = pixel[2] 

      if green > 110: 
       img[x,y] = [0,0,0] 
       continue 

      if blue < 100 and red < 50 and green > 80: 
       img[x,y] = [0,0,0] 
       continue 

が、あなたのアイデアを得る:問題は2つのネストされたループを有する画像を反復することはあまりにも遅いことです。問題は、i7で672x1250で約10秒かかることです。

img[np.where((img > [0,110,0]).all(axis=2))] = [0,0,0] 

そして、それははるかに高速ですが、私は、NPを使用してそれらにif文、他の複数の条件とを行うように見えることはできません。

今、声明そうのような場合、私は簡単に最初に行うことができます。

ここで私が試したものです:

img[np.where((img < [100,0,0]).all(axis=2)) & ((img < [0,0,50]).all(axis=2)) & ((img > [0,80,0]).all(axis=2))] = [0,0,0] 

しかし、エラーがスローされます。

ValueError: operands could not be broadcast together with shapes (2,0) (1250,672) 

任意のアイデアが適切にnp.where(または2よりも高速だものを使用して画像を反復処理する方法ネストされたループ)は多くの助けになります!

+0

色に基づいて画像のしきい値を設定しようとしています。これをHSV色空間に変換して処理すると、はるかに簡単になります。 "これは約10秒かかります" - はい、あなたはインタプリタ言語の個々のピクセルを繰り返しています。 –

答えて

4

あなたはこのように(np.whereなし)の条件を表現することができます:using_loop(img)が質問に投稿された二重ループを実行

import numpy as np 
img = np.random.randint(255, size=(4,4,3)) 
blue, green, red = img[..., 0], img[..., 1], img[..., 2] 
img[(green > 110) | ((blue < 100) & (red < 50) & (green > 80))] = [0,0,0] 

In [229]: %%timeit img = np.random.randint(255, size=(672,1250,3)) 
    .....: blue, green, red = img[..., 0], img[..., 1], img[..., 2] 
    .....: img[(green > 110) | ((blue < 100) & (red < 50) & (green > 80))] = [0,0,0] 
    .....: 
100 loops, best of 3: 14.9 ms per loop 

In [240]: %%timeit img = np.random.randint(255, size=(672,1250,3)) 
    .....: using_loop(img) 
    .....: 
1 loop, best of 3: 1.39 s per loop 

+0

華麗で完璧に動作します!ありがとうございました! – tihomirbz

関連する問題