理论

设原始图像的任意点 P0(x0,y0)P_0(x_0, y_0)P0​(x0​,y0​) 经顺时针旋转 β\betaβ 角度后到新的位置 P(x,y)P(x,y)P(x,y),为表示方便,采用极坐标形式表示,原始点的角度为 α\alphaα。根据极坐标与直角坐标的关系,原始图像的点 P0(x0,y0)P_0(x_0, y_0)P0​(x0​,y0​) 的极坐标为

{x0=rcosαy0=rsinα\left\{ \begin{matrix} x_0 = r {\rm cos} \alpha \\ y_0 = r {\rm sin} \alpha \end{matrix} \right. {x0​=rcosαy0​=rsinα​

旋转到新位置以后 P(x,y)P(x, y)P(x,y) 的极坐标为

{x=rcos(α−β)=rcosαcosβ+rsinαsinβy=rsin(α−β)=rsinαcosβ−rcosαsinβ\left\{ \begin{matrix} x = r {\rm cos} (\alpha - \beta) = r{\rm cos}\alpha {\rm cos} \beta + r{\rm sin}\alpha {\rm sin}\beta\\ y = r {\rm sin} (\alpha - \beta) = r{\rm sin}\alpha {\rm cos} \beta - r{\rm cos}\alpha {\rm sin}\beta \end{matrix} \right. {x=rcos(α−β)=rcosαcosβ+rsinαsinβy=rsin(α−β)=rsinαcosβ−rcosαsinβ​

由于旋转后的点 P(x,y)P(x, y)P(x,y) 需要用 P0(x0,y0)P_0(x_0, y_0)P0​(x0​,y0​) 表示,对上式进行简化,得

{x=x0cosβ+y0sinβy=−x0sinβ+y0cosβ\left\{ \begin{matrix} x = x_0 {\rm cos} \beta + y_0{\rm sin}\beta\\ y = -x_0 {\rm sin} \beta + y_0 {\rm cos}\beta \end{matrix} \right. {x=x0​cosβ+y0​sinβy=−x0​sinβ+y0​cosβ​

用矩阵表示如下:

[xy1]=[cosβsinβ0−sinβcosβ0001][x0y01]\left[\begin{matrix} x \\ y \\ 1 \end{matrix}\right]= \left[\begin{matrix} {\rm cos} \beta & {\rm sin} \beta & 0\\ -{\rm sin} \beta & {\rm cos} \beta & 0\\ 0 & 0 & 1 \end{matrix}\right] \left[\begin{matrix} x_0 \\ y_0 \\ 1 \end{matrix}\right] ⎣⎡​xy1​⎦⎤​=⎣⎡​cosβ−sinβ0​sinβcosβ0​001​⎦⎤​⎣⎡​x0​y0​1​⎦⎤​

记上式中变换矩阵为

R=[cosβsinβ0−sinβcosβ0001]R = \left[\begin{matrix} {\rm cos} \beta & {\rm sin} \beta & 0\\ -{\rm sin} \beta & {\rm cos} \beta & 0\\ 0 & 0 & 1 \end{matrix}\right] R=⎣⎡​cosβ−sinβ0​sinβcosβ0​001​⎦⎤​
为旋转矩阵。

上述变换是针对原点的,如果指定了旋转中心,可以先按上述方式进行旋转,再把旋转后的中心平移到旋转前的中心。具体地,设旋转前的中线坐标为 C0(x0,y0)C_0(x_0, y_0)C0​(x0​,y0​),则旋转后的坐标为 C(x,y)C(x,y)C(x,y),根据上面的关系,两个点的坐标关系即由上面矩阵变换确定。则旋转中心平移量为 CC0⃗=C0−C\vec{CC_0}=C_0 - CCC0​​=C0​−C,代入 (x,y)(x,y)(x,y),可得
CC0⃗=[ΔxΔy]=[x0−xy0−y]=[x0(1−cosβ)−y0sinβx0sinβ+y0(1−sinα)]\vec{CC_0}= \left[ \begin{matrix} \Delta x\\ \Delta y \end{matrix} \right]= \left[ \begin{matrix} x_0 - x\\ y_0 - y \end{matrix} \right]=\left[ \begin{matrix} x_0(1-{\rm cos} \beta) - y_0{\rm sin}\beta\\ x_0 {\rm sin} \beta + y_0 (1 - {\rm sin}\alpha) \end{matrix} \right] CC0​​=[ΔxΔy​]=[x0​−xy0​−y​]=[x0​(1−cosβ)−y0​sinβx0​sinβ+y0​(1−sinα)​]

根据上一节,则平移对应的平移矩阵为

T=[10Δx01Δy001]T = \left[\begin{matrix} 1 & 0 & \Delta x\\ 0 & 1 & \Delta y\\ 0 & 0 & 1 \end{matrix}\right] T=⎣⎡​100​010​ΔxΔy1​⎦⎤​

则旋转后再平移,对应矩阵为

M=TR=[10Δx01Δy001][cosβsinβ0−sinβcosβ0001]=[cosβsinβΔx−sinβcosβΔy001]=[cosβsinβx0(1−cosβ)−y0sinβ−sinβcosβx0sinβ+y0(1−sinα)001]M = TR = \left[\begin{matrix} 1 & 0 & \Delta x\\ 0 & 1 & \Delta y\\ 0 & 0 & 1 \end{matrix}\right] \left[\begin{matrix} {\rm cos} \beta & {\rm sin} \beta & 0\\ -{\rm sin} \beta & {\rm cos} \beta & 0\\ 0 & 0 & 1 \end{matrix}\right] =\left[\begin{matrix} {\rm cos} \beta & {\rm sin} \beta & \Delta x\\ -{\rm sin} \beta & {\rm cos}\beta &\Delta y\\ 0 & 0 & 1 \end{matrix}\right] =\left[\begin{matrix} {\rm cos} \beta & {\rm sin} \beta & x_0(1-{\rm cos} \beta) - y_0{\rm sin}\beta \\ -{\rm sin} \beta & {\rm cos}\beta &x_0 {\rm sin} \beta + y_0 (1 - {\rm sin}\alpha)\\ 0 & 0 & 1 \end{matrix}\right] M=TR=⎣⎡​100​010​ΔxΔy1​⎦⎤​⎣⎡​cosβ−sinβ0​sinβcosβ0​001​⎦⎤​=⎣⎡​cosβ−sinβ0​sinβcosβ0​ΔxΔy1​⎦⎤​=⎣⎡​cosβ−sinβ0​sinβcosβ0​x0​(1−cosβ)−y0​sinβx0​sinβ+y0​(1−sinα)1​⎦⎤​
对于 OPENCV 的

cv2.getRotationMatrix2D()

乘以缩放系数,并取了上述变换矩阵 MMM 的前两行(第三行恒为 [0,0,1][0,0,1][0,0,1]。

实现

代码

import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltdef show(img):if img.ndim == 2:plt.imshow(img, cmap='gray', vmin=0, vmax=255)else:img = cv.cvtColor(img, cv.COLOR_BGR2RGB)plt.imshow(img)plt.show()img = cv.imread('pic/rabbit500x333.jpg')
# 以(80,100)为中心,顺时针旋转45度
rotateM = cv.getRotationMatrix2D((80, 100), 45, 1)
img_rotate = cv.warpAffine(img, rotateM, dsize=(500, 500))
show(img_rotate)

效果


说明:

  1. 未经许可,谢绝转载。
  2. 本教程为《数字图像处理Python OpenCV实战》的配套代码相关内容。
    免费视频教程为0-6章(标题号≤6),可在此处点击观看。
    所有课件及源代码可在此处下载:
    链接:https://pan.baidu.com/s/198PySe_vebO3e06idHSQ6g
    提取码:11o4
    有问题可在QQ群(1079300899)指出,进群答案:数字图像处理。在本文评论指出可能导致回复很晚。

3.2 图像几何变换——旋转变换相关推荐

  1. Python 计算机视觉(五)—— OpenCV 进行图像几何变换

    几何变换不改变图像的像素值,只是实现图像像素点的重新安排:恰当的进行图像的几何变换,可以减小甚至避免由于角度等一些因素造成的图像失真问题,有利于我们在识别图像时将注意力集中到图像的有效信息中而不至于被 ...

  2. [Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. 图像几何变换--缩放、平移、镜像、旋转

    目录 一.图像几何变换基础 二.平移 三.缩放 四.旋转 五.镜像 六.复合变换 七.变换矩阵总结 八.完整代码 一.图像几何变换基础 1.图像的几何变换是指原始图像按照需要产生大小.形状和位置的变化 ...

  5. [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放)

    C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放) 移动 旋转 镜像 转置 缩放 自定义结构及函数如下: #define pi 3.1415926 typedef struct {unsig ...

  7. 图像几何变换C++实现--镜像,平移,旋转,错切,缩放

    一.图像几何变换介绍 图像的几何空间变换是图像处理中的最基础的算法,是指对原始图像按需要改变其大小.形状和位置的变化,原始图像与目标函数之间的坐标变换函数为线性函数.二维图像的基本几何变换主要包括镜像 ...

  8. [Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. 图像算法二:【图像几何变换】平移、镜像、转置、缩放、旋转、插值

    作为一个强大的科学计算软件,MATLAB广泛运用于较多领域,以其简单的编程风格著称.这篇文章便通过matlab语言来讲述如何进行图像的各种几何变换. 图像几何变换又称为图像空间变换,它是将一幅图像中的 ...

最新文章

  1. iOS纯代码工程手动快速适配
  2. Cardinality 对执行计划的重要性
  3. 通过PSO实现不同函数的目标值计算和搜索
  4. 在windows下运行Felzenszwalb的Deformable Part Model(DPM)源码voc-release3.1来训练自己的模型
  5. effective c++条款11扩展——关于拷贝构造函数和赋值运算符
  6. 一个风骚的C语言操作
  7. ncurses下c语言定位光标,C指针原理教程之Ncurses介绍
  8. html怎样在一张图片里写字,用HTML代码在图片上写字
  9. 图片相册社区类型小程序模板
  10. [cb]ScriptableObject 序列化
  11. 一阶rc电路时间常数_关于RC延时电路的延时时间计算
  12. 这款 Android 图片选择库美哭了
  13. 一次非常成功的项目经验分享和糟糕项目的对比
  14. navicat怎么导入sql数据库文件
  15. adadelta算法_【深度学习】深入理解优化器Optimizer算法(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)...
  16. Android百度浏览器深色模式,深色模式适配指南
  17. 网口压线顺序_水晶头压线顺序
  18. C语言 递推算法 案例猴子偷桃
  19. R、RStudio的下载及安装及RStudio打开后空白的解决
  20. 卷积神经网络的参数计算

热门文章

  1. Android ui 透明度设置
  2. Kali Linux渗透测试 106 离线密码破解
  3. 掘金—幸运抽奖转盘部分HTML+CSS代码
  4. 后端用户注册及发送短信验证码3
  5. 04-长连接,短连接,连接池
  6. 等保测评之安全通信网络
  7. 开源项目演示_3种开源工具可让您的演示文稿流行
  8. 无损音乐刻录成cd有意义吗_使用Nero把整轨无损文件刻录成CD
  9. dmesg -T java_天天学一个 Linux 命令(43):dmesg
  10. 叛乱2服务器显示杀敌,玩叛乱2为什么进不去服务器 | 手游网游页游攻略大全