图像分割中mask的保存

博客介绍了图像分割中mask结果的处理步骤。mask结果是N x W x H的tensor,处理时先转成numpy的array,再将N x W x H转为1 x W x H,原理是判断像素得分最高的类别并置为其序号,最后转成Image调色板着色,第一步和第二步可互换,pytorch和numpy有相关计算函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​在图像分割中,最后的输出结果mask结果是一个N x W x H的tensor,其中N表示有多少个类别,W是图像的宽度,H是图像的高度,每一个W x H都是一个二值矩阵

第一步,转成numpy中的array

第二步,N x W x H --> 1 x W x H(W x H),原理就是,对图像中的每一个像素,判断它在哪一类中的得分最高,然后把像素值置为得分最高类的序号。

第三步,转成Image,调色板着色

其中,第一步和第二步可以互换,pytorch和numpy中都有计算第二部的函数

pytorch中,axis是根据哪一维来计算最大值,[1]表示保存索引,[0]是保存数据,后面是转成numpy

torch.max(outpout, axis)[1].cpu().numpy()

numpy.argmax

numpy.argmax(output, axis=0)
palette = [random.randint(0, 255) for x in range(256 * 3)] # 随机颜色的调色板

def colorize_mask(mask):
    # mask: numpy array of the mask
    new_mask = Image.fromarray(mask.astype(np.uint8)).convert('P')
    new_mask.putpalette(palette)

    return new_mask
mask = torch.max(output, 0)[1].cpu().numpy()
mask_img = colorize_mask(mask)
mask_img.save('filepath + feilename')

### 将图像分割结果(Mask)转换为JSON文件 为了实现从mask到JSON文件的转换,通常需要编写一段Python脚本处理此过程。该操作涉及读取mask图像并解析其像素值来构建相应的多边形或边界框表示形式,最终将这些几何对象及其属性序列化至JSON结构中。 #### 使用`mask_to_json.py`工具进行转换 对于批量转换任务,可以直接利用命令行调用专门编写的Python脚本来完成工作: ```bash python mask_to_json.py 输入文件夹或单张mask图片 输出文件夹 ``` 上述指令将会遍历指定目录下的所有mask图像,并将其逐一转换为目标格式——即COCO JSON标注样式的数据集[^1]。 #### Mask转JSON的具体流程 具体来说,在执行转换的过程中涉及到以下几个方面的工作: - **加载mask图像**:通过PIL库或其他方式打开二值化的mask图像; - **提取轮廓信息**:基于OpenCV等计算机视觉库识别前景区域边缘; - **创建JSON结构体**:定义好用于存储各类元数据以及形状描述符的对象模板; - **写入目标文件**:最后一步就是把准备好的字典序列化成字符串并保存下来。 下面给出了一段简化版代码片段作为参考: ```python import cv2 from pycocotools import mask as cocomask import numpy as np import json def binary_mask_to_polygon(binary_mask, tolerance=0): """Converts a binary mask to COCO polygon representation""" padded_binary_mask = np.pad(binary_mask, pad_width=1, mode='constant', constant_values=0) contours, _ = cv2.findContours(padded_binary_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contours = np.subtract(contours, 1) segmentations = [] for contour in contours: # Filter out small objects if contour.size >= 6: segmentation = contour.flatten().tolist() segmentations.append(segmentation) return segmentations image_id = "example_image" height, width = image.shape[:2] annotations = [] for category_id, class_name in enumerate(classes_of_interest): binary_mask = (cv2.imread(mask_file_path, cv2.IMREAD_GRAYSCALE) == category_id).astype(np.uint8) polygons = binary_mask_to_polygon(binary_mask) annotation = { 'id': len(annotations), 'image_id': image_id, 'category_id': category_id, 'segmentation': polygons, 'bbox': list(cv2.boundingRect(np.array(polygons))), 'area': sum([cocomask.area(cocomask.frPyObjects([p], height, width)) for p in polygons]), 'iscrowd': 0 } annotations.append(annotation) output_dict = {"images": [{"file_name": file_name, "height": height, "width": width}], "annotations": annotations} with open(output_json_path, 'w') as f: json.dump(output_dict, f) ``` 这段程序展示了如何从给定的一组类别标签对应的mask映射关系出发,逐步建立起符合COCO标准的JSON文档框架[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值