在保持原图大小不变的基础上,对图片进行放大和缩小,因为应用于目标检测,应当保留对标注信息(.xml文件)的修改
将图片先放大为原来的一定倍数(以1.2倍为例),再对目标进行中心裁剪(或者指定区域裁剪,不同图片需要读者自己更改保留区间),得到大小与原图相等的放大后的图片。
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) # 将图片按指定比例放大,并强制转化为整型
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)
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)
先对图像进行边界填充(以上下左右各填充10%为例),然后对填充后的图像进行resize,缩小到原图尺寸。(当然也可以缩小到任意尺寸,读者仅需修改resize参数即可)
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)
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)
对目标检测数据集的增强应当包含对标注文件(.xml)的修改,对本文缩放的方式,需要先对bbox(标注框)进行放缩对应的修改,还要考虑到放大之后,目标有可能缺失或截断,所以对大目标(单目标)和小目标(多目标)图像的标注文件要分别coding,本人暂时还没有debug成功,欢迎感兴趣的小伙伴进行补充!
如果感觉本文有帮助的话,请帮我点个赞和收藏吧,感谢!