将RGB白色设置为透明?

Set RGB white to transparent?

我有一个图像,我使用 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 颜色不兼容的缩放器。

要获得所需的掩码输出,您可以这样做 -

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]))

我认为,要走的路是创建一个 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 之间的浮点数而不是整数,但我想两者都是有效的]

一个选择是构造一个 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。