import cv2
import numpy as np
from pycocotools.coco import COCO
import os
train_json = r'E:\data\_annotations.coco.json'
def save_segmentation_masks(json_path, img_path, category_name=' '):
"""
将COCO数据集中指定类别的图像分割掩码保存为PNG格式的标签图。
参数:
- json_path (str): COCO JSON注释文件的路径。
- img_path (str): 图像文件夹路径,用于加载原始图像。
- category_name (str): 要过滤的类别名称(默认为' '表示所有类别)。
"""
# 加载COCO数据集的注释
coco = COCO(json_path)
# 如果提供了类别名称,则根据类别名称过滤注释
if category_name != ' ':
catIds = coco.getCatIds(catNms=[category_name])
else:
catIds = []
# 获取所有图像ID
imgIds = coco.getImgIds(catIds=catIds)
# 遍历每个图像并保存分割掩码为PNG
for idx, imgId in enumerate(imgIds):
img = coco.loadImgs(imgId)[0]
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
# 加载原始图像
image = cv2.imread(img_path + img['file_name'])
# 创建与原始图像相同大小的空白图像
mask = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)
# 在空白图像上绘制每个分割区域
for ann in anns:
if 'segmentation' in ann:
seg_mask = coco.annToMask(ann)
mask[seg_mask > 0] = ann['category_id']
# 保存分割掩码图像为PNG,使用当前索引的文件名作为保存的图像文件名
output_folder = r'E:\data\1'
os.makedirs(output_folder, exist_ok=True)
cv2.imwrite(os.path.join(output_folder, f'{os.path.splitext(os.path.basename(img["file_name"]))[0]}.png'), mask)
print(os.path.join(output_folder, f'{os.path.splitext(os.path.basename(img["file_name"]))[0]}.png'))
if __name__ == "__main__":
save_segmentation_masks(train_json, r'E:\data\images\\', 'person')
'''1.复制图片到E:\data\images 和 json文件到E:\data
2、运行当前文件生成二值化标签图0和1 '''
09-13
1万+
07-20
2589