Loading [MathJax]/jax/output/CommonHTML/autoload/mtable.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图像旋转:getRotationMatrix2D详解--无损失旋转图片

图像旋转:getRotationMatrix2D详解--无损失旋转图片

原创
作者头像
languageX
发布于 2021-03-06 12:20:04
发布于 2021-03-06 12:20:04
25.5K3
举报
文章被收录于专栏:计算机视觉CV计算机视觉CV

使用opencv对图像进行旋转的代码随手一搜即得,但是有些旋转后图像会不完整,有些只给出代码并未解释其实现原理。本文会详细介绍如何使用opencv实现图像旋转得到完整图像,以及其中的实现原理。

最终实现效果:

test.png
test.png
test_rotated.jpg
test_rotated.jpg

1. getRotationMatrix2D详解

opencv的getRotationMatrix2D函数可以获取旋转变换矩阵。输入中心点坐标(centerX,centerY),旋转角度θ,缩放比例,给出M变换矩阵

那这个矩阵到底如何计算得到的呢?

我们先对一个点基于原点进行旋转,如下图,将V1点逆时针旋转角度到V2点,缩放比例我们先假定为1.

image.png
image.png

V1点和原点连线与水平线夹角a,V2点和原点连线与水平线夹角。计算旋转变换矩阵

,

那么

带入

输出矩阵形式

但是通常我们会基于中心点进行旋转,如果是需要绕任意点旋转,我们可以

1.先把旋转点平移到原点

2.然后进行以上旋转操作

3.按1的逆操作平移回去

就可以得到绕任意点旋转点变换矩阵:

以上就是旋转矩阵M的由来。

2. warpAffine操作

2.1 获取M矩阵

得到变换矩阵M,对图像每个点进行M变换就可以得到旋转后的图像,这一步可以通过opencv的warpAffine得到。但是通过以上操作,旋转后大图像会丢失信息,如下图所示:

2.2 扩大画布

画布大小不变的情况下,会有一部分图像超出,显示不全,所以我们需要将画布扩大为:

新的高由图片中两段蓝色线组合

新的宽由图片中两段红色线组合

新的画布扩大是基于原图左上角点扩大,显示的还是蓝色区域,同样丢失了信息。

2.3 平移图像

我们还需要将红色区域进行平移操作显示到蓝色区域

所以,在变换矩阵M上,我们可以调整平移参数:

通过以上操作就可以显示出文章最初到效果了。

最后附上使用opencv进行图像旋转并且不丢失信息到完整代码:

代码语言:txt
AI代码解释
复制
def opencv_rotate(img, angle):
    h, w = img.shape[:2]
    center = (w / 2, h / 2)
    scale = 1.0
    # 2.1获取M矩阵
     """
    M矩阵
    [
    cosA -sinA (1-cosA)*centerX+sinA*centerY
    sinA cosA  -sinA*centerX+(1-cosA)*centerY
    ]
    """
    M = cv2.getRotationMatrix2D(center, angle, scale)
    # 2.2 新的宽高,radians(angle) 把角度转为弧度 sin(弧度)
    new_H = int(w * fabs(sin(radians(angle))) + h * fabs(cos(radians(angle))))
    new_W = int(h * fabs(sin(radians(angle))) + w * fabs(cos(radians(angle))))
    # 2.3 平移
    M[0, 2] += (new_W - w) / 2
    M[1, 2] += (new_H - h) / 2
    rotate = cv2.warpAffine(img, M, (new_W, new_H), borderValue=(0, 0, 0))
    return rotate

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
3 条评论
热度
最新
你好,请问新的高度和宽度那里可以详细说说吗?没太理解
你好,请问新的高度和宽度那里可以详细说说吗?没太理解
回复回复点赞举报
你好!你写的非常棒!让我茅塞顿开,但是,最后这个平移是怎么产生的?为什么要平移?
你好!你写的非常棒!让我茅塞顿开,但是,最后这个平移是怎么产生的?为什么要平移?
11点赞举报
你好!因为原始画布我们认为是黑色框,通过旋转后画布认为画布变为红色框,但是显示我们还是以黑色框左上角为顶点的话,需要进行一个平移操作。
你好!因为原始画布我们认为是黑色框,通过旋转后画布认为画布变为红色框,但是显示我们还是以黑色框左上角为顶点的话,需要进行一个平移操作。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【OpenCV】Chapter3.图像的仿射变换
仿射变换其实包含了一系列的操作:平移,缩放,旋转等,不过所有的操作都可以通过这个仿射变换矩阵来实现。
zstar
2022/09/22
1.4K0
【OpenCV】Chapter3.图像的仿射变换
【图像处理】-- 仿射变换原理透析(附代码)
仿射变换(Affine Transformation)是几何学中一种重要的线性变换,广泛应用于图像处理、计算机视觉和图形学等领域。它包括平移、旋转、缩放、剪切等操作,能够保持图像的“仿射性”,即保持点的共线性和平行线不变。仿射变换可以通过矩阵运算来表示,通常使用一个 2×3 的变换矩阵来实现对二维图像的处理。与线性变换不同的是,仿射变换允许在变换过程中加入平移操作,使其更具灵活性和实用性。在实际应用中,仿射变换常用于图像的几何校正、目标对齐、图像配准等任务,是图像处理中不可或缺的基础工具之一。
用户11404404
2025/07/15
3130
图像保真旋转
import cv2 import numpy as np from math import * img=cv2.imread('C:/Users/xpp/Desktop/Lena.png') img[:,:,0]=255 def rotate(image,angle): height, width,channels=image.shape #变换后新图像的大小是原图像旋转后的轮廓外接矩形,注意这个外接矩形的长和高也是水平和竖直的 heightNew=int(width*fabs
裴来凡
2022/05/29
6740
图像保真旋转
图形学入门(一):坐标变换
将一个物体显示到屏幕上,这个事情似乎非常简单,以至于我们基本上认为它已经天经地义到直接告诉计算机我们要显示什么物体它就会自动显示出来,毕竟我们拍照的时候就是举起相机按下快门就会出现一张图片了。但事实上,相机是基于物理感光元件实现了从三维世界到二维图片的投影,在计算机的程序世界中一切都需要被计算出来,也就是说,我们只有一堆图形的描述信息,我们需要自己将这些图形在二维的平面上绘制的方式告诉操作系统,操作系统才能最终在屏幕上绘制出我们想要的图形。
zhiruili
2021/08/10
2K0
图形学入门(一):坐标变换
图像旋转矫正
11.0 uint8 3 0.017453292519943295 0.022727272727272728 0.022723360841641067 1.3019526725788753 -88.69804732742112
裴来凡
2022/05/29
9350
图像旋转矫正
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换 OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
  图像几何变换又称为图像空间变换,它将一副图像中的坐标位置映射到另一幅图像中的新坐标位置。我们学习几何变换就是确定这种空间映射关系,以及映射过程中的变化参数。图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:
vv彭
2020/10/27
4.4K0
10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换
    


OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)数字图像
[C++][opencv]基于opencv实现photoshop算法图像旋转
https://download.csdn.net/download/FL1623863129/89633167
云未归来
2025/07/21
1180
[C++][opencv]基于opencv实现photoshop算法图像旋转
MSRA-TD5000数据集使用详解
详情参考MSRA的官方地址:http://www.iapr-tc11.org/mediawiki/index.php/MSRA_Text_Detection_500_Database_(MSRA-TD500)
用户1154259
2018/09/21
2.1K0
MSRA-TD5000数据集使用详解
[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类、目标检测应用。
Eastmount
2022/11/25
3.1K0
OpenCV实现图像动画效果
动画视频 http://mpvideo.qpic.cn/0bf2cuaaqaaaiialis2ajjpfafodbakqacaa.f10002.mp4?dis_k=a63837cae801907643
用户9831583
2022/06/16
9150
【图像篇】OpenCV图像处理(七)---图像平移VS图像旋转
牛顿第一运动定律:物体加速度的大小跟作用力成正比,跟物体的质量成反比,且与物体质量的倒数成正比;加速度的方向跟作用力的方向相同。该定律是由艾萨克·牛顿在1687年于《自然哲学的数学原理》一书中提出的。
用户5410712
2022/06/01
1.5K0
【图像篇】OpenCV图像处理(七)---图像平移VS图像旋转
Flash/Flex学习笔记(42):坐标旋转
坐标旋转是个啥概念呢? 如上图,(蓝色)小球 绕某一中心点旋转a角度后,到达(红色)小球的位置,则红色小球相对中心点的坐标为: x1 = dx * cos(a) - dy * sin(a) y1 = 
菩提树下的杨过
2018/01/23
7360
Flash/Flex学习笔记(42):坐标旋转
视觉进阶 | Numpy和OpenCV中的图像几何变换
上面的图像使它不言而喻什么是几何变换。它是一种应用广泛的图像处理技术。例如,在计算机图形学中有一个简单的用例,用于在较小或较大的屏幕上显示图形内容时简单地重新缩放图形内容。
小白学视觉
2020/02/27
2.5K0
图像变换-旋转问题来了
上次写了图像变换-旋转问题,试一试?,后面留了个问题,本来就是随便说说的,留给大家一个探索的机会,刚好碰到最近事情也有点多,没空弄。
叶子陪你玩
2022/01/05
4870
图像变换-旋转问题来了
OpenCV新手入门,如何用它平移缩放和旋转图片
它不仅能用来实现各种复杂的算法,还能够对图像进行预处理:包括图像的平移、旋转、缩放、翻转、裁剪。
量子位
2021/02/01
2.2K0
OpenCV新手入门,如何用它平移缩放和旋转图片
OpenCV 几何变换-图像旋转
OpenCV提供了warpAffine函数实现图片仿射变换功能,我们可以利用这个函数实现图像旋转,函数原型为:
chaibubble
2022/05/07
3170
OpenCV 几何变换-图像旋转
2D坐标系中绘制旋转的椭圆-坐标变换
https://www.cnblogs.com/zhoug2020/p/7864898.html
周星星9527
2021/03/19
1.4K0
2D坐标系中绘制旋转的椭圆-坐标变换
OpenCV系列之图像的几何变换 | 十四
OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective,您可以使用它们进行各种转换。cv.warpAffine采用2x3转换矩阵,而cv.warpPerspective采用3x3转换矩阵作为输入。
磐创AI
2019/12/03
8410
经验 | OpenCV图像旋转的原理与技巧
初学图像处理,很多人遇到的第一关就是图像旋转,图像旋转是图像几何变换中最具代表性的操作,包含了插值、背景处理、三角函数等相关知识,一个变换矩阵跟计算图像旋转之后的大小公式就让很多开发者最后直接调用函数了事,但是其实这个东西并没有这么难懂,可以说主要是之前别人写的公式太吓人,小编很久以前第一次接触的也是被吓晕了!所以决定从程序员可以接受的角度从新介绍一下图像旋转基本原理与OpenCV中图像旋转函数操作的基本技巧。
OpenCV学堂
2020/12/18
3.1K0
【计算机视觉】二、图像形成:1、向量和矩阵的基本运算:线性变换与齐次坐标
  这种投影空间和投影变换在计算机图形学中被广泛使用,用于将三维物体投影到二维平面上进行显示。
Qomolangma
2024/07/30
4100
【计算机视觉】二、图像形成:1、向量和矩阵的基本运算:线性变换与齐次坐标
推荐阅读
相关推荐
【OpenCV】Chapter3.图像的仿射变换
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档