首先很感谢做 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