如何用numpy

时间:2017-06-26 02:10:36

标签: python numpy scikit-image

我试图用numpy屏蔽3D数组(RGB图像)。

然而,我目前的方法是重塑遮罩阵列(下面的输出)。 我试图遵循SciKit-Image速成课程中描述的方法。 Crash Course

我查看了Stackoverflow并提出了类似的问题,但没有接受答案(similar question here)

完成这样的掩蔽的最佳方法是什么?

这是我的尝试:

# 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()

2 个答案:

答案 0 :(得分:3)

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

image masking

答案 1 :(得分:1)

在找到维度HERE丢失的以下帖子后,我找到了一个使用numpy.where的解决方案:

masked_array = np.where(mask==1, a , 0)

这似乎运作良好。