语义分割标注:通过labelme生成的json文件,生成标注图像 ; 更新批量处理操作

首先很感谢做 labelme 的兄弟开源这个工具。

在使用的过程中,我发现它的 labelme_json_to_dataset 没办法按照标注时设定的颜色,生成对应的 ROI 区域,这个bug似乎没有修复,issue里也没说这个事。我看了一下源码,不太会改,索性自己写了一个。它只是处理一个json的。

它做了以下几件事:首先把背景标称黑色。接着将labelme原输出格式cmyk的颜色转换为rgb格式,并画出roi区域。

希望它可以帮到大家!!哈哈哈,倒斗的粽子出品!!

import json
import cv2
import numpy as np

# load img and json
data = json.load(open('img.json'))
img = cv2.imread('7.png')

# show keys
for key in data:
    print(key)

# get background data
img_h = data['imageHeight']
img_w = data['imageWidth']
color_bg = (0,0,0)
points_bg = [(0,0),(0,img_h),(img_w,img_h),(img_w,0)]
img = cv2.fillPoly(img,[np.array(points_bg)],color_bg)

#get raw roi data
color_cmyk = []
points = []
for content in data['shapes']:
    color_cmyk.append(content['fill_color'])
    points.append(content['points'])

# cmyk 2 rgb
color_rgb = []
for color in color_cmyk:
    c = color[0]
    m = color[1]
    y = color[2]
    k = color[3]
    r = 255 * (100 - c) * (100 - k) / 10000
    g = 255 * (100 - m) * (100 - k) / 10000
    b = 255 * (100 - y) * (100 - k) / 10000
    color_rgb.append((r,g,b))

# draw ROI
num = len(color_rgb)
index = 0
while index < num:
    img_color = color_rgb[index]
    img_points = points[index]
    index = index + 1
    img = cv2.fillPoly(img,[np.array(img_points)],color)

cv2.imwrite('a.png',img)

------------------------------------------------------分割线-------------------------------------------------------------------------------

以上的只能对一张照片进行操作,以下部分更新了批量处理操作。

import json
import cv2
import numpy as np
import os

def cvt_one(json_path,img_path,save_path):
    # load img and json
    data = json.load(open(json_path))
    img = cv2.imread(img_path)

    # show keys
    #for key in data:
        #print(key)

    # get background data
    img_h = data['imageHeight']
    img_w = data['imageWidth']
    color_bg = (0, 0, 0)
    points_bg = [(0, 0), (0, img_h), (img_w, img_h), (img_w, 0)]
    img = cv2.fillPoly(img, [np.array(points_bg)], color_bg)

    # get raw roi data
    color_cmyk = []
    points = []
    for content in data['shapes']:
        color_cmyk.append(content['fill_color'])
        points.append(content['points'])

    # cmyk 2 rgb
    color_rgb = []
    for color in color_cmyk:
        c = color[0]
        m = color[1]
        y = color[2]
        k = color[3]
        r = 255 * (100 - c) * (100 - k) / 10000
        g = 255 * (100 - m) * (100 - k) / 10000
        b = 255 * (100 - y) * (100 - k) / 10000
        color_rgb.append([r, g, b])

    #print(color_rgb)

    # draw ROI
    num = len(color_rgb)
    index = 0
    while index < num:
        img = cv2.fillPoly(img, [np.array(points[index])], color_rgb[index])
        index = index + 1

    cv2.imwrite('%s'%save_path, img)


if __name__ == '__main__':

    # load imgs and jsons dir
    file_dir = './file'
    save_dir = './labels'
    file_path = os.listdir(file_dir)
    total_num = len(file_path)/2
    flag = 0
    while flag < total_num:
        json_path = file_dir+'/'+file_path[flag*2+1]
        img_path = file_dir+'/'+file_path[flag*2]
        save_path = save_dir+'/'+file_path[flag*2]
        cvt_one(json_path, img_path, save_path)
        flag = flag + 1



 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值