需求
给定标准框,把这张图上所有的标注框的小图切出来,标注框不一定是矩形,有多边形。
步骤
-
使用多边形点查找区域
-
使用多边形点创建遮罩
-
做遮罩修剪
-
如果需要,添加白色背景
代码
import os
import cv2
import json
import numpy as np
img = cv2.imread("xx.png")
j = 0
# 读取文件中的标准框,若无文件可省略此步骤,指定标注框
with open("xx.json", 'r', encoding='utf-8') as f:
load_dict = json.load(f)
dic_data=load_dict["shapes"]
for i in dic_data:
pts=np.array(i["points"])
# 把浮点型转为整形
pts = pts.astype(np.int64)
#使用多边形点查找区域
rect = cv2.boundingRect(pts)
x, y, w, h = rect
croped = img[y:y + h, x:x + w].copy()
#使用多边形点创建遮罩
pts = pts - pts.min(axis=0)
mask = np.zeros(croped.shape[:2], np.uint8)
cv2.drawContours(mask, [pts], -1, (255, 255, 255), -1, cv2.LINE_AA)
#做遮罩修剪
dst = cv2.bitwise_and(croped, croped, mask=mask)
#如果需要,添加白色背景
bg = np.ones_like(croped, np.uint8) * 255
cv2.bitwise_not(bg, bg, mask=mask)
dst2 = bg + dst
Save_File = r'E:/pythonProject/'
save_path = os.path.join(Save_File, str(j) + '.png')
cv2.imwrite(save_path, dst2)
j += 1