仿射变换原理和其OpenCV-Python实现知识汇总

☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython

一、仿射变换概念和类型

图像几何变换又称为图像空间变换,是各种图像处理算法的基础。它是在不改变图像内容的情况下,对图像像素进行空间几何变换的处理方式。它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置,其实质是改变像素的空间位置,估算新空间位置上的像素值。

图像的几何变换包括透视变换和仿射变换,透视变换又称为投影变换、投射变换、投影映射,透视变换是将图片投影到一个新的视平面,它是二维(x,y)到三维(X,Y,Z)、再到另一个二维(x’,y’)空间的映射。

仿射变换又称为图像仿射映射,可以认为是透视变换的一种特殊情况,是透视变换的子集,仿射变换是从二维空间到自身的映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间,也就是图像仿射变换等于图像线性变换和平移的组合。

仿射变换包括平移(translation)、旋转(rotation)、缩放(scaling)、错切(shear )四种类型:

平移和旋转两者的组合不改变图像的大小和形状,只有图像的位置(平移变换)和朝向(旋转变换)发生改变,称之为欧式变换(Euclidean transformation)或刚体变换(rigid transformation),刚性变换是最一般的变换
缩放又分为等比例缩放(uniform scaling)和非等比例缩放(non-uniform scaling),如果缩放系数为负数,则会叠加翻转(reflection,又翻译为反射、镜像),因此翻转可以看成是特殊的缩放
欧式变换和等比例缩放保持了图像外观没有变形,因此二者的组合称为相似变换(similarity transformation)
错切是保持图形上各点的某一坐标值不变,而另一坐标值关于该保持不变坐标值进行线性变换。坐标不变的轴称为依赖轴,其余坐标轴称为方向轴。错切分为水平错切和垂直错切。

二、基本仿射变换矩阵

在《https://blog.csdn.net/LaoYuanPython/article/details/113788380 图像仿射变换原理3:仿射变换类型及变换矩阵详解》中介绍了包括平移(translation)、旋转(rotation)、缩放(scaling)、错切(shear )四种类型仿射变换的变换矩阵。

  • 平移变换基本仿射变换矩阵
    在这里插入图片描述

  • 旋转变换基本仿射变换矩阵(θ为顺时针旋转角度)
    在这里插入图片描述

  • 水平错切基本仿射变换矩阵(α为错切角)
    在这里插入图片描述

  • 垂直错切基本仿射变换矩阵(β为错切角)
    在这里插入图片描述

  • 缩放变换基本仿射变换矩阵(kx和ky分布为水平缩放因子和垂直缩放因子)
    在这里插入图片描述

  • 上面介绍的仿射矩阵实际上并不是标准称呼上的仿射矩阵,而是一种用于两个平面间进行透视变换的3*3单应性矩阵,真正的仿射矩阵是2*3的矩阵,比单应性矩阵少一行,OpenCV中warpAffine函数使用的矩阵就是2*3的矩阵。

三、老猿关于仿射变换的总结文章

下面是老猿这阵子学习的成果总结,阅读这些文章可以让对仿射变换甚至线性代数无基础的人员快速理解仿射变换的原理、仿射变换过程以及OpenCV-Python关于仿射变换的支持能力及应用。
注意:前面星号标记的原理相关文章为付费专栏文章:

  1. *https://blog.csdn.net/LaoYuanPython/article/details/113743213 图像仿射变换原理1:齐次坐标来龙去脉详解 :本文从基础的欧式空间、投影空间、笛卡尔坐标、向量、矩阵、线性空间着手介绍,从向量空间的点和向量的表示法着手说明齐次坐标概念引入的过程,并介绍了齐次坐标的作用

  2. *https://blog.csdn.net/LaoYuanPython/article/details/113804210 图像仿射变换原理2:矩阵变换、线性变换和图像线性变换矩阵:图像线性变换是仿射变换的子集,包括图像的旋转、错切、缩放以及几者的组合叠加,线性变换的图像和原图像相比,坐标原点保持不变、直线变换后是直线或原点,平行线变换后还是平行。所有图像线性变换都可以使用图像变换矩阵和图像平面空间向量的乘积来表示,本文分析了图像线性变换的代数表示方法以及对应变换矩阵。

  3. *https://blog.csdn.net/LaoYuanPython/article/details/113788380 图像仿射变换原理3:仿射变换类型及变换矩阵详解:本文介绍了仿射变换的类型及其关系以及仿射变换矩阵,基本的仿射变换包括平移、旋转、缩放和错切,镜像可以看做特殊的缩放。实际中一般图像的仿射变换就是平移、旋转、缩放和错切的叠加组合,每叠加一个处理,就进行一次仿射变换矩阵和齐次坐标的乘法,再进行一次处理则再乘一次对应变换的矩阵。

  4. *https://blog.csdn.net/LaoYuanPython/article/details/113841635 图像仿射变换原理4:组合变换及对应变换矩阵:本文介绍了组合(也称复合)仿射变换的概念、变换过程以及变换矩阵,并以绕指定点旋转的组合变换、指定直线作为依赖轴的组合变换详细介绍了变换过程和变换矩阵的构成,有助于深入理解仿射变换的概念和处理过程。

  5. *https://blog.csdn.net/LaoYuanPython/article/details/113879385 图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现:本节以绕图像中心点顺时针循环旋转的组合仿射变换和以图像中心点开始与x轴成30°夹角的线段作为依赖轴的循环错切的组合仿射变换为例,详细介绍了二者的OpenCV-Python实现。通过相关案例的介绍,对前面4节介绍的仿射变换原理将有更深入的认识。

  6. https://blog.csdn.net/LaoYuanPython/article/details/113832562 OpenCV-Python图像处理:仿射变换详解:本节介绍了仿射变换的概念、类型、基本仿射变换矩阵、OpenCV-Python与仿射变换相关的主要函数及语法说明,并提供了两种不同方式实现的图像旋转和任选三个点将圈定子图放大的示例。通过阅读相关内容可以有助于大家理解仿射变换的概念和仿射变换的OpenCV-Python实现方法。

  7. https://blog.csdn.net/LaoYuanPython/article/details/113924512 OpenCV仿射变换:getAffineTransform的案例 :本部分介绍了OpenCV-Python的getAffineTransform函数,并通过在图像上任选三个点指定为结果图像的左上角、左下角、右下角,从而实现原图像三个点圈定范围的子图像通过仿射变换实现整体放大。

  8. https://blog.csdn.net/LaoYuanPython/article/details/113866576 OpenCV-Python仿射变换开发中遇到的坑 : 本文介绍了老猿在使用OpenCV-Python进行仿射变换开发中遇到的坑,这些问题可能大家或多或少会碰到,这些问题涉及基本知识的理解、官方资料的坑等方面。

四、老猿使用的网上参考资料

在学习过程中老猿查阅了大量资料,以下是老猿认为比较有价值的部分文章:

  1. 仿射变换及其变换矩阵的理解
  2. [Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)
  3. 线性变换
  4. 线性代数(一)矩阵、矩阵乘法的由来
  5. 基本图像变换:线性变换,仿射变换,投影变换
  6. 仿射变换与投影变换
  7. 【Computer Vision】图像单应性变换/投影/仿射/透视
  8. 如何通俗地讲解「仿射变换」这个概念?
  9. 图像处理的仿射变换与透视变换
  10. python+opencv图像变换的两种方法cv2.warpAffine和cv2.warpPerspective
  11. 坐标系旋转变换公式图解
  12. 变换(二维与三维)
  13. 仿射变换和透视变换
  14. 矩阵本质-基变换与线性变换
  15. 3D图形:矩阵与线性变换

五、后记

当今年元旦期间开始学习OpenCV-Python的仿射变换时,刚开始看到相关公式老猿就懵了,大学学习的线性代数全部还给老师了,基本概念都忘光了。想方设法找了本大学时代的线性代数教材:
在这里插入图片描述
从头开始温习,并查阅各种资料,经过40余天的温习和学习,终于将仿射变换的概念、原理以及OpenCV-Python的实现融会贯通了,将其总结出来多篇博文确保对线性代数无基础者都能看懂,肯定能对需要的人有所帮助。

更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。

更多图像处理的数学基础知识请参考专栏《人工智能数学基础 https://blog.csdn.net/laoyuanpython/category_10382948.html

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

如果对文章内容存在疑问,可以在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值