前言
参加了”智蔗见智·向新而生”广西第二届人工智能大赛,发现数据中存在大量的脏数据,但是如果全部裁减掉那么十分可惜,那该如何是好呢?我的解决办法是:将图片划分为多个尺寸较小的子图片,最后删掉带有缺失块的子图片,所以本文真是记录这样一种办法去将一个 长宽相等 的图片,裁剪为四个 长宽相等 的子图片。
对以旋转图片以增强数据集实例如下(两者配合可以提高数据集到原来的(4*4=16)十六倍):
效果展示:
切割之前的图片:
切割之后的图片:
代码
'''
参数说明:
----------------------------avg_cut_four_square----------------------------
@param:square_img_path:
因为默认PIL库读取,所以选择以输入图片的路径作为参数。
@param:square_img_name:
输入图片名称,方便之后为裁剪的四个子图命名-如part1+square_img_name
@param:save_path:
裁剪后四个子图保存目录,假如我要保存在output这个目录之中去,那么我需要设置save_path='output',如果不设置那么默认保存在工作区。
----------------------------avg_cut_four_square_main----------------------------
@param:im_path:
需要被裁剪图片的目录。
@param:save_path:
作为avg_cut_four_square的参数,所以解释如上。
''' import os import cv2 from PIL import Image def avg_cut_four_square(square_img_path, square_img_name, save_path = ''): img = Image.open(square_img_path) size = img.size weight = int(size[0] // 2) height = int(size[1] // 2) now_iter_id = 1 for i in range(2): for j in range(2): box = (weight * j, height * i, weight * (j + 1), height * (i + 1)) region = img.crop(box) region.save(os.path.join(save_path, 'part{}'.format(now_iter_id) + square_img_name)) now_iter_id += 1 def avg_cut_four_square_main(im_path, save_path=''): im_list = os.listdir(im_path) for im_name in im_list: avg_cut_four_square(os.path.join(im_path, im_name), im_name, save_path=save_path) # how to use? if __name__ == '__main__': ori_img_path = 'VOCdevkit\VOC2007\JPEGImages' # 将ori_img_path目录下所有图片切割,且保存在ori目录下 avg_cut_four_square_main(ori_img_path,save_path='ori') print('ori is ok!')
1.导入包
import os import cv2 from PIL import Image
2.将单张图片按十字架方式裁剪
def avg_cut_four_square(square_img_path, square_img_name, save_path = ''): img = Image.open(square_img_path) size = img.size weight = int(size[0] // 2) height = int(size[1] // 2) now_iter_id = 1 for i in range(2): for j in range(2): box = (weight * j, height * i, weight * (j + 1), height * (i + 1)) region = img.crop(box) region.save(os.path.join(save_path, 'part{}'.format(now_iter_id) + square_img_name)) now_iter_id += 1
3.将目录下的所有图片按照十字架方式裁剪
def avg_cut_four_square_main(im_path, save_path=''): im_list = os.listdir(im_path) for im_name in im_list: avg_cut_four_square(os.path.join(im_path, im_name), im_name, save_path=save_path)
4.进入使用
# how to use? ''' 特别说明: save_path:不设置默认保存切割后的图片在运行目录下 ''' if __name__ == '__main__': ori_img_path = 'VOCdevkit\VOC2007\JPEGImages' # 将ori_img_path目录下所有图片切割,且保存在ori目录下 avg_cut_four_square_main(ori_img_path,save_path='ori') print('ori is ok!')
5.图片保存说明
''' 假设:你有这样一张图片 test.png 那么裁剪后将保存为: part1_test.png 左上 part2_test.png 右上 part3_test.png 左下 part4_test.png 右下 原图片不会删除! '''
完毕!