Ste*_*ell 2 python numpy mask matplotlib imshow
我有一个图像,我使用matplotlib.pyplot.imread它加载到 python 中,它最终作为一个numpy包含 rgb 值数组的数组。这是一个虚拟片段,除了两个像素之外都是白色的:
>>> test
array([[[255, 255, 255],
[255, 255, 255]],
[[ 1, 255, 255],
[255, 255, 255]],
[[255, 255, 255],
[255, 6, 255]]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
我想为所有白色像素创建一个蒙版。我想我可以做类似的事情
>>> mask = (test != [255, 255, 255])
Run Code Online (Sandbox Code Playgroud)
这会给:
array([[[False, False, False],
[False, False, False]],
[[ True, True, True],
[False, False, False]],
[[False, False, False],
[ True, True, True]]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
或者,我认为有一个输入参数imshow可以执行此操作,但文档不清楚如何执行。它似乎alpha会改变整个图像并vmax接受一个似乎与 RGB 颜色不兼容的缩放器。
一种选择是构造一个掩码数组,然后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)
Run Code Online (Sandbox Code Playgroud)
遮罩的值将呈现透明。
另一种选择是将您的 RGB 数组转换为 RGBA 数组,在红色、绿色和蓝色通道都等于 255 的任何地方将 alpha 通道设置为零。
alpha = ~np.all(x == 255, axis=2) * 255
rgba = np.dstack((x, alpha)).astype(np.uint8)
plt.imshow(rgba)
Run Code Online (Sandbox Code Playgroud)
请注意,我必须rgba在连接后转换回 uint8,因为imshow期望 RGBA 数组是 uint8 或浮点数。