
利用opencv进行数据增强(python)——包括平移、旋转、镜像、翻转等
发布日期:2021-05-14 10:21:23
浏览次数:19
分类:精选文章
本文共 3299 字,大约阅读时间需要 10 分钟。
利用 OpenCV 进行数据增强
OpenCV 是一种强大的图像处理库,拥有众多功能可以帮助我们对图像进行数据增强。这对训练模型至关重要。以下将介绍常用的几种数据增强方法,并展示其效果。
数据增强方法
OpenCV 提供了多种图像变换工具,可以提高数据多样性。常见方法包括:
- 水平镜像:将图像水平翻转。
- 垂直镜像:将图像垂直翻转。
- 水平垂直镜像:同时进行水平和垂直翻转。
- 平移变换:通过添加或移除图像边缘。
- 旋转变换:包括90°、45°等不同角度。
- 缩放:调整图像大小。
- 仿射变换:通过三点确定变换矩阵进行图像变形。
效果图展示
以下是图像经过不同变换后的示例结果:
- 水平镜像:可以使图像在左右翻转。
- 垂直镜像:可以使图像上下翻转。
- 水平垂直镜像:同时将图像左右和上下翻转。
- 平移变换:允许我们在图像中创建边框。
- 旋转变换:支持多种角度旋转。
- 缩放:可以放大或缩小图像。
- 仿射变换:通过三点变换矩阵实现更加复杂的图像变形。
整体代码示例
import numpy as npimport cv2img = cv2.imread("1.jpg")cv2.imshow("original", img)# 水平镜像h_flip = cv2.flip(img, 1)cv2.imshow("Flipped Horizontally", h_flip)# 垂直镜像v_flip = cv2.flip(img, 0)cv2.imshow("Flipped Vertically", v_flip)# 水平垂直镜像hv_flip = cv2.flip(img, -1)cv2.imshow("Flipped Horizontally & Vertically", hv_flip)# 平移矩阵M = np.array([[1, 0, -100], [0, 1, -12]], np.float32)img_change = cv2.warpAffine(img, M, (300, 300))cv2.imshow("translation", img_change)# 90度旋转rows, cols = img.shape[:2]M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1)dst_90 = cv2.warpAffine(img, M, (cols, rows))cv2.imshow("90", dst_90)# 45度旋转M = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1)dst_45 = cv2.warpAffine(img, M, (cols, rows))cv2.imshow("45", dst_45)# 缩放height, width = img.shape[:2]res = cv2.resize(img, (2*width, 2*height))cv2.imshow("large", res)# 仿射变换point1 = np.float32([[50, 50], [300, 50], [50, 200]])point2 = np.float32([[10, 100], [300, 50], [100, 250]])M = cv2.getAffineTransform(point1, point2)dst1 = cv2.warpAffine(img, M, (cols, rows), borderValue=(255, 255, 255))cv2.imshow("affine transformation", dst1)cv2.waitKey(0)
循环读取文件夹图片并增强保存
以下代码可用于循环读取文件夹内图片并进行数据增强和保存:
import numpy as npimport cv2import ossave_path = 'E:\\python_project\\yi_xue_ying_xiang\\tuxiangzengqiang\\after\\'for info in os.listdir(r'E:\python_project\yi_xue_ying_xiang\tuxiangzengqiang\pic'): info1 = os.path.join(os.path.abspath(r'E:\python_project\yi_xue_ying_xiang\tuxiangzengqiang\pic'), info) img = cv2.imread(info1) # 水平镜像 h_flip = cv2.flip(img, 1) cv2.imwrite(save_path + info + '_h_flip.jpg', h_flip) # 垂直镜像 v_flip = cv2.flip(img, 0) cv2.imwrite(save_path + info + '_v_flip.jpg', v_flip) # 水平垂直镜像 hv_flip = cv2.flip(img, -1) cv2.imwrite(save_path + info + 'hv_flip.jpg', hv_flip) # 平移 M = np.array([[1, 0, -100], [0, 1, -12]], np.float32) img_change = cv2.warpAffine(img, M, (300, 300)) cv2.imwrite(save_path + info + 'img_change.jpg', img_change) # 90度旋转 rows, cols = img.shape[:2] M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1) dst_90 = cv2.warpAffine(img, M, (cols, rows)) cv2.imwrite(save_path + info + 'dst_90.jpg', dst_90) # 45度旋转 M = cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1) dst_45 = cv2.warpAffine(img, M, (cols, rows)) cv2.imwrite(save_path + info + 'dst_45.jpg', dst_45) # 缩放 height, width = img.shape[:2] res = cv2.resize(img, (2 * width, 2 * height)) cv2.imwrite(save_path + info + 'res.jpg', res) # 仿射变换 point1 = np.float32([[50, 50], [300, 50], [50, 200]]) point2 = np.float32([[10, 100], [300, 50], [100, 250]]) M = cv2.getAffineTransform(point1, point2) dst1 = cv2.warpAffine(img, M, (cols, rows), borderValue=(255, 255, 255)) cv2.imwrite(save_path + info + 'dst1.jpg', dst1)cv2.waitKey(0)
以上代码可以根据需求进行调整和优化。其核心功能包括数据增强方法和文件夹内图片的批量处理。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月11日 13时34分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
io多路复用___select
2019-03-12
go web服务get pos
2019-03-12
团队背包(team)
2019-03-12
1376:信使(msner)
2019-03-12
1547. 奇数统计(count)
2019-03-12
LeetCode(144):Binary Tree Preorder Traversal
2019-03-12
简单方法实现无刷新提交Form表单
2019-03-12