我使用matplotlib.pyplot.imread
加载到python中的图像最终为包含rgb值数组的numpy
数组。这是一个虚拟片段,除了两个像素白色外都有:
>>> test
array([[[255, 255, 255],
[255, 255, 255]],
[[ 1, 255, 255],
[255, 255, 255]],
[[255, 255, 255],
[255, 6, 255]]], dtype=uint8)
我想在所有白色像素中创建一个遮罩。我想我可以做类似的事情
>>> mask = (test != [255, 255, 255])
会给出:
array([[[False, False, False],
[False, False, False]],
[[ True, True, True],
[False, False, False]],
[[False, False, False],
[ True, True, True]]], dtype=bool)
我该怎么做?
或者,我认为imshow
有一个输入参数来执行此操作,但文档不清楚如何。似乎alpha
会改变整个图像,而vmax
会接受一个看似与RGB颜色不兼容的缩放器。
答案 0 :(得分:1)
一种选择是构建masked array,然后构建imshow
:
import numpy as np
from matplotlib import pyplot as plt
x = np.array([[[255, 255, 255],
[255, 255, 255]],
[[ 1, 255, 255],
[255, 255, 255]],
[[255, 255, 255],
[255, 6, 255]]], dtype=np.uint8)
mask = np.all(x == 255, axis=2, keepdims=True)
# broadcast the mask against the array to make the dimensions the same
x, mask = np.broadcast_arrays(x, mask)
# construct a masked array
mx = np.ma.masked_array(x, mask)
plt.imshow(mx)
屏蔽值将呈现透明。
另一个选择是将RGB数组转换为RGBA数组,只要红色,绿色和蓝色通道都等于255,alpha通道就设置为零。
alpha = ~np.all(x == 255, axis=2) * 255
rgba = np.dstack((x, alpha)).astype(np.uint8)
plt.imshow(rgba)
请注意,我必须在连接后将rgba
强制转换回uint8,因为imshow
期望RGBA数组为uint8或float。
答案 1 :(得分:0)
要获得所需的遮罩输出,您可以执行以下操作 -
wpix = np.array([255,255,255])
out = np.tile(np.atleast_3d(np.any(test != wpix,axis=2)),(1,1,test.shape[2]))
或者,由于白色像素全部为255's
,因此您也可以这样做 -
out = np.tile(np.atleast_3d(np.any(test != 255,axis=2)),(1,1,test.shape[2]))
答案 2 :(得分:-2)
我认为,要做的就是创建一个RGBA数组并将其输入到imgshow。
您想获得
mask = array([[[False],[False]],[[True],[False]],[[False],[True]]]]
然后:
alphaChannel = 255*mask;
img = np.concatenate((test,alphaChannel), axis=2);
plt.imshow(img);
很抱歉没有测试它,也没有给出计算掩码的方法。
[注意:对我来说,matplotlib始终使用0到1之间的浮点而不是整数,但我猜两者都有效]