将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。
我有一个图像,我使用 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。