1:需求
对于一些分割网络,需要使用到二值化的掩膜。但是制作的数据集(非公开数据集)的图像的标注是图像里物体的多边形边界。
比如:


已有的是原图和标注过的边缘(json格式的文件),想要生成下面这种二值化的掩膜。

当然,实际的情况是一张图里不止一个物体,可能有几十个。
2:思路
刚开始我的想法是暴力,遍历每一个像素,之后判断该像素是否在某一个物体的边界内,如果是,就把像素变成白色,如果不是,就变成黑色。
但是这种做法十分复杂,一来要遍历每一个像素,而二来要判断该像素是否在物体边缘内(可能有好几十个物体),而且物体边缘是不规则的多边形。这样下来,光判断每像素是否在物体边界内就很麻烦了。
直到我想到了换一种思路:能否找到提取图片不规则多边形区域的方法。如果有,那么会很大的简化整个流程。
果然,网上有这个方法:使用Python/PIL裁剪多边形
代码如下:
import numpy
from PIL import Image, ImageDraw
# read image as RGB and add alpha (transparency)
im = Image.open("crop.jpg").convert("RGBA")
# convert to numpy (for convenience)
imArray = numpy.asarray(im)
# create mask
polygon = [(444,203),(623,243),(691,177),(581,26),(482,42)] # 多边形的点坐标
maskIm = Image.new('L', (imArray.shape[1], imArray.shape[0]), 0)
ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1)
mask = numpy.array(maskIm)
# assemble new image (uint8: 0-255)
newImArray = numpy.empty(imArray.shape,dtype='uint8')
# colors (three first columns, RGB)
newImArray[:,:,:3] = imArray[:,:,:3]
# transparency (4th column)
newImArray[:,:,3] = ma

这篇博客介绍了如何利用Python和PIL库从图像的多边形边界创建二值化掩膜。首先,通过遍历像素并判断是否在多边形内来暴力实现,然后发现可以使用`ImageDraw`的`polygon`函数高效地裁剪多边形区域。通过循环遍历所有物体的多边形,生成了包含多个物体的掩膜。最终提供了一个完整的代码示例,从JSON文件读取多边形数据并生成掩膜图片。
最低0.47元/天 解锁文章
295

被折叠的 条评论
为什么被折叠?



