批量数据增强(扩充):目标检测系列(1)缩放

批量数据增强:目标检测系列(1)缩放

  • 简述
    • 1.放大
      • 1)效果
      • 2)原理
      • 3)代码分析
      • 4)源码
    • 2.缩小
      • 1)效果
      • 2)原理
      • 3)代码分析
      • 4)源码
    • 3.补充

简述

在保持原图大小不变的基础上,对图片进行放大和缩小,因为应用于目标检测,应当保留对标注信息(.xml文件)的修改

1.放大

1)效果

效果如下:
原图:
批量数据增强(扩充):目标检测系列(1)缩放_第1张图片
等比例放大后:
批量数据增强(扩充):目标检测系列(1)缩放_第2张图片

2)原理

将图片先放大为原来的一定倍数(以1.2倍为例),再对目标进行中心裁剪(或者指定区域裁剪,不同图片需要读者自己更改保留区间),得到大小与原图相等的放大后的图片。

3)代码分析

1.导入

imgs_p = "../aug_test_dataset/imgs"
imgs_save_p = "../aug_test_dataset/imgs_ed"

2.初始化

	img_path=os.path.join(imgs_p,i)  # 拼接后得到路径+.jpg,为完整的路径
    img = cv2.imread(img_path)  # 读取路径
    rows, cols = img.shape[:2]  # 用.shape方法得到图片宽和高
    scale = 1.2  # 放大的比例
    rows = int(rows * scale)
    cols = int(cols * scale)  # 将图片按指定比例放大,并强制转化为整型
  1. 按照原理进行放大
img = cv2.resize(img,(cols,rows))  # 进行放大
dst = img[131:1441,193:2123]  # 裁剪,得到想要的那一部分图片,(以中心裁剪为例)

4.批量保存

    new_img_path=os.path.join(imgs_save_p,i)
    cv2.imwrite(new_img_path,dst)

4)源码

import glob
import xml.dom.minidom
import cv2
import os,sys

# 先扩大到1.1倍,再中心裁剪

imgs_p = "../aug_test_dataset/imgs"
imgs_save_p = "../aug_test_dataset/imgs_ed"

for i in os.listdir(imgs_p):  # i为读取到的图片名称:i.jpg
    img_path=os.path.join(imgs_p,i)  # 所以拼接后得到路径+.jpg,为完整的路径
    img = cv2.imread(img_path)  # 读取路径
    rows, cols = img.shape[:2]  # 用.shape方法得到图片宽和高
    scale = 1.2  # 放大的比例
    rows = int(rows * scale)
    cols = int(cols * scale)  # 将图片按指定比例放大,并强制转化为整型
    img = cv2.resize(img,(cols,rows))  # 进行放大
    dst = img[131:1441,193:2123]  # 裁剪,得到想要的那一部分图片,(我这里以中心裁剪为例)
    
    
    new_img_path=os.path.join(imgs_save_p,i)
    cv2.imwrite(new_img_path,dst)

2.缩小

1)效果

原图:
批量数据增强(扩充):目标检测系列(1)缩放_第3张图片

批量数据增强(扩充):目标检测系列(1)缩放_第4张图片

2)原理

先对图像进行边界填充(以上下左右各填充10%为例),然后对填充后的图像进行resize,缩小到原图尺寸。(当然也可以缩小到任意尺寸,读者仅需修改resize参数即可)

3)代码分析

1.导入路径

imgs_p="../aug_test_dataset/imgs/"
imgs_save_p="../aug_test_dataset/imgs_ed/"

2.初始化参数

	img_path=os.path.join(imgs_p,i)
    img = cv2.imread(img_path)
    top = int(0.1 * img.shape[0])  # shape[0] = rows 上下增加的边,
    bottom = top
    left = int(0.1 * img.shape[1])  # shape[1] = cols 左右增加的边
    right = left
    value = [0,0,0]

3.按照原理进行等比例缩小

	borderType = cv2.BORDER_REPLICATE # 选择边界种类
    dst = cv2.copyMakeBorder(img, top, bottom, left, right, borderType, None, value) # 添加边界
    dst = cv2.resize(dst,(img.shape[1],img.shape[0]))  # 裁剪为原图大小

4.批量保存

	new_img_path=os.path.join(imgs_save_p,i) # 批量保存
    cv2.imwrite(new_img_path,dst)

4)源码

import glob
import xml.dom.minidom
import cv2
import os,sys

# 先添加边界,扩大到1.2倍,再resize到原始大小

imgs_p="../aug_test_dataset/imgs/"
imgs_save_p="../aug_test_dataset/imgs_ed/"

# for循环进行批量读取
for i in os.listdir(imgs_p):
    img_path=os.path.join(imgs_p,i)
    img = cv2.imread(img_path)
    top = int(0.1 * img.shape[0])  # shape[0] = rows 上下增加的边,
    bottom = top
    left = int(0.1 * img.shape[1])  # shape[1] = cols 左右增加的边
    right = left
    value = [0,0,0]
    borderType = cv2.BORDER_REPLICATE # 选择边界种类
    dst = cv2.copyMakeBorder(img, top, bottom, left, right, borderType, None, value) # 添加边界
    dst = cv2.resize(dst,(img.shape[1],img.shape[0]))  # 裁剪为原图大小
    
    new_img_path=os.path.join(imgs_save_p,i) # 批量保存
    cv2.imwrite(new_img_path,dst)

3.补充

对目标检测数据集的增强应当包含对标注文件(.xml)的修改,对本文缩放的方式,需要先对bbox(标注框)进行放缩对应的修改,还要考虑到放大之后,目标有可能缺失或截断,所以对大目标(单目标)和小目标(多目标)图像的标注文件要分别coding,本人暂时还没有debug成功,欢迎感兴趣的小伙伴进行补充!
如果感觉本文有帮助的话,请帮我点个赞和收藏吧,感谢!

你可能感兴趣的:(数据增强,目标检测,计算机视觉,数据分析)