如何从含填充圆形多边形的JSON文件生成对应掩码图像
自定义多边形标注JSON适配掩码生成方法
格式差异说明
现有LabelMe格式转掩码函数要求输入的多边形结构满足:
- 多边形列表存储在字典的
shapes字段 - 列表内每个元素是字典,通过
points键存储坐标点,坐标格式为[[x,y], [x,y], ...]的嵌套数值列表
你的f90.json存储结构差异:
- 多边形列表存储在
polygons字段 - 每个多边形是字符串格式:点之间用空格分隔,单个点的x、y坐标用逗号分隔,没有预解析为数值结构
只需要先把字符串格式的坐标解析为LabelMe函数要求的结构,就能直接复用现有代码生成掩码。
具体实现代码
保留你已有的掩码生成函数,新增JSON解析逻辑即可,完整代码如下:
import json import numpy as np from PIL import Image, ImageDraw import matplotlib.pyplot as plt # 原有LabelMe格式多边形转掩码函数,无需修改 def polygons_to_mask_array_labelme(polygons, width : int = 300, height : int = 300) -> np.ndarray: ''' 输入多边形列表生成二值掩码 入参polygons格式要求:每个元素为字典,包含points键存储[[x,y],...]格式的坐标点 ''' img = Image.new('L', (width, height), 0) for polygon in polygons: nested_lst_of_tuples = [tuple(l) for l in polygon['points']] try: ImageDraw.Draw(img).polygon(nested_lst_of_tuples, outline=1, fill=1) except: print(nested_lst_of_tuples) mask = np.array(img) return mask # --------------- f90.json格式解析逻辑 --------------- with open('f90.json', encoding='utf-8') as f: raw_data = json.load(f) # 把字符串格式的多边形转换为LabelMe兼容的结构 parsed_polygons = [] for poly_str in raw_data['polygons']: # 按空格拆分得到每个点的字符串 point_str_list = poly_str.split(' ') points = [] for point_str in point_str_list: # 按逗号拆分x、y,转成浮点数 x, y = point_str.split(',') points.append([float(x), float(y)]) # 组装成原有函数要求的字典格式 parsed_polygons.append({'points': points}) # 调用原有函数生成掩码,注意替换为对应图像的实际宽高 # 示例中根据给出的坐标最大值设置宽600、高400,可根据实际情况调整 mask = polygons_to_mask_array_labelme(parsed_polygons, width=600, height=400) # 可视化查看结果 plt.imshow(mask, cmap='gray') plt.show() # 保存掩码可取消下方注释 # Image.fromarray(mask*255).save('mask.png')
注意事项
- 代码里的
width和height参数需要替换为对应原图的实际尺寸,否则生成的掩码会和原图位置不匹配 - 解析逻辑自动处理了浮点型坐标,PIL的绘制接口原生支持浮点坐标输入,不需要额外转整数
- 如果JSON后续新增其他字段,只需要调整对应字段读取逻辑即可,掩码生成核心函数不需要修改
内容的提问来源于stack exchange,提问作者user18115377
相关产品推荐
相关产品推荐

