маскированное изображение RGB не отображается в маске с помощью imshow - PullRequest
2 голосов
/ 06 марта 2020

Я заметил, что отображение маскированного изображения RGB не работает так, как я ожидал, то есть результирующее изображение не маскируется при отображении. Это нормально, есть ли обходной путь?

Пример ниже показывает наблюдаемое поведение:

import numpy as np
from matplotlib import pyplot as plt

img=np.random.normal(0,10,(20,20)) # create a random image
mask=img>0
ma_img=np.ma.masked_where(mask, img) # create a masked image

img_rgb=np.random.uniform(0,1,(20,20,3)) # create a randomRGB image
mask_rgb=np.broadcast_to(mask[...,np.newaxis],img_rgb.shape) # extend the mask so that it matches the RGB image shape
ma_img_rgb=np.ma.masked_where(mask_rgb, img_rgb) # create a masked RGB image

## Display:
fig, ax=plt.subplots(2,2)
ax[0,0].imshow(img)
ax[0,0].set_title('Image')
ax[0,1].imshow(ma_img)
ax[0,1].set_title('Masked Image')
ax[1,0].imshow(img_rgb)
ax[1,0].set_title('RGB Image')
ax[1,1].imshow(ma_img_rgb)
ax[1,1].set_title('Masked RGB Image')

enter image description here

Интересно, когда мышь пропускает маскированные пиксели в маскированном изображении RBG, значение пикселя не отображается в правом нижнем углу окна рисунка.

1 Ответ

1 голос
/ 06 марта 2020

Кажется, маска игнорируется для массивов RGB, см. Также этот вопрос .

Из do c вход для imshow() может быть :

  • (M, N): изображение со скалярными данными. Значения сопоставляются с цветами с использованием нормализации и карты цветов. См. Параметры норма, cmap, vmin, vmax.
  • (M, N, 3): изображение со значениями RGB (0-1 с плавающей запятой или 0-255 int).
  • (M, N, 4): изображение со значениями RGBA (0-1 с плавающей запятой или 0-255 int), то есть с прозрачностью.

Поэтому одним из вариантов будет использование ~mask в качестве alpha значения для массива rgb:

img_rgb = np.random.uniform(0, 1, (20, 20, 3))
ma_img_rgb = np.concatenate([img_rgb, ~mask[:, :, np.newaxis]], axis=-1)
# ma_img_rgb = np.dstack([img_rgb, ~mask])  # Jan Kuiken
...