利用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)

以上代码可以根据需求进行调整和优化。其核心功能包括数据增强方法和文件夹内图片的批量处理。

上一篇:大话目标检测经典模型(RCNN、Fast RCNN、Faster RCNN)————未看完
下一篇:各类模型

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月11日 13时34分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章