Замените все пиксели в массиве numpy пикселями в отдельном массиве, если значение не равно 0

Есть изображение opencv, которое я разделил на 3 канала:

 image #opencv image

 img_red = image[:, :, 2]
 img_green = image[:, :, 1]
 img_blue = image[:, :, 0]

Далее три фильтра:

red_filter
green_filter
blue_filter

Все они представляют собой пустые массивы, но в основном заполнены нулями, поэтому формат выглядит примерно так:

[0, 0, 0, 132, ... 0, 15,   0, 230, 0]
               ...                   
[32, 0, 5, 0,  ... 0,  2, 150,   0, 0]

Я хотел бы использовать каждое ненулевое значение в этих фильтрах, чтобы перезаписать один и тот же индекс в каналах.

Что-то вроде этого:

img_red[index] = red_filter[index] if red_filter != 0
img_green[index] = green_filter[index] if green_filter != 0
img_blue[index] = blue_filter[index] if blue_filter != 0
final_img = cv2.merge(img_red, img_green, img_blue)

Например, если бы канал выглядел так:

[44, 225, 43, ... 24, 76, 56]

И фильтр:

[0,   0, 25   ... 2,   0, 91]

Тогда результат должен быть:

[44, 225, 25 ...  2,  76, 91]

Я пытался использовать циклы for и списки, но этот код нужно было бы запускать для каждого кадра в видео, поэтому мне интересно, есть ли более быстрый способ добиться того же результата.

Есть ли какая-то фильтрация изображений в opencv или операция numpy, которая эффективно выполняла бы этот процесс?


person Josh    schedule 24.10.2020    source источник


Ответы (1)


Кажется, вы ищете метод np.where:

channel = np.array([44, 225, 43, 24, 76, 56])
filter = np.array([0,   0, 25, 2,   0, 91])
#result = np.array([44, 225, 25, 2,  76, 91])
>>> np.where(filter==0, channel, filter)
array([ 44, 225,  25,   2,  76,  91])
person mathfux    schedule 24.10.2020