python实现自动化裁图并保存在指定文件夹下

函数功能:自动化裁图并保存
函数应用:在深度学习当中,尤其是工业场景,通常数据集的尺寸大小非常大,而网络输入尺寸是固定的,所以在送入网络之前图片会统一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/

你可能感兴趣的:(python,opencv,深度学习,深度学习)