json转二值图

 

参考文章:

Win10系统下安装labelme,json文件批量转化 - apan008 - 博客园 (cnblogs.com)https://www.cnblogs.com/apan008/p/11267203.html关于labelme标注生成的json文件批量转为label/mask的问题 - 简书 (jianshu.com)https://www.jianshu.com/p/dc9eb9b35873

 labelme安装:

conda create --name=labelme python=3.7

activate labelme

pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/

pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install labelme==3.16.5 -i https://pypi.tuna.tsinghua.edu.cn/simple 

pip install pyside2 -i https://pypi.tuna.tsinghua.edu.cn/simple/

参考代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#!H:\Anaconda3\envs\new_labelme\python.exe
import argparse
import json
import os
import os.path as osp
import base64
import warnings
 
from skimage import color
import PIL.Image
import yaml
 
from labelme import utils
 
import cv2
import numpy as np
from skimage import img_as_ubyte
 
# from sys import argv
 
def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")
 
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()
 
    json_file = args.json_file
 
    #freedom
    list_path = os.listdir(json_file)
    print('freedom =', json_file)
    for i in range(0,len(list_path)):
        path = os.path.join(json_file,list_path[i])
        if os.path.isfile(path):
 
            data = json.load(open(path))
            img = utils.img_b64_to_arr(data['imageData'])
            lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
 
            captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
 
            lbl_viz = utils.draw_label(lbl, img, captions)
            out_dir = osp.basename(path).replace('.', '_')
            save_file_name = out_dir
            out_dir = osp.join(osp.dirname(path), out_dir)
 
            if not osp.exists(json_file + '\\' + 'labelme_json'):
                os.mkdir(json_file + '\\' + 'labelme_json')
            labelme_json = json_file + '\\' + 'labelme_json'
 
            out_dir1 = labelme_json + '\\' + save_file_name
            if not osp.exists(out_dir1):
                os.mkdir(out_dir1)
 
            PIL.Image.fromarray(img).save(out_dir1+'\\'+save_file_name+'_img.png')
            PIL.Image.fromarray(lbl).save(out_dir1+'\\'+save_file_name+'_label.png')
                
            PIL.Image.fromarray(lbl_viz).save(out_dir1+'\\'+save_file_name+
            '_label_viz.png')
 
            if not osp.exists(json_file + '\\' + 'mask_png'):
                os.mkdir(json_file + '\\' + 'mask_png')
            mask_save2png_path = json_file + '\\' + 'mask_png'
            ################################
            #mask_pic = cv2.imread(out_dir1+'\\'+save_file_name+'_label.png',)
            #print('pic1_deep:',mask_pic.dtype)
 
            mask_dst = img_as_ubyte(lbl)  #mask_pic
            # mask_dst = color.rgb2gray(lbl)
            print('pic2_deep:',mask_dst.dtype)
            cv2.imwrite(mask_save2png_path+'\\'+save_file_name+'_label.png',mask_dst)
            ##################################
 
            with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
                for lbl_name in lbl_names:
                    f.write(lbl_name + '\n')
 
            warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=lbl_names)
            with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)
 
            print('Saved to: %s' % out_dir1)
 
if __name__ == '__main__':
    #base64path = argv[1]
    main()

 换mask_png的名字:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#!H:\Anaconda3\envs\new_labelme\python.exe
import argparse
import json
import os
import os.path as osp
import base64
import warnings
 
from skimage import color
import PIL.Image
import yaml
 
from labelme import utils
 
import cv2
import numpy as np
from skimage import img_as_ubyte
 
# from sys import argv
 
def main():
    warnings.warn("This script is aimed to demonstrate how to convert the\n"
                  "JSON file to a single image dataset, and not to handle\n"
                  "multiple JSON files to generate a real-use dataset.")
 
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()
 
    json_file = args.json_file
 
    #freedom
    list_path = os.listdir(json_file)
    print('freedom =', json_file)
    for i in range(0,len(list_path)):
        path = os.path.join(json_file,list_path[i])
        if os.path.isfile(path):
 
            data = json.load(open(path))
            img = utils.img_b64_to_arr(data['imageData'])
            lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])
 
            captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]
 
            lbl_viz = utils.draw_label(lbl, img, captions)
            out_dir = osp.basename(path).replace('.', '_')
            save_file_name = out_dir
            out_dir = osp.join(osp.dirname(path), out_dir)
 
            if not osp.exists(json_file + '\\' + 'labelme_json'):
                os.mkdir(json_file + '\\' + 'labelme_json')
            labelme_json = json_file + '\\' + 'labelme_json'
 
            out_dir1 = labelme_json + '\\' + save_file_name
            if not osp.exists(out_dir1):
                os.mkdir(out_dir1)
 
            PIL.Image.fromarray(img).save(out_dir1+'\\'+save_file_name+'_img.png')
            PIL.Image.fromarray(lbl).save(out_dir1+'\\'+save_file_name+'_label.png')
                
            PIL.Image.fromarray(lbl_viz).save(out_dir1+'\\'+save_file_name+
            '_label_viz.png')
 
            if not osp.exists(json_file + '\\' + 'mask_png'):
                os.mkdir(json_file + '\\' + 'mask_png')
            mask_save2png_path = json_file + '\\' + 'mask_png'
            ################################
            #mask_pic = cv2.imread(out_dir1+'\\'+save_file_name+'_label.png',)
            #print('pic1_deep:',mask_pic.dtype)
 
            mask_dst = img_as_ubyte(lbl)  #mask_pic
            # mask_dst = color.rgb2gray(lbl)
            print('pic2_deep:',mask_dst.dtype)
            cv2.imwrite(mask_save2png_path+'\\'+save_file_name.split('_json')[0]+'.png',mask_dst)
            ##################################
 
            with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
                for lbl_name in lbl_names:
                    f.write(lbl_name + '\n')
 
            warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=lbl_names)
            with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)
 
            print('Saved to: %s' % out_dir1)
            # print(save_file_name.split('_json')[0])
if __name__ == '__main__':
    #base64path = argv[1]
    main()

结果如下:

 

 

 

 运行代码如下:

  

后一个路径为json文件夹所在路径

python F:\vesseldata\json_to_dataset.py F:\vesseldata\json46\2json  

可能遇到labelme版本不匹配的问题,解决如下(重新安装labelme的3.16.5版本):

   

pip install labelme==3.16.5 -i https://pypi.tuna.tsinghua.edu.cn/simple 

转化过程:(很慢)

会在当前2json下生成两个东西:

可能遇到问题: 

生成的mask_png纯黑,人眼分辨不清楚,但其实并不是纯黑,可以对其进行二值化处理。

 我们取这个,进行黑白划分处理:

批量转二值化代码如下:

import numpy as np
import matplotlib.pyplot as plt
import cv2
import os
import PIL.Image

def readimg():
    path_predict = 'F:\\vesseldata\\json46\\2json\\mask_png'
    path_predict_list = []
    for i in os.listdir(path_predict):
        path_img = os.path.join(i)
        # path_img = os.path.join(path_predict,i)
        path_predict_list.append(path_img)
    return path_predict_list

def output2value(img):
    image = 'F:\\vesseldata\\json46\\2json\\mask_png\\' + img
    imagelist = cv2.imread(image)
    # print(array)
    imagelist = cv2.cvtColor(imagelist,cv2.COLOR_BGR2GRAY)
    # abc = np.array(array)
    # print(np.array(array).shape)
    for i in range(np.array(imagelist).shape[0]):
        for j in range(np.array(imagelist).shape[1]):
            if imagelist[i][j] == 0:
                imagelist[i][j] = 0
            else:
                imagelist[i][j] = 255
    # imagelist = np.array(imagelist)
    print(np.array(imagelist).shape)
    abc = cv2.cvtColor(imagelist,cv2.COLOR_GRAY2BGR)
    output_path = r'F:\\vesseldata\\orange\\output2value'
    if not os.path.exists(output_path):
        os.mkdir(output_path)
    # plt.axis('off') #增加这行关闭坐标轴显示,但仍有空白区域
    # #关键在于bbox_inches = 'tight',pad_inches = 0,去掉空白区域
    # plt.imshow(abc)
    # plt.savefig('F:\\vesseldata\\orange\\output2value\\' + img, bbox_inches='tight', pad_inches=0)
    # plt.imshow(abc)
# plt会有留白以及坐标轴等问题,所以选用PIL
    # cv2.imshow('abc',abc)
    # cv2.waitKey()
    # cv2.imwrite('./save.png', abc)
# cv2展示图片
    PIL.Image.fromarray(abc).save('F:\\vesseldata\\orange\\output2value\\'+ img)

if __name__ == '__main__':
    img_path = readimg()
    # for i in range(len(img_path)):
    for i in range(len(img_path)):
        output2value(img_path[i])

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
将mask二值换为json主要包括以下几个步骤: 1. 读取mask二值:使用像处理库(如OpenCV)读取mask二值,并将其换为二维数组。二值由0和255组成,0代表背景,255代表前景。 2. 遍历二维数组:遍历二维数组中的每个像素点,判断该点是否为前景(255)。如果是前景,则记录该点的位置信息。 3. 构建json数据:创建一个空的json对象,并依次将每个前景点的位置信息添加到json对象中。可以用字典或列表的形式存储位置信息,例如使用字典存储时,字典的key可以表示点的序号,value则包含该点的横坐标和纵坐标。 4. 将json数据保存到文件:使用json库将json数据保存到文件中,可以选择将其以字符串形式保存,也可以将其以字典形式保存。 示例代码如下: ```python import cv2 import json def mask_to_json(mask_path, json_path): mask = cv2.imread(mask_path, 0) h, w = mask.shape[:2] json_data = {} # 创建空的json对象 for row in range(h): for col in range(w): if mask[row, col] == 255: # 判断该点是否为前景 json_data[(row, col)] = {'x': col, 'y': row} # 将前景点的位置信息添加到json对象中 with open(json_path, 'w') as f: json.dump(json_data, f) # 将json数据保存到文件中 mask_to_json('mask.png', 'mask.json') ``` 上述代码中,`mask_path`为mask二值的路径,`json_path`为保存json数据的路径。代码会将mask二值中所有前景点的位置信息保存到json文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值