函数功能:自动化裁图并保存
函数应用:在深度学习当中,尤其是工业场景,通常数据集的尺寸大小非常大,而网络输入尺寸是固定的,所以在送入网络之前图片会统一resize到网络输入尺寸,图片较大的话,resize操作就相当于下采样,而图片送入网络后,网络通常还会进行数次下采样,如过我们要检测或分类的目标非常小的话,经过系列的下采样操作,感兴趣区域的目标特征直接2会消失。因此我们可以先将大图裁成数张小图进行训练,然后再将小图拼接回去,这样网络就能很好的学习到感兴趣区域的特征信息。
函数运行示例:
python segmention.py --img_path ./short_circuit/ --out_path ./workplace/short_circuit/
函数运行说明:函数是在命令行窗口运行的,因为我导入了python自带的命令行参数解析包,可以用来方便地读取命令行参数。它的使用也比较简单。
我设置了六个超参数:分别为:
img_path:需要裁图的批量图的路径
out_path: 存放裁剪后的图片的路径
step_x_n: x方向上每次的步长
step_y_n: y方向上每次的步长
crop_img_w_h: 要裁剪图片的宽
crop_img_h_n: 要裁剪图片的高
这里的步长和要裁剪的图片的宽高,都是相对整张图片而言的。
函数的优点:考虑到了边界问题,会进行重采样,使得边界的信息不会丢失
# -*- coding: utf-8 -*-
# @Time: 2020/12/31 18:49
# @Author: Min
import cv2
import os
import argparse
def show_img(img):
cv2.namedWindow('img',0)
cv2.resizeWindow('img', 640, 480)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def segment(img, file_name, result_split_path, step_x_n, step_y_n, crop_img_w_n, crop_img_h_n):
if not os.path.exists(result_split_path):
os.makedirs(result_split_path)
step_x = int(img.shape[0] / step_x_n)
step_y = int(img.shape[1] / step_y_n)
crop_img_w = int(img.shape[0] / crop_img_w_n)
crop_img_h = int(img.shape[1] / crop_img_h_n)
point_x_list = list(range(0, img.shape[0]-crop_img_w, step_x))
point_y_list = list(range(0, img.shape[1]-crop_img_h, step_y))
count = 0
for i in point_x_list:
for j in point_y_list:
if i == point_x_list[-1]:
crop_img = img[i:img.shape[0], j:j+crop_img_h, :]
else:
crop_img = img[i:i+crop_img_w, j:j+crop_img_h, :]
cv2.imwrite(result_split_path + '%s_%s.jpg'%(file_name, count), crop_img)
count += 1
for i in point_x_list:
if i == point_x_list[-1]:
crop_img == img[i:img.shape[0], img.shape[1]-crop_img_h:img.shape[1], :]
else:
crop_img == img[i:i+crop_img_w, img.shape[1]-crop_img_h:img.shape[1], :]
cv2.imwrite(result_split_path[:-4] + '%s_%s.jpg'%(file_name, count), crop_img)
count += 1
def get_dst_img(file_name):
src = cv2.imread(file_name)
ret, thresh1 = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY) # binary (黑白二值)
count = 0
for i in list(range(src.shape[0] - 1, -1, -1)):
if thresh1[i, 0][0] == 255:
count = i
break
dst = src[0:count - 1, 0:src.shape[1], :]
return dst
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--img_path', default='./dataset/', help='the path of dataset')
parser.add_argument('--out_path', default='./dataset/', help='the path of result_split_images')
parser.add_argument('--step_x_n',type=int, default=6, help='the step of vertical direction')
parser.add_argument('--step_y_n',type=int, default=24, help='the step of horizontal direction')
parser.add_argument('--crop_img_w_n', type=int, default=3, help='the height of crop_image split numbers')
parser.add_argument('--crop_img_h_n', type=int, default=6, help='the width of crop_image split numbers')
opt = parser.parse_args()
file_list = os.listdir(opt.img_path)
result_split_path = opt.out_path
step_x_n = opt.step_x_n
step_y_n = opt.step_y_n
crop_img_w_n = opt.crop_img_w_n
crop_img_h_n = opt.crop_img_h_n
for file_name in file_list:
dst = get_dst_img(os.path.join(opt.img_path, file_name))
print(dst.shape)
segment(dst, file_name, result_split_path, step_x_n, step_y_n, crop_img_w_n, crop_img_h_n)
if __name__ == "__main__":
main()
#the running sample of script:
#python segmention.py --img_path ./short_circuit/ --out_path ./workplace/short_circuit/