Как сохранить 2d массив значений, сгенерированный semanti c -segmenetaion как изображение? - PullRequest
0 голосов
/ 30 апреля 2020

Когда изображение задается в качестве входных данных для модели сегментации c, его вывод представляет собой двумерный массив значений. Каждое значение в этом массиве представляет объект, который, по мнению модели, присутствует в этой позиции исходного изображения. Массив выглядит примерно так:

print(image_mask)

array([[2, 2, 2, ..., 7, 7, 7],
       [2, 2, 2, ..., 7, 7, 7],
       [2, 2, 2, ..., 7, 7, 7],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]])

Когда кто-то отображает это как изображение, используя matplotlib, он добавляет ложные цвета и создает изображение:

plt.imshow(image_mask)

enter image description here

Построение этого массива поверх изображения приводит к маске, похожей на аффект:

plt.subplot(1,2,1)
plt.imshow(image, 'gray', interpolation='none')
plt.subplot(1,2,2)
plt.imshow(image, 'gray', interpolation='none')
plt.imshow(image_mask, 'jet', interpolation='none', alpha=0.7)
plt.show()

enter image description here

Теперь моя цель использовать маску, созданную моделью, для извлечения людей из изображения. Сначала я думал, что image_mask - это 3-канальное RGB-изображение, и пытался сделать желтый на изображении белым, а фон - черным, что-то вроде этого:

image_mask[np.where((image_mask==[253,231,36]).all())] = [255,255,255] # MAKE YELLOW WHITE
image_mask[np.where((image_mask==[68,1,84]).all())] = [0,0,0] # MAKE BACKGROUND BLACK
result = cv2.bitwise_and(image,image,mask = image_mask) # DO BITWISE AND WITH THE ORIGINAL TO GET THE PEOPLE

Но вскоре я понял это не будет возможно, так как image_mask не изображение. Что мне теперь делать? Есть ли способ конвертировать этот массив в изображение? Или cv2 предлагает какой-то метод, чтобы помочь в этом сценарии?

1 Ответ

0 голосов
/ 30 апреля 2020

Понял!

Я использовал матричное умножение вместе с np.expand_dims:

image_mask_copy = image_mask.copy()
np.place(image_mask_copy,image_mask_copy!=15,[0]) # REMOVE ALL EXCEPT PEOPLE, == 0
np.place(image_mask_copy,image_mask_copy==15,[255]) # MAKE PEOPLE == 255
plt.imshow(image_mask_copy)

enter image description here


new_image_mask = np.expand_dims(image_mask_copy,-1)*np.ones((1,1,3))
plt.imshow(new_image_mask)

enter image description here

Теперь это изображение.

...