标注裁剪区域命名为ROI,ROI内有其他的标签,例如:裂纹等。根据ROI裁剪出新的图片和标签文件。
import json
import os
from copy import deepcopy
import cv2
import argparse
from tqdm import tqdm
parser = argparse.ArgumentParser("import args")
parser.add_argument("--img2json",default=r'.\GS_27',type=str,help="input to path")
parser.add_argument("--add2piexl",default={"patch":[0,0]
},
type=dict,help="add to piexl")
parser.add_argument("--choice2gw",default=r"patch",type=str,help="choice to GW")
parser.add_argument("--tab",default=["ROI"],type=list,help="crop to tab") ## ROI名称
args=parser.parse_args()
save2img_json=os.path.join(args.img2json,"ROI") #扩充后
if not os.path.exists(save2img_json):
os.makedirs(save2img_json)
img_type = "png" ## 注意图片格式
def crop_json(ROI_json,new_name,ROI_coordinate):
ROI_w = ROI_coordinate[2] - ROI_coordinate[0]
ROI_h = ROI_coordinate[3] - ROI_coordinate[1]
init_ROI = deepcopy(ROI_json)
init_ROI['shapes'] = []
init_ROI['imagePath'] = new_name
init_ROI['imageData'] = None
init_ROI['imageHeight'] = ROI_h
init_ROI['imageWidth'] = ROI_w
for shape in ROI_json["shapes"]:
if shape["label"] not in args.tab:
box_w = abs(int(shape["points"][0][0] - shape["points"][1][0]))
box_h = abs(int(shape["points"][0][1] - shape["points"][1][1]))
xmin = max(0,int(shape["points"][0][0] - ROI_coordinate[0]))
ymin = max(0,int(shape["points"][0][1] - ROI_coordinate[1]))
xmax = min(ROI_w,int(shape["points"][1][0] - ROI_coordinate[0]))
ymax = min(ROI_h,int(shape["points"][1][1] - ROI_coordinate[1]))
if (xmax-xmin) >box_w*0.2 and (ymax-ymin) > box_h*0.2 and xmax>0 and ymax>0:
shape_tmp = deepcopy(shape)
shape_tmp["points"] = [[xmin,ymin],[xmax,ymax]]
init_ROI['shapes'].append(shape_tmp)
return init_ROI
def main():
img2json = os.listdir(args.img2json)
for item in tqdm(img2json):
if item.endswith(".json"):
jsonData = open(os.path.join(args.img2json, item), "r", encoding="utf8").read()
jsonData = json.loads(jsonData)
org_img = cv2.imread(os.path.join(args.img2json, item.replace("json", img_type))) # shape=[h,w,c]
imageHeight = jsonData["imageHeight"]
imageWidth = jsonData["imageWidth"]
cout = 0
for shape in jsonData["shapes"]:
tab_ROI = []
if shape["label"] in args.tab:
xmin = max(0,int(shape["points"][0][0]))
ymin = max(0, int(shape["points"][0][1]))
xmax = min(imageWidth, int(shape["points"][1][0]))
ymax = min(imageHeight, int(shape["points"][1][1]))
if xmin > xmax:
xmin,xmax = xmax,xmin
if ymin > ymax:
ymin,ymax = ymax,ymin
tab_ROI=[xmin,ymin,xmax,ymax]
new_name = item.replace(".json","") + "_"+str(cout) + "."+img_type
cout +=1
ROI_img = org_img[tab_ROI[1]:tab_ROI[3],tab_ROI[0]:tab_ROI[2],:]
ROI_json = crop_json(jsonData,new_name,tab_ROI)
if len(ROI_json['shapes']) >0:
try:
cv2.imwrite(os.path.join(save2img_json,new_name),ROI_img)
with open(os.path.join(save2img_json, new_name.replace(".png", ".json")), 'w') as file:
json.dump(ROI_json, file, indent=4)
except:
print("未知错误:{}".format(item))
if __name__ == '__main__':
main()