File size: 2,685 Bytes
1060621
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
import io
import json
import numpy as np
from pycococreatortools import pycococreatortools
from PIL import Image
import base64
import cv2
from tqdm import tqdm
def img_tobyte(img_pil):
    
    ENCODING = 'utf-8'
    img_byte = io.BytesIO()
    img_pil.save(img_byte, format='PNG')
    binary_str2 = img_byte.getvalue()
    imageData = base64.b64encode(binary_str2)
    base64_string = imageData.decode(ENCODING)
    return base64_string

def mask2json(ROOT_DIR):
    Image_DIR = os.path.join(ROOT_DIR, "pngs")
    Label_DIR = os.path.join(ROOT_DIR, "pre")

    Label_files = os.listdir(Label_DIR)
    # classs_names
    class_names = ['_background_', 'panicle']
    for Label_filename in tqdm(Label_files):

        Json_output = {
            "version": "3.16.7",
            "flags": {},
            "fillColor": [255, 0, 0, 128],
            "lineColor": [0, 255, 0, 128],
            "imagePath": {},
            "shapes": [],
            "imageData": {}}
        name = Label_filename.split('.', 3)[0]
        name1 = name + '.png'
        Json_output["imagePath"] = name1

        image = Image.open(Image_DIR + '/' + name1)
        imageData = img_tobyte(image)
        Json_output["imageData"] = imageData
        binary_mask = np.asarray(np.array(Image.open(Label_DIR + '/' + Label_filename))).astype(np.uint8)
        mask_image = cv2.imread(Label_DIR + '/' + Label_filename, cv2.IMREAD_GRAYSCALE)
        temp_mask = np.asarray((mask_image != 0), dtype=np.uint8)

        segmentation = pycococreatortools.binary_mask_to_polygon(temp_mask, tolerance=2)
        for item in segmentation:
            if len(item) > 10:
                list1 = []
                for j in range(0, len(item), 2):
                    list1.append([item[j], item[j + 1]])
                # There is only one non-background class, so just use class_names[1]
                label = class_names[1]
                seg_info = {'points': list1, "fill_color": None, "line_color": None, "label": label,
                            "shape_type": "polygon", "flags": {}}
                Json_output["shapes"].append(seg_info)

        Json_output["imageHeight"] = binary_mask.shape[0]
        Json_output["imageWidth"] = binary_mask.shape[1]
        json_path = os.path.join(ROOT_DIR,'json')
        if not os.path.exists(json_path):
            os.makedirs(json_path)
        full_path = os.path.join(json_path, '{}.json'.format(name))
        with open(full_path, 'w') as output_json_file:
            json.dump(Json_output, output_json_file)


if __name__ == '__main__':

    ROOT_DIR = ''
    mask2json(ROOT_DIR)