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)
|