• OpenCV:python图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数


    前言

            仅供个人学习用,如果对各位朋友有参考价值,给个赞或者收藏吧 ^_^

    一. cv2.getRotationMatrix2D(center, angle, scale)

    1.1 参数说明 

    parameters

    center:旋转中心坐标,是一个元组参数(col, row)

    angle:旋转角度,旋转方向,负号为逆时针,正号为顺时针

    scale:旋转后图像相比原来的缩放比例,1为等比例缩放

    returns返回一个2*3的旋转(变换)矩阵,因为变换矩阵第三行形式固定,所以忽略。

    returns:返回下面的2*3行列式,注:α=cosθ,β=sinθ

    还是不太懂的话参考:cv2.getRotationMatrix2D的旋转矩阵的正确形式-CSDN博客

    二、cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue) 

    2.1 参数说明 

    parameters

    src:原始图像。
    dst:输出图像。
    M:变换矩阵,这里是由getRotationMatrix2D生成的旋转矩阵
    dsize:输出图像的大小。
    flags:插值方法,通常使用INTER_LINEAR(线性插值)。
    borderMode:边界像素模式。
    borderValue:边界填充值,用于边界外的像素。

    returns返回旋转后的图像

    2.2 flags 值说明 

    三、举例

     3.1 demo

    1. import cv2 as cv
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. img = cv.imread('E:/Desktop/jianli/lenna.png')
    5. img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    6. (h, w) = img.shape[:2]
    7. print('原图像的高和宽', h, w)
    8. (cX, cY) = (w // 2, h // 2)
    9. M = cv.getRotationMatrix2D((cX, cY), -45, 1.0)
    10. print('旋转矩阵:\n', M)
    11. rotate0 = cv.warpAffine(src=img, M=M, dsize=(h, w))
    12. cos = np.abs(M[0, 0])
    13. sin = np.abs(M[0, 1])
    14. nH = int((h*cos) + (w*sin))
    15. nW = int((h*sin) + (w*cos))
    16. print('新图像的高和宽', nH, nW)
    17. rotate1 = cv.warpAffine(img, M, (nW, nH))
    18. # 调整旋转矩阵的中心以平移到中心显示全图
    19. M[0, 2] += (nW/2) - cX
    20. M[1, 2] += (nH/2) - cY
    21. rotate2 = cv.warpAffine(img, M, (nW, nH))
    22. print('中心点平移后的旋转矩阵:\n', M)
    23. # 显示图像
    24. plt.subplot(1, 3, 1), plt.imshow(rotate0, 'gray'), plt.title('rotate0')
    25. plt.subplot(1, 3, 2), plt.imshow(rotate1, 'gray'), plt.title('rotate1')
    26. plt.subplot(1, 3, 3), plt.imshow(rotate2, 'gray'), plt.title('rotate2')
    27. plt.show()

    3.1.1  新图像的高和宽计算

    计算经过仿射变换或旋转后新图像的宽度和高度,尤其是在旋转图像时保持图像的完整性而不裁剪任何部分,需要一些几何计算。

    看了以下图就能知道为啥子这么计算啦

    nH = int((h*cos) + (w*sin))
    nW = int((h*sin) + (w*cos))

    3.2 output

  • 相关阅读:
    零基础学Python:Numpy用法
    NetCore.CAP mqttws31.js RabbitMq 订阅发布消息
    小孢子的神奇之旅-如何阅读MindSpore报错信息(3)
    matplotlib入门
    差分运算放大器的放大倍数的计算及结论
    176. 第二高的薪水
    Mysql存储过程和游标的一点理解
    Matplotlib 可视化50图:散点图(1)
    【数据库】之MYSQL基本语法
    【excel密码】excel文件加密方法总结:
  • 原文地址:https://blog.csdn.net/2302_76846184/article/details/140347120