利用json截取图像指定区域
由于深度学习之图像处理工作需要先进行数据制作,其中不免会框图来形成训练数据,而往往我们需要在原始数据上进行区域标注,截取标注区域来进行目标标记
通俗一点来说就是在我们需要的目标在原图中某一个部件上,而用原图来训练效果不好,此时我们会将目标所在的部件截取出来,然后在这个部件上进行数据的标注工作,形成训练数据集
这个工作就是解决这一问题的,工作流程如下:
- 在原图像中框选目标所在的部件(也就是某一区域),此时会根据原始图像生成对应的json文件
- 然后将原始图像与框图产生的json文件,通过程序来对json文件所标注的位置进行截取出来。
- 无须担心一张图片中标记了多个区域。
import numpy as np
import cv2
import os
import json
import xml.etree.cElementTree as ET
def drawxml(xmlpath,im):
tree = ET.ElementTree(file=xmlpath)
print("resoluting...")
root = tree.getroot()
for obj in root:
if obj.tag == 'object':
objectname = obj[0].text # object name
box = []
print('name:' + objectname)
for bndbox in obj:
for sub in bndbox:
box.append(int(sub.text)) # bndbox
box = np.array(box)
# print(box)
cv2.rectangle(im,(box[0],box[1]),(box[2],box[3]),(0,255,0),2)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(im,objectname,(box[0],box[1]),font,0.8,(255,255,255),2,cv2.LINE_AA)
return im
def drawjson(jsonpath, im):
xList=[]
yList=[]
jsonobj = json.load(open(jsonpath))
hats = jsonobj['shapes']
for hat in hats:
boxes = hat['points']
pts = np.array(boxes, np.int32)
pts = pts.reshape((-1, 1, 2))
# print(pts)
objectname = hat['label']
print(jsonpath)
print(objectname)
cv2.polylines(im, [pts], True, (0, 0, 255), 2)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(im, objectname, (pts[0][0][0], pts[0][0][1]), font, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
print(len(pts))
xlist=[]
ylist=[]
for i in range(len(pts)):
xlist.append(pts[i][0][0])
ylist.append(pts[i][0][1])
xList.append(xlist)
yList.append(ylist)
#print('xList',xList)
#print('yList',yList)
return im,xList,yList
if __name__ == '__main__':
#通过json或xml对原图进行标记需要填写savepath,通过json截取不用填写
imgpath = "/media/chase/SONG/xd/jinjucut/" #图片路径
xmlpath = "" #xml路径
savepath = "" #画图路径(截取不用填写)
cutsavepath="/home/chase/tmp/xiaodingcut/" #存放裁剪后的路径
jsonpath = "/home/chase/tmp/jinjucutres/" #图片对应的json路径
imgnum = 0
xmlnum = 0
jsonnum = 0
for f in os.listdir(imgpath):
ifdraw = False
imgnum += 1
im = cv2.imread(imgpath + f)
origin=cv2.imread(imgpath + f)
xmlname = xmlpath + f.replace('.jpg', '.xml')
if (xmlpath!='' and os.path.exists(xmlname)):
ifdraw = True
im = drawxml(xmlname, im)
xmlnum += 1
jsonname = jsonpath + f.replace('.jpg', '.json')
if (jsonpath!='' and os.path.exists(jsonname)):
ifdraw = True
im,xList,yList = drawjson(jsonname, im)
jsonnum += 1
print('xList',xList)
print('yList',yList)
print(len(xList))
for i in range(len(xList)):
img_cut=origin[min(yList[i]):max(yList[i]),min(xList[i]):max(xList[i])]
print(img_cut)
if os.path.exists(cutsavepath+f):
cut_img_name=cutsavepath+'cutted-'+ str(i)+'-'+f
else: cut_img_name=cutsavepath+f
print(cut_img_name)
cv2.imwrite(cut_img_name,img_cut)
if ifdraw and savepath!='':
cv2.imwrite(savepath + f, im)
print("imgnum:", imgnum)
print("xmlnum:", xmlnum)
print("jsonnum", jsonnum)