Каков самый pythoni c способ создания логической маски изображения RGB на основе цвета пикселей? - PullRequest
5 голосов
/ 22 января 2020

У меня есть изображение с отсутствующей частью, которое, как я знаю, было окрашено в зеленый цвет (первое изображение). Какой самый питонный c способ генерировать другое «логическое» изображение, которое показывает белый цвет для отсутствующих частей и черный цвет для отсутствующих частей (второе изображение)?

Image with missing part coloured in green Image that shows the missing part (mask) in white, and the rest in black

Возможно ли сделать это без for-l oop, но только с нарезкой массива?

Мое изображение - numpy массив формы [height, width, 3]. Я хотел бы, чтобы следующий код назначил двумерный массив логических значений, показывающих, является ли значение каждого пикселя зеленым ([0, 255, 0]) или нет.

mask = image[:, :] == [0, 255, 0]

Однако он возвращает массив того же самого форма как изображение ([height, width, 3]), показывающая, являются ли красные, зеленые или синие значения пикселей равными 0, 255 или 0 соответственно. Могу ли я как-то здесь использовать any() или all() метод?

Ответы [ 2 ]

5 голосов
/ 22 января 2020

У вас есть правильная идея здесь. Вещи, которые нужно использовать, будут numpy alltrue:

mask = np.alltrue(image == [0, 255, 0], axis=2)

1 голос
/ 23 января 2020

Идея состоит в том, чтобы создать пустую маску, используя np.zeros, а затем покрасить пиксели в белый цвет, где пиксели входного изображения будут зелеными с np.where. Полученная маска должна иметь тип ndarray.

import cv2
import numpy as np

# Load image, create blank black mask, and color mask pixels 
# white where input image pixels are green
image = cv2.imread('1.png')
mask = np.zeros(image.shape, dtype=np.uint8)
mask[np.where((image == [0,255,0]).all(axis=2))] = [255,255,255]

cv2.imshow('mask', mask)
cv2.waitKey()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...