выбор пикселей изображения RGB, удовлетворяющих нескольким условиям в numpy - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь выполнить обработку видео, и я хочу иметь возможность эффективно получить все пиксели с красным цветом выше 100, зеленым цветом ниже 100 и синим цветом ниже 100. Мне удалось сделать это с помощью цикла for и выполнить 3 оценки на каждый пиксель, но это было слишком медленно и занимало 13 секунд на кадр. В настоящее время я использую cv2, чтобы получить изображение, и код обработки

retval = np.delete(frame, (0, 1), 2) #extracts just red of the pixels
retval = np.argwhere(retval>100) #extracts where red is above 100
retval = np.delete(retval, 2, 1) #removes the actual color value, leaving it as coordinates

Это оставляет мне частичное решение для всего, что имеет значение красного выше 100, но оно также включает в себя такие вещи, как коричневый и белый, что не является идеальным. Этот цикл должен произойти очень быстро, поэтому я хочу использовать numpy, но я не уверен, какие команды использовать. Любая помощь будет принята с благодарностью. массив "frame" структурирован таким образом и имеет формат BGR, а не RGB. первый индекс - это координата x, второй - координата y, а третий - 0, 1 или 2, что соответствует синему, зеленому и красному.

[[[255,   0,   0],
  [255,   0,   0],
  [255,   0,   0],
  ...,
  [  8,  20,   8],
  [ 12,  15,  20],
  [ 16,  14,  26]],

  [[255,   0,   0],
  [ 37,  27,  20],
  [ 45,  36,  32],
  ...,
  [177, 187, 157],
  [180, 192, 164],
  [182, 193, 167]]]

1 Ответ

0 голосов
/ 05 сентября 2018

Попробуйте, сделав три логические маски, по одной для каждого условия, а затем объедините их с np.logical_and

im = #define the image suitably 
mask = np.logical_and.reduce((im[:,:,0]<100,im[:,:,1]<100,im[:,:,2]>100))
im[mask] # returns all pixels satisfying these conditions

Это быстро. Он основан на двух уникальных способностях: трансляция и маскировка. Вы можете и должны прочитать об этом в простой документации. Вам нужны только циклы для относительно сложных задач.

редактировать:

если вы хотите индексы пикселей, выполните

i,j = np.where(mask)

Тогда значения пикселей равны

im[i,j] 
...