通过labelme得到json文件并转换为png

1、安装labelme

#创建虚拟环境并安装labelme
conda create --name=labelme python=2.7(这一步python=*选择自己的Python版本)
#提前确定好要安装的版本,不然后后续变动时,相当于要重新安装一遍
activate labelme
conda install pyqt
#安装时可能pip版本不够,需要换源后更新
pip install labelme

2、使用labelme进行标注

activate labelme
labelme

3、将jupyter notebook 在虚拟环境中激活

conda activate labelme
conda install ipykernel
python -m ipykernel install --name labelme

#如果打卡notebook后,内核无法启动,可尝试查看ipykernel版本
pip list

#然后更新
pip install --upgrade ipykernel

4、安装需要的库

#cv2
pip3 install opencv-python

5、运行代码进行转换

import json
import numpy as np
import cv2
import os

#通过labelme得到的json文件,获得其中的点位信息与原图长宽绘制mask
#适用于多标签场合,不过需要提前修改对应标签名称
def json2mask(json_path):
    with open(json_path, "r") as f:
        data = f.read()
    data = json.loads(data)
    img_x = data['imageHeight']
    img_y = data['imageWidth']
    shapes = data['shapes']
    img = np.zeros((img_x,img_y,1)) #白色背景
    for x in shapes:
        #print(x['label'])
        if x['label']=='':
            data = x['points']
            data = np.array(data, dtype=np.int32) 
            color = 128
            cv2.fillPoly(img,   # 原图画板
             [data], # 多边形的点
             color=color)
        if x['label']=='':
            data = x['points']
            data = np.array(data, dtype=np.int32) 
            color = 254
            cv2.fillPoly(img,   # 原图画板
             [data], # 多边形的点
             color=color)
    return img

#单文件测试
# json_path = '/data/huangxy/workspace/data/outlooking/json/0601_2.json'
# img = json2mask(json_path) 
# cv2.imwrite('/data/huangxy/workspace/result/z.png', img)

#多文件夹
json_dir = '/data/huangxy/workspace/data/outlooking/json'
save_dir = '/data/huangxy/workspace/data/outlooking/label'
files = os.listdir(json_dir)
os.makedirs(save_dir, exist_ok=True)
num = 1
for file in files :
    name = file[0:-5]
    json_path = json_dir + '/' + name + '.json'
    img = json2mask(json_path) 
    save_path = save_dir + '/' + name + '.png'
    cv2.imwrite(save_path, img)
    print(num,'/',len(files),':',name)
    num += 1
    
    

6、将label覆盖到原图上,并将非标记位置变为黑色。

import cv2
img = 'img.png'
label = 'label.png'
img_png = cv2.imread(img)
label_png = cv2.imread(label)
#单通道标签注释掉下面两行
label_png[:,:,0]=label_png[:,:,2]
label_png[:,:,1]=label_png[:,:,2]
img_png[label_png == 0] = 0
#img_png[label_png != 0] = img_png
#cv2.imshow('img',label_png)
cv2.imshow('img',img_png)
cv2.waitKey(0)
cv2.destroyAllWindows()
#cv2.imwrite('1.png', img_png)

7、绘制轮廓线

import json
import numpy as np
import cv2
import os

def json2maskline(img_path,json_path):
    with open(json_path, "r") as f:
        data = f.read()
    data = json.loads(data)
    shapes = data['shapes']
    img = cv2.imread(img_path)
    for x in shapes:
        #print(x['label'])
        if x['label']=='外观':
            data = x['points']
            data = np.array(data, dtype=np.int32) 
            color = [0,0,255]
            cv2.polylines(img,   # 原图画板
             [data], # 多边形的点
             True,
             color=color,
             thickness=10)
        if x['label']=='背景':
            data = x['points']
            data = np.array(data, dtype=np.int32) 
            color = [255,0,0]
            cv2.polylines(img,   # 原图画板
             [data], # 多边形的点
             True,
             color=color,
             thickness=10)
    return img

#单文件测试
# img_path = ''
# json_path = ''
# img = json2maskline(img_path,json_path)
# cv2.imwrite('/data/huangxy/workspace/result/test.png', img)

#文件夹
json_dir = '/data/huangxy/workspace/data/outlooking/json'
img_dir = '/data/huangxy/workspace/data/outlooking/image'
save_dir = '/data/huangxy/workspace/data/outlooking/line'
files = os.listdir(json_dir)
os.makedirs(save_dir, exist_ok=True)
num = 1
for file in files[:100] :
    name = file[0:-5]
    json_path = json_dir + '/' + name + '.json'
    img_path = img_dir + '/' + name + '.jpg'
    img = json2maskline(img_path,json_path)
    save_path = save_dir + '/' + name + '.png'
    cv2.imwrite(save_path, img)
    print(num,'/',len(files),':',name)
    num += 1

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值