我有一个像Mask a 3d array with a 2d mask in numpy这样的问题,但是那个答案对我的问题不起作用;我试图获取基于2D掩模选择的RGB图像的元素。我在要保留的元素上创建了值为1的2d掩码,其余为0.然后我想将此掩码应用于RGB图像数组,并且只想为与掩码值匹配的元素保留值1.我尝试了这个代码,然后轰炸了。如何根据遮罩位置选择像素(及其值)。基于链接中的解决方案的我的轰炸代码如下。
import numpy as np
from PIL import Image, ImageDraw
polygon = [(5,5), (10,5), (15,15), (2,15)]
width = 20
height = 20
# create a mask
img = Image.new('L', (width, height), 0)
ImageDraw.Draw(img).polygon(polygon, outline=1, fill=1)
mask = np.array(img)
mask = mask[:,:,np.newaxis]
a_arr = np.arange(1200).reshape(20,20,3) # create a test image type array
o_arr = np.ma.array(a_arr, mask=mask)
print o_arr
答案 0 :(得分:0)
为什么不从掩码中创建一个布尔数组,并根据该数组索引图像。像这样:
import numpy as np
from PIL import Image, ImageDraw
polygon = [(5,5), (10,5), (15,15), (2,15)]
width = 20
height = 20
# create a mask
img = Image.new('L', (width, height), 0)
ImageDraw.Draw(img).polygon(polygon, outline=1, fill=1)
mask = np.array(img)
b_mask = mask.astype(bool)
a_arr = np.arange(1200).reshape(20,20,3)
o_arr = a_arr[b_mask]
print(o_arr)
根据您的评论,您是否尝试过沿第三维堆叠蒙版?
而不是mask = mask[:, :, np.newaxis]
使用mask = np.dstack((mask, mask, mask))