Мой подход заключается в создании маскированного массива numpy и его надстройки на изображении оттенков серого. Замаскированные значения по умолчанию имеют непрозрачность 0, делая их невидимыми и, таким образом, отображая изображение в шкале серого.
im = np.array([[2, 3, 2], [3, 4, 1], [6, 1, 5]])
mask = np.array([[False, False, True], [False, True, True], [False, False, False]])
# note that the mask is inverted (~) to show color where mask equals true
im_ma = np.ma.array(im, mask=~mask)
# some default keywords for imshow
kwargs = {'interpolation': 'none', 'vmin': im.min(), 'vmax': im.max()}
fig, ax = plt.subplots(1,3, figsize=(10,5), subplot_kw={'xticks': [], 'yticks': []})
ax[0].set_title('"Original" data')
ax[0].imshow(im, cmap=plt.cm.Greys_r, **kwargs)
ax[1].set_title('Mask')
ax[1].imshow(mask, cmap=plt.cm.binary, interpolation='none')
ax[2].set_title('Masked data in color (jet)')
ax[2].imshow(im, cmap=plt.cm.Greys_r, **kwargs)
ax[2].imshow(im_ma, cmap=plt.cm.jet, **kwargs)
Если вы не указать значение vmax
и vmin
для imshow
, палитра будет растягиваться до минимального и максимального из немаскированных частей массива. Таким образом, чтобы получить сопоставимую комбинацию цветов, используйте min и max из массива без маскирования до imshow
.
Его очень легко с Matplotlib, у вас есть образец изображения и маска? –
Давайте просто скажем этот сокращенный случай (поскольку мое изображение ~ 1000x1000 пикселей): 'im = np.array ([[2, 3, 2], [3, 4, 1], [6, 1, 5]]) ; mask = np.array ([[False, False, True], [False, True, True], [False, False, False]]) ' – oschoudhury