昨天要做一个裁图任务,但是有时候会截到图片外面去,即裁图的时候截到外面去的设置为黑色,在图片内部的保持原状,然后找了好久,也没有找到相应的资料,所以最后就设计了一个,验证之后效果还可以,所以将代码贴出来,希望可以帮助到需要的童鞋~
1我们要求从原图(512*512)上面裁出来(224*224)的小图,所以相应的右下是224-(x_u-512)=736-x_u
#coding=utf-8
import os
import numpy as np
import cv2
def crop_file(file,label_file):
file_list=[]
label_list=[]
coord_list=[]
img=cv2.imread(file)
tmp_img=np.zeros((224,224,3),np.float32)
with open(label_file,'r') as f:
lines=f.readlines()
lines=[line.strip().split(" ")[1:] for line in lines]
for i,line in enumerate(lines):
x_c=int(line[1])
y_c=int(line[2])
w=int(line[3])
h=int(line[4])
x_u=x_c-112
y_u=y_c-112
x_d=x_u+224
y_d=y_u+224
## 设计阶段,判断左上角点是否出界(出左边或者出上边,或者左上边界都出)
# if x_u<0 or y_u<0:
# tmp_img[-y_u:224,-x_u:224]=img[0:y_d,0:x_d]
# if x_u<0 and y_u>0:
# tmp_img[0:224,-x_u:224]=img[y_u:y_d,0:x_d]
# if x_u>0 and y_u<0:
# tmp_img[-y_u:224,0:224]=img[0:y_d,x_u:x_d]
## 相应的右下点类似,没有列出来
tmp_img[max(0,-y_u):min(736-y_d,224),max(0,-x_u):min(736-x_d,224)]=\
img[max(0,y_u):min(512,y_d),max(0,x_u):min(512,x_d)]
file_list.append(tmp_img)
label_list.append(line[0])
coord_list.append([h,w,y_u,y_d,x_u,x_d])
return img,file_list,label_list,coord_list
def random_crop_for_dirs(dir,label_dir,):
for root,dirs,files in os.walk(dir):
for file in files:
cur_path=os.path.join(root,file)
label_path=os.path.join(label_dir,file.split(".")[0]+".txt")
crop_file(cur_path,label_path)
if __name__=="__main__":
dir="/media/hp/CCSA_X64FRE/car_val_data/test/images"
label_dir="/media/hp/CCSA_X64FRE/car_val_data/test/labels"
dst_dir="/media/hp/CCSA_X64FRE/car_val_data/test/adve_imgs"
if os.path.exists(dst_dir)==False:
os.mkdir(dst_dir)
random_crop_for_dirs(dir,label_dir)