使用蒙版从图像中选择RGB图像像素

时间:2017-10-20 20:43:54

标签: python image numpy

我有一个像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

1 个答案:

答案 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))