Массив Python с несколькими условиями для итерации по изображению
Я фильтрую некоторые изображения, чтобы удалить ненужный фон, и до сих пор был наиболее успешным при проверке значений BGR пикселей (с использованием openCV). Проблема в том, что перебор изображения с двумя вложенными циклами слишком медленный:
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
Есть еще пара похожих if-утверждений, но вы поняли идею. Проблема в том, что на 672x1250 на i7 это занимает около 10 секунд.
Теперь я легко могу сделать первое утверждение if следующим образом:
img[np.where((img > [0,110,0]).all(axis=2))] = [0,0,0]
И это намного быстрее, но я не могу выполнить другие операторы if с несколькими условиями, используя np.where.
Вот что я попробовал:
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-х вложенного цикла), очень помогут!