python医学图像处理之标签制作(json批量转png)

       无论是做医学图像分割的小伙伴,还是做其他语义分割的小伙伴,一定都和我一样遇到过这个问题——用labelme制作了标签之后,我们的标签如何转化为图片呢?

       其实,我们可以通过如下命令进行转化:

labelme_json_to_dataset -o files files\label.json

      但是,这样每次只能转一张图片,并不是很方便。接下来,就教大家如何批量地将json转换为png。

      现在,让我们来看一下数据。在目标文件夹中,每一个json文件都有一个与之对应的图片文件(如图1所示)。

python医学图像处理之标签制作(json批量转png)_第1张图片

图1 数据文件

       最后我会附上完整代码,这里就告诉大家需要修改哪些地方,方便大家直接进行操作。

       我使用的是3.16.7版本的labelme。

       首先,是main函数。

    num = 0
    Yuan_path = "D:\Quanxigenge"
    Jsontopng(Yuan_path, num)

       这里,大家需要修改num和Yuan_path。

       因为我最后的图像和标签需要按照“1,2,3,... "的顺序进行命名,num 是我设定的第一张图片的名称。如果大家要对多个文件夹的图片进行转化,记得每执行代码之前按需修改num的值!!!

        Yuan_path是目标文件夹的路径。

        其次,是Jsontopng函数。

        这里,我是将标签转换为png文件,放入PNGLabel文件夹;原图转换为jpg文件,放入JPEGpic文件夹。(如果有想改成其他格式的小伙伴,在保存的时候改成其他格式就好)

jpgs_path = "D:\Quanxigenge\JPEGpic"
pngs_path = "D:\Quanxigenge\PNGLabel"

       这里的jpgs_path和pngs_path需要改成对应的路径!!!

classes = ["_background_", "ACL", "femur", "femur_cartilage", "fibula", "LCL", "patella", "patella_cartilage", "patellar_ligament", "PCL", "tibia", "tibia_cartilage", "quadriceps_tendon", "meniscus"]

       这里的classes需要按照自己的标签命名进行修改,第一个必须是"_background_"哦~

       然后,在json文件转图片时,是不是有小伙伴也发现了,为什么明明是同一个标签,为什么转换之后两张图片同一个标签却显示的是不同的颜色呢?

       接下来,我们就来解决这个问题。解决方案:指定label_name_to_value。

label_name_to_value = {'_background_': 0, 'ACL': 1, 'femur': 2, 'femur_cartilage': 3, 'fibula': 4, 'LCL': 5, 'patella': 6, 'patella_cartilage': 7, 'patellar_ligament': 8, 'PCL': 9, 'tibia': 10, 'tibia_cartilage': 11, 'quadriceps_tendon': 12, 'meniscus': 13}
for shape in data['shapes']:
     label_name = shape['label']
     if label_name in label_name_to_value:
           label_value = label_name_to_value[label_name]
     else:
           label_value = len(label_name_to_value)
           label_name_to_value[label_name] = label_value


label_values, label_names = [], []
for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
     label_values.append(lv)
     label_names.append(ln)
assert label_values == list(range(len(label_values)))

lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)

          这里需要大家按照自己的标签修改label_name_to_value。

          最后的结果如图2所示。

python医学图像处理之标签制作(json批量转png)_第2张图片

python医学图像处理之标签制作(json批量转png)_第3张图片

 图2 结果

           最后附上完整代码,希望大家科研愉快鸭~

# -*- coding: utf-8 -*-
import base64
import json
import os
import os.path as osp

import numpy as np
import PIL.Image
from labelme import utils

def Jsontopng(Yuan_path, num):
    jpgs_path = "D:\Quanxigenge\JPEGpic"
    pngs_path = "D:\Quanxigenge\PNGLabel"
    classes = ["_background_", "ACL", "femur", "femur_cartilage", "fibula", "LCL", "patella", "patella_cartilage",
               "patellar_ligament", "PCL", "tibia", "tibia_cartilage", "quadriceps_tendon", "meniscus"]
    count = os.listdir(Yuan_path)
    print(count)
    for i in range(0, len(count)):
        path = os.path.join(Yuan_path, count[i])
        print(path)

        if os.path.isfile(path) and path.endswith('json'):
            data = json.load(open(path))

            if data['imageData']:
                imageData = data['imageData']
            else:
                imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
                with open(imagePath, 'rb') as f:
                    imageData = f.read()
                    imageData = base64.b64encode(imageData).decode('utf-8')

            img = utils.img_b64_to_arr(imageData)
            label_name_to_value = {'_background_': 0, 'ACL': 1, 'femur': 2, 'femur_cartilage': 3, 'fibula': 4, 'LCL': 5,
                                   'patella': 6, 'patella_cartilage': 7, 'patellar_ligament': 8, 'PCL': 9, 'tibia': 10,
                                   'tibia_cartilage': 11, 'quadriceps_tendon': 12, 'meniscus': 13}
            for shape in data['shapes']:
                label_name = shape['label']
                if label_name in label_name_to_value:
                    label_value = label_name_to_value[label_name]
                else:
                    label_value = len(label_name_to_value)
                    label_name_to_value[label_name] = label_value

            label_values, label_names = [], []
            for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
                label_values.append(lv)
                label_names.append(ln)
            assert label_values == list(range(len(label_values)))

            lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)

            PIL.Image.fromarray(img).save(osp.join(jpgs_path, str(num) + '.jpg'))

            new = np.zeros([np.shape(img)[0], np.shape(img)[1]])
            for name in label_names:
                index_json = label_names.index(name)
                index_all = classes.index(name)
                new = new + index_all * (np.array(lbl) == index_json)

            utils.lblsave(osp.join(pngs_path, str(num) + '.png'), new)
            print('Saved ' + count[i].split(".")[0] + '.jpg and ' + count[i].split(".")[0] + '.png')
            num = num + 1

if __name__ == '__main__':
    num = 0
    Yuan_path = "D:\Quanxigenge"
    Jsontopng(Yuan_path, num)

       

你可能感兴趣的:(医学图像处理,json,图像处理,深度学习,database,python,人工智能,计算机视觉)