Многочисленные вызовы с пустыми местами дают странные результаты - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь создать 8-битную 1-канальную маску, используемую для некоторых операций с изображениями.У меня есть изображение, в котором некоторые пиксели заполнены fuscia (255, 0, 255) на изображении original, что указывает на то, что пиксель следует использовать в маскировании.

Моя идея состоит в том, чтобы просто скопировать исходное изображение, а затем заменитьвсе пиксели fuscia с белым, и все пиксели не-fuscia с черным.Я использую numpy.place для этого.Однако, похоже, что он действительно «применяет» только последнюю place операцию.

Например, в приведенном ниже коде я пытаюсь сначала установить для всех пикселей fuscia белый, а затем для всех-фуция пикселей на черный.Тем не менее, когда я иду и сохраняю изображение и смотрю на него, только пиксели не-fuscia стали черными.

mask = original.copy()
np.place(mask, mask == (255, 0, 255), (255, 255, 255))
np.place(mask, mask != (255, 0, 255), (0, 0, 0))
mask = mask.reshape((h, w, 3))
mask = cv2.cvtColor(mask, cv2.COLOR_RGB2GRAY)

original

enter image description here

mask

enter image description here

Я ожидаю, что область fuscia будет белой, но это не так.Это полутоновая версия цвета fuscia (112, 112, 112)

Я довольно новичок в numpy, так что, возможно, я даже лаю не на том дереве, и может быть более простой способ сделать это.Что я делаю неправильно?Есть ли более простой способ сделать то, что я описываю?Спасибо!

1 Ответ

1 голос
/ 04 мая 2019

Похоже, вы можете использовать логический массив в качестве маски. Например:

mask = np.any(original==[255, 0, 255], axis=-1)

Теперь вы можете сделать original[mask], чтобы получить только пурпурные пиксели, или orignal[~mask], чтобы получить другие.

Вы обнаружите, что не можете перезаписать original, но вы можете перезаписать копию:

newimg = original.copy()
newimg[mask] = [255, 255, 255]
newimg[~mask] = [0, 0, 0]

Кстати, я думаю, что вы "должны" использовать маскированные массивы для такого рода вещей, но я никогда не справлялся с ними.

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