Python 使用numpy遮罩阵列和imshow绘制分割的彩色图像

Python 使用numpy遮罩阵列和imshow绘制分割的彩色图像,python,numpy,matplotlib,masked-array,Python,Numpy,Matplotlib,Masked Array,我对numpy的蒙版数组数据结构不熟悉,我想用它来处理分割的彩色图像 当我使用matplotlib的plt.imshow(蒙版灰色图像,“灰色”)显示蒙版灰色图像时,无效区域将显示为透明,这正是我想要的。 然而,当我对彩色图像做同样的操作时,它似乎不起作用。 有趣的是,数据点光标不会显示rgb值[r,g,b],而是显示为空[],但仍然显示颜色值,而不是透明的 我是做错了什么,还是matplotlibimshow中还没有提供 将numpy导入为np 将matplotlib.pyplot作为plt导

我对numpy的蒙版数组数据结构不熟悉,我想用它来处理分割的彩色图像

当我使用matplotlib的
plt.imshow(蒙版灰色图像,“灰色”)
显示蒙版灰色图像时,无效区域将显示为透明,这正是我想要的。 然而,当我对彩色图像做同样的操作时,它似乎不起作用。 有趣的是,数据点光标不会显示rgb值
[r,g,b]
,而是显示为空
[]
,但仍然显示颜色值,而不是透明的

我是做错了什么,还是matplotlib
imshow
中还没有提供

将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.misc导入面
img_col=face()#来自scipy的示例图像
img_gray=np.dot(img_col[…,:3],[0.299,0.587,0.114])#转换为灰色
阈值=25
mask2D=img_灰度<阈值#一些示例性掩模
mask3D=np.至少3d(mask2D)*np.类似于(img_col)#通过广播扩展到3d。。。
#使用numpy的掩码数组指定数据的有效位置
m_img_gray=np.ma.masked_其中(mask2D,img_gray)
m_img_col=np.ma.masked_其中(mask3D,img_col)
图,轴=plt.子批次(1,4,num=2,clear=True)
轴[0].imshow(mask2D.astype(np.float32))#打印掩码
轴[0]。设置标题(“简单遮罩”)
轴[1].imshow(m_img_gray,“gray”)#plot gray verison=>works
轴[1]。设置标题(“(作品)\n蒙版灰色”)
轴[2]。imshow(m_img_col)#打印颜色版本,=>不工作
轴[2]。设置标题(“不工作)\n蒙版颜色”)
#手动添加遮罩作为alpha通道以显示所需内容
轴[3].imshow(np.append(m_img_col.data,255*(1-(0
下面是一个示例图像:

[更新]:
为提高清晰度,对代码和图像进行了一些小改动…

我不知道这是否是matplotlib尚未提供的功能,但您可以 只要将掩码为True时的所有值设置为255:

m_img_col.data[m_img_col.mask]=255

这样无效区域将显示为透明

无法解决您的问题,但1)您的遮罩无法正常广播。如果您使用
np.unique(m\u img\u col.mask.sum(-1))
您将看到有1个或2个通道被屏蔽的像素,这应该是不正确的。尝试
m\u img\u col=np.ma.masked\u其中(np.broadcast\u to(mask2D[…,None],img.shape)*img,img)
。2) 对于RGB,您可能无法执行相同的操作,因为屏蔽一个像素意味着屏蔽3个值,而不是1个值。在这一点上,使用RGBA更加实用和安全(感谢您提供的信息…这个简单示例中的问题是np.ma.masked_where中的掩码生成。我不应该与图像相乘,因为它也可以是0。因此这是一个正确的版本:m_img_col=np.ma.masked_where(np.atleast_3d(mask2D)*np.ones_)(img,img)无论如何,在我的实际应用程序中,我已经提供了遮罩,所以这不是问题,但感谢您发现:)这种方法不是透明的,只是用白色填充遮罩军团。张贴图中的白色部分只是白色背景的颜色。