JSON2Mask

import json
from PIL import Image
from PIL import ImageDraw
import PIL
import os
import numpy as np
from labelme import utils
import imgviz
import yaml


jsonfolder = './JSON/'
out_folder = 'labelme_json'

jsonfiles = os.listdir(jsonfolder)
for jsonfile in jsonfiles:
	name, ext = os.path.splitext(jsonfile)
	if ext != '.json':
		continue

	out_dir = os.path.join(out_folder, name)
	if not os.path.exists(out_dir):
		os.makedirs(out_dir)
	
	with open(jsonfolder + jsonfile,'r') as jf:
		labels = json.load(jf)
		shapes = labels['shapes']

		imageData = labels.get('imageData')

		# print(imageData.shape)
		img = utils.img_b64_to_arr(imageData)
		# print(img.shape)


		img_shape = img.shape
		# print('img_shape:', img_shape)

		ins_mask = np.zeros(img_shape[:2], dtype=np.uint8)
		ins_mask = PIL.Image.fromarray(ins_mask)
		label_names = ['__background__']
		
		objects = {}
		
		for j, region in enumerate(shapes):
			points = region['points']
			label_name = region['label']

			if label_name not in objects:
				objects[label_name] = []
				
			objects[label_name].append(points)

		j = 0
		for label_name, points_list in objects.items():
			for points in points_list:
				xy = [tuple(point) for point in points]
				draw = ImageDraw.Draw(ins_mask)
				draw.polygon(xy, outline=j+1, fill=j+1)
			label_names.append(label_name)
			j+=1

		lbl = np.array(ins_mask)

		save_img = PIL.Image.fromarray(img)

		# save_lbl = PIL.Image.fromarray(lbl)


		if img_shape[0] != 512 or img_shape[1] != 512:
			save_img = save_img.resize((512,512))
			# save_lbl = lbl.resize((512,512))
			lbl.reshpe(512,512)

		# PIL.Image.fromarray(img).save(os.path.join(out_dir, "img.png"))
		save_img.save(os.path.join(out_dir, "img.png"))

		utils.lblsave(os.path.join(out_dir, "label.png"), lbl)

		# with Image.open(filename) as image:

		# lbl_viz = imgviz.label2rgb(label=lbl, img=imgviz.asgray(img), label_names=label_names, loc="rb")
		# PIL.Image.fromarray(lbl_viz).save(os.path.join(out_dir, "label_viz.png"))

		with open(os.path.join(out_dir, "label_names.txt"), "w") as f:
			for lbl_name in label_names:
				f.write(lbl_name + "\n")

		info = dict(label_names = label_names)
		with open(out_dir + '/info.yaml','w') as f:
			yaml.safe_dump(info, f, default_flow_style=False)
	

 

### 将 Mask 转换为 JSON 格式的解决方案 #### 方法概述 将掩码(Mask)转换为 JSON 文件的过程通常涉及以下几个方面:解析图像中的像素数据,将其转化为几何形状(如多边形),并将这些形状存储到 JSON 结构中。这一过程可以通过编程实现,也可以借助现有的开源工具完成。 --- #### 使用 Python 实现 MaskJSON 的转换 以下是通过 Python 编程的方式实现此功能的一个示例: ```python import cv2 import numpy as np import json from shapely.geometry import Polygon def mask_to_polygon(mask, tolerance=1): """ 将二值掩码转换为多边形表示形式。 参数: mask (numpy.ndarray): 输入的二值掩码图像。 tolerance (float): Douglas-Peucker 算法的近似容忍度。 返回: list: 多边形坐标列表。 """ contours, _ = cv2.findContours(mask.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contours = sum(contours, []) polygon = Polygon(contours).simplify(tolerance) if not polygon.is_empty and isinstance(polygon, Polygon): return [[int(x), int(y)] for x, y in list(polygon.exterior.coords)] return [] def convert_mask_to_json(image_path, output_path="output.json"): """ 将掩码图像转换为 LabelMe 格式的 JSON 文件。 参数: image_path (str): 掩码图像路径。 output_path (str): 输出 JSON 文件路径。 """ # 加载掩码图像 mask_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) height, width = mask_image.shape[:2] # 获取唯一的标签类别 unique_labels = np.unique(mask_image)[1:] # 去掉背景类别的 0 shapes = [] for label in unique_labels: binary_mask = (mask_image == label).astype(np.uint8) polygons = mask_to_polygon(binary_mask, tolerance=1) shape_data = { "label": f"class_{label}", # 自定义类别名称 "points": polygons, "group_id": None, "shape_type": "polygon", "flags": {} } shapes.append(shape_data) data = { "version": "4.5.7", # LabelMe 版本号 "flags": {}, "shapes": shapes, "imagePath": image_path.split("/")[-1], "imageData": None, "imageHeight": height, "imageWidth": width } with open(output_path, 'w') as f: json.dump(data, f, indent=2) # 示例调用 convert_mask_to_json("example_mask.png", "converted_output.json") ``` 上述代码实现了从掩码图像到 JSON 数据结构的转换[^1]。它利用 OpenCV 提取轮廓,并使用 Shapely 库简化多边形表示。 --- #### 工具推荐 除了手动编写脚本外,还可以考虑以下工具或库来加速开发流程: 1. **LabelMe**: 这是一个广泛使用的标注工具,支持导入和导出 JSON 和 PNG 掩码文件。可以尝试逆向操作,即加载已有的掩码文件并保存为 JSON 格式。 2. **COCO Tools**: COCO 数据集提供了丰富的 API 来处理分割掩码和 JSON 文件之间的相互转换。`pycocotools` 是一个常用的 Python 库,能够帮助快速实现此类需求。 3. **VIA (Visual Image Annotator)**: VIA 支持多种格式的数据交换,包括从掩码生成 JSON 注解文件的功能。 --- #### 注意事项 - 如果掩码非常复杂或者包含多个对象实例,则需要额外逻辑区分不同实例。 - 对于高分辨率图像,可能需要调整 `tolerance` 参数以平衡精度与性能。 - 上述方法假设输入掩码是单通道灰度图;如果是 RGB 图像,则需先进行预处理。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值