如何使用 numpy 正确屏蔽 3D 数组
How to Correctly mask 3D Array with numpy
我正在尝试使用 numpy 屏蔽 3D 阵列(RGB 图像)。
但是,我目前的方法是重塑掩码数组(下面的输出)。
我尝试遵循 SciKit-Image 速成课程中描述的方法。
Crash Course
我查看了 Whosebug 并提出了类似的问题,但没有被接受的答案
像这样完成屏蔽的最佳方法是什么?
这是我的尝试:
# create some random numbers to fill array
tmp = np.random.random((10, 10))
# create a 3D array to be masked
a = np.dstack((tmp, tmp, tmp))
# create a boolean mask of zeros
mask = np.zeros_like(a, bool)
# set a few values in the mask to true
mask[1:5,0,0] = 1
mask[1:5,0,1] = 1
# Try to mask the original array
masked_array = a[:,:,:][mask == 1]
# Check that masked array is still 3D for plotting with imshow
print(a.shape)
(10, 10, 3)
print(mask.shape)
(10, 10, 3)
print(masked_array.shape)
(8,)
# plot original array and masked array, for comparison
plt.imshow(a)
plt.imshow(masked_array)
plt.show()
在找到以下 post 关于尺寸损失 之后,我找到了使用 numpy.where 的解决方案:
masked_array = np.where(mask==1, a , 0)
这看起来效果不错。
NumPy 广播允许您使用与图像形状不同的蒙版。例如,
import numpy as np
import matplotlib.pyplot as plt
# Construct a random 50x50 RGB image
image = np.random.random((50, 50, 3))
# Construct mask according to some condition;
# in this case, select all pixels with a red value > 0.3
mask = image[..., 0] > 0.3
# Set all masked pixels to zero
masked = image.copy()
masked[mask] = 0
# Display original and masked images side-by-side
f, (ax0, ax1) = plt.subplots(1, 2)
ax0.imshow(image)
ax1.imshow(masked)
plt.show()
我正在尝试使用 numpy 屏蔽 3D 阵列(RGB 图像)。
但是,我目前的方法是重塑掩码数组(下面的输出)。 我尝试遵循 SciKit-Image 速成课程中描述的方法。 Crash Course
我查看了 Whosebug 并提出了类似的问题,但没有被接受的答案
像这样完成屏蔽的最佳方法是什么?
这是我的尝试:
# create some random numbers to fill array
tmp = np.random.random((10, 10))
# create a 3D array to be masked
a = np.dstack((tmp, tmp, tmp))
# create a boolean mask of zeros
mask = np.zeros_like(a, bool)
# set a few values in the mask to true
mask[1:5,0,0] = 1
mask[1:5,0,1] = 1
# Try to mask the original array
masked_array = a[:,:,:][mask == 1]
# Check that masked array is still 3D for plotting with imshow
print(a.shape)
(10, 10, 3)
print(mask.shape)
(10, 10, 3)
print(masked_array.shape)
(8,)
# plot original array and masked array, for comparison
plt.imshow(a)
plt.imshow(masked_array)
plt.show()
在找到以下 post 关于尺寸损失
masked_array = np.where(mask==1, a , 0)
这看起来效果不错。
NumPy 广播允许您使用与图像形状不同的蒙版。例如,
import numpy as np
import matplotlib.pyplot as plt
# Construct a random 50x50 RGB image
image = np.random.random((50, 50, 3))
# Construct mask according to some condition;
# in this case, select all pixels with a red value > 0.3
mask = image[..., 0] > 0.3
# Set all masked pixels to zero
masked = image.copy()
masked[mask] = 0
# Display original and masked images side-by-side
f, (ax0, ax1) = plt.subplots(1, 2)
ax0.imshow(image)
ax1.imshow(masked)
plt.show()