1.使用labelme进行标注
这里使用两张图片进行标注,需要注意以下几点:
1.图片的名称需要时英文字母命名;
2.标注目标的命名为类别.<序号>。例如,如果有两个圆形,需要分别标注为:circle.1、circle.2(你也可以以其他形式,但我的代码是按照类别.<序号>编写的,如果你按照自己的方式命名,需要更改代码),这样后面才能逐一抠出,如果统标为circle则无法逐一抠出 。
标注完成直接将对应的json文件保存到两张图片所在的文件夹
2.代码
import json
import numpy as np
from labelme import utils
import cv2
import os
def create_file(file):
if not os.path.exists(file):
os.mkdir(file)
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
def from_mask_extract_ROI(img,mask):
y = np.where(mask==1)[0]
x = np.where(mask==1)[1]
lu_y = min(y)
ld_y = max(y)
ru_x = min(x)
rd_x = max(x)
mask_ROI = mask[lu_y:ld_y+1,ru_x:rd_x+1]
ROI = img[lu_y:ld_y+1,ru_x:rd_x+1]
mask = np.ones_like(ROI)
for i in range(mask.shape[2]):
mask[:,:,i] = mask_ROI
masked_ROI = mask*ROI
channel_reverse = np.ones_like(masked_ROI)
for i in range(channel_reverse.shape[2]):
channel_reverse[:,:,-1-i] = masked_ROI[:,:,i]
return channel_reverse
def from_json_extract_ROI_based_label(file):
file_list = os.listdir(file)
json_file = []
for idx, value in enumerate(file_list):
if value.split('.')[-1] == 'json':
json_name = os.path.join(file, value)
json_file.append(json_name)
for idx, value in enumerate(json_file):
json_name = value
data = json.load(open(json_name))
img = utils.img_b64_to_arr(data['imageData'])
lbl, lbl_name = utils.labelme_shapes_to_label(img.shape, data['shapes'])
mask = []
for i in range(1, len(lbl_name)):
mask.append((lbl == i).astype(np.uint8))
mask = np.transpose(np.asarray(mask, np.uint8), [1, 2, 0])
keys = []
values = []
for value, key in enumerate(lbl_name):
key = key.split('.')[0]
keys.append(key)
values.append(value)
labels = []
for i in range(1, len(values)):
labels.append(keys[i])
for i in range(mask.shape[2]):
a = mask[:, :, i]
masked_ROI_ChannelRevrse = from_mask_extract_ROI(img=img,mask=a)
save_file = str(labels[i])
create_file(save_file)
save_ROI = './' + save_file + '/' + json_name.split('/')[-1].split('.json')[0] + '.' + str(i) + '.jpg'
cv2.imwrite(save_ROI, masked_ROI_ChannelRevrse)
from_json_extract_ROI_based_label(file='./test/')
运行代码需要注意以下几点:
1.将包含图片和json文件的文件夹与代码文件应处于同一级目录,我的目录如下图:
3.运行代码结果
需要注意以下几点:
1.标注过程如果采用多边形,则保存的对应的图片会以其外接矩形保存,多边形外的区域像素值为0;
2.抠图过程无法对覆盖形式的标注进行抠图