COCO json标注文件转Mask文件tif / tiff(分割 追踪)

1.典型的 COCO 标注 JSON 文件

{
  "images": [
    {
      "id": 1,
      "file_name": "image1.jpg",
      "width": 640,
      "height": 480
    }
  ],
  "annotations": [
    {
      "id": 1,
      "image_id": 1,
      "category_id": 2,
      "bbox": [50, 30, 200, 150],  
      "segmentation": [[50,30,250,30,250,180,50,180]], 
      "area": 30000,
      "iscrowd": 0
    }
  ],
  "categories": [
    {
      "id": 2,
      "name": "cat",
      "supercategory": "animal"
    }
  ]
}
#images:存储图像信息,如 id、文件名和尺寸。
#annotations:存储标注信息,如目标的 image_id、category_id、bbox([x_min, y_min, width, height])、segmentation(分割点坐标)、area(目标面积)等。
#categories:定义类别信息,包括 id 和 name。

2.COCO json转mask

细胞追踪任务CTC的mask文件一般以背景为0,细胞追踪ID作为该细胞的像素值,而细胞分割不需要区分ID,只需要背景为0,细胞前景非0即可。

import os
import numpy as np
import cv2
import tifffile as tiff
from pycocotools.coco import COCO
from PIL import Image
# COCO 标注文件路径
coco_json_path = ""
mask_output_folder = ""  # 存放生成的 mask 的文件夹

# 确保 mask 保存路径存在
os.makedirs(mask_output_folder, exist_ok=True)

# 读取 COCO 标注
coco = COCO(coco_json_path)
image_ids = coco.getImgIds()

# 遍历所有图片
for image_id in image_ids:
    image_info = coco.loadImgs(image_id)[0]
    width, height = image_info["width"], image_info["height"]

    # 生成空白 mask(背景为0)
    mask = np.zeros((height, width), dtype=np.uint16)

    # 获取该图像的所有标注
    ann_ids = coco.getAnnIds(imgIds=image_id)
    anns = coco.loadAnns(ann_ids)

    # 遍历所有目标
    for ann in anns:
        segmentation = ann["segmentation"]
        track_id = ann.get("track_id", -1)  # 获取 track_id
        print(track_id)
        if track_id == -1:
            continue

        if isinstance(segmentation, list):
            for seg in segmentation:
                poly = np.array(seg, dtype=np.int32).reshape(-1, 2)
                cv2.fillPoly(mask, [poly], track_id)  # 用 track_id 填充 mask 没有可是使用随机像素填充

    # 保存 mask 为 tif 格式(使用 LZW 压缩)
    mask_path = os.path.join(mask_output_folder, image_info["file_name"].replace(".jpg", ".tif"))
    tiff.imwrite(mask_path, mask.astype(np.uint16), compression="lzw")
    # img = Image.open(mask_path)
    # print(img.mode)
    print(f"Saved mask: {mask_path}")

print("finished !")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值