【数据增强】用cv2旋转图像并自定义填充背景颜色(主要用到cv2.getRotationMatrix2D 和 cv2.warpAffine)

参考链接

  • Opencv:图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数
  • 图像旋转任意角度不缺失,缺失背景指定颜色填充(python+opencv)图文教程和完整项目代码

两种实现效果

  1. ImageRotate:图像高宽发生变化(类似于直接采用PIL的rotation旋转后)

  2. ImageRotate_2:图像高宽发生变化(保留原始图像的所有样式)

结果展示

【数据增强】用cv2旋转图像并自定义填充背景颜色(主要用到cv2.getRotationMatrix2D 和 cv2.warpAffine)_第1张图片

在这里插入图片描述

代码

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from PIL import Image


def ImageRotate(imagepath):
    image = cv2.imread(imagepath)
    # 要有中心坐标、旋转角度、缩放系数
    h, w = image.shape[:2]  # 输入(H,W,C),取 H,W 的值
    center = (w // 2, h // 2)  # 绕图片中心进行旋转
    angle = 45  # 旋转角度
    scale = 0.8  # 将图像缩放为80%

    # 1. 获得旋转矩阵
    M = cv2.getRotationMatrix2D(center=center, angle=-angle, scale=scale)  # 当angle为负值时,则表示为顺时针

    # 2. 进行仿射变换,borderValue:缺失背景填充色彩,默认是黑色(0, 0 , 0),这里指定填充白色
    # 注意,这里的dsize=(w, h)顺序不要搞反了
    image_rotation = cv2.warpAffine(src=image, M=M, dsize=(w, h), borderValue=(255, 255, 255))

    return image_rotation


def ImageRotate_2(imagepath):
    image = cv2.imread(imagepath)
    # 要有中心坐标、旋转角度、缩放系数
    h, w = image.shape[:2]  # 输入(H,W,C),取 H,W 的值
    center = (w // 2, h // 2)  # 绕图片中心进行旋转
    angle = 45  # 旋转角度
    scale = 0.8  # 将图像缩放为80%

    # 1. 获得旋转矩阵
    M = cv2.getRotationMatrix2D(center=center, angle=-angle, scale=scale)  # 当angle为负值时,则表示为顺时针

    # -----------------------计算图像的新边界尺寸、调整旋转矩阵以考虑平移-------------------- #
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])

    # 计算图像的新边界尺寸
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))

    # 调整旋转矩阵以考虑平移
    M[0, 2] += (nW / 2) - center[0]
    M[1, 2] += (nH / 2) - center[1]
    # ------------------------------------------------------------------------------ #

    # 2. 进行仿射变换,边界填充为255,即白色,borderValue 缺省,默认是黑色(0, 0 , 0)
    image_rotation = cv2.warpAffine(src=image, M=M, dsize=(nW, nH), borderValue=(255, 255, 255))

    return image_rotation


if __name__ == '__main__':
    imagepath = r"D:\SoftWareInstallMenu\JetBrains\PycharmProjects\tunnel_datadeal\crackop\images\001.png"
    img = cv2.imread(imagepath)
    imgRotation = ImageRotate(imagepath)  # 待旋转的原始图像,旋转角度45
    imgRotation_2 = ImageRotate_2(imagepath)  # 待旋转的原始图像,旋转角度45

    # 显示并保存旋转结果
    cv2.imshow("img", img)
    cv2.imshow("imgRotation", imgRotation)  # 图像高宽无变化
    cv2.imshow("imgRotation_2", imgRotation_2)  # 图像高宽有变化,图像大小无太大变化
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite('imgRotation_crack.png', imgRotation)
    cv2.imwrite('imgRotation_crack_2.png', imgRotation_2)

    # 查看图像模式是否有变化,查看现在图像高宽
    img = Image.open(imagepath)
    imgRotation_crack = Image.open('imgRotation_crack.png')
    imgRotation_crack_2 = Image.open('imgRotation_crack_2.png')

    print(f'img:                 mode={img.mode}, size={img.size}')
    print(f'imgRotation_crack:   mode={imgRotation_crack.mode}, size={imgRotation_crack.size}')
    print(f'imgRotation_crack_2: mode={img.mode}, size={imgRotation_crack_2.size}')

你可能感兴趣的