将RGB白色设置为透明?

时间:2015-07-12 07:56:13

标签: python numpy matplotlib mask imshow

我使用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颜色不兼容的缩放器。

3 个答案:

答案 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之间的浮点而不是整数,但我猜两者都有效]