通过矩阵操作实现点的2D线性变换(几何变换、仿射变换)
1) 求一个点沿坐标轴缩放后的位置
2)已知一个点的位置和它绕原点旋转的角度,求旋转后的位置
注意此时的是我们设的一个值,最后会被所替代掉。
注意,trigonometric addition identities就是中学必背的三角函数变换公式:
3)已知一个点的位置和它绕另外一点旋转的角度,和另外一点的位置,求旋转后的位置
若o不是原点,则可先将a点坐标转换为相对坐标计算,计算结果再加上o点坐标。
b.x = (a.x - o.x)*cos(angle) - (a.y - o.y)*sin(angle) + o.x
b.y = (a.x - o.x)*sin(angle) + (a.y - o.y)*cos(angle) + o.y
4)反射
5)组合变换
6)二维变换分解
7)平移和仿射变换(Translation and Affine Transformation)
之前的变换只能对向量进行缩放或旋转,不能平移。要平移需要用下面的方法。
可是单独出现一个上面的平移计算相对于一连串的矩阵乘法而言,增加了计算的复杂度。
解决的方案是在之前的线性变换矩阵中加一个平移用的vector,之前的m部分负责旋转缩放,而增加的vector负责平移,这样就实现了旋转缩放再平移的组合操作,我们
称之为仿射变换(Affine Transformation)。
可那位朋友问了,不是说想实现仅平移吗,怎么还夹带了旋转缩放操作呢?
其实只要控制,使旋转为0,缩放为1,不就实现了仅平移操作了吗,如下,
仿射变换其实也可以表示之前的旋转或缩放操作,只需要把平移vector变成[0, 0, 1],如下
注意到2D的向量[x, y],我们转换成了[x, y, 0] 或 [x, y, 1],选补0还是补1,取决于最后要求的是位移还是坐标。
8)变换矩阵的逆
9) 代码实战
平移一张图片, x轴移动100,y轴移动50
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))
cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()
这里面cv.warpAffine()的第三个参数是输出图片的尺寸,which should be in the form of **(width, height)**.
以图片中心为原点,对整个图片逆时针旋转90度
img = cv.imread('messi5.jpg',0)
rows,cols = img.shape
# cols-1 and rows-1 are the coordinate limits.
M = cv.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(cols,rows))
以图片中心为原点,对点()逆时针旋转90度
M = cv.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), 90, 1)
t0 = np.array([[x0], [y0], [1]], np.int32)
t1 = np.matmul(M, t0)
x1 = int(t1[0][0])
y1 = int(t1[1][0])
通过矩阵操作实现点的2D线性变换(几何变换、仿射变换)相关推荐
- 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结
Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...
- java 矩阵求逆_java实现的顺时针/逆时针打印矩阵操作示例
java实现的顺时针/逆时针打印矩阵操作.分享给大家供大家参考,具体如下: public class SnakeMatrix { /** * 定义矩阵的阶数 */ private int n; //填 ...
- 矩阵逆时针旋转90度JAVA_java实现的顺时针/逆时针打印矩阵操作示例
java实现的顺时针/逆时针打印矩阵操作.分享给大家供大家参考,具体如下: public class SnakeMatrix { /** * 定义矩阵的阶数 */ private int n; //填 ...
- 玩转 ArrayFire:07 数组和矩阵操作
目录 前言 一.数组和矩阵操作函数 1. flat( ) 2. flip( ) 3. join( ) 4. moddims( ) 5. reorder( ) 6. shift( ) 7. tile( ...
- opencv2矩阵操作
文章转载自新浪博客:http://blog.sina.com.cn/s/blog_7908e1290101i97z.html 综述: OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方 ...
- Jama包的矩阵操作
近段时间因为某些功能,需要对矩阵进行操作,然后百度了一下java对矩阵操作的包:一个是math3,另一个是Jama. 从我搜到的内容来看,Jama包对矩阵的操作稍微比math3丰富一些,所以我选择了J ...
- OpenCV矩阵操作
矩阵类的成员函数可以进行很多基本的矩阵操作,在之前已经介绍过.除此之外,也有很多操作被表示为"友元"函数,它们的输入为矩阵类型,或者输出为矩阵类型,或者输入输出同为矩阵类型.下面将 ...
- python 读取图片成为一维数组_python+opencv 图像的数组和矩阵操作
在调用opencv的imread函数读取图像时,我们得到的其实是一个类型为numpy.ndarray的n维数组.这个数组的维度是[height,width,3],它是由每个像素的RGB通道的灰度值组成 ...
- python正态分布随机数_Python使用numpy产生正态分布随机数的向量或矩阵操作示例...
本文实例讲述了Python使用numpy产生正态分布随机数的向量或矩阵操作.分享给大家供大家参考,具体如下: 简单来说,正态分布(Normal distribution)又名高斯分布(Gaussian ...
- Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作...
%测试数据 'ex1data1.txt', 第一列为 population of City in 10,000s, 第二列为 Profit in $10,000s 1 6.1101,17.592 2 ...
最新文章
- docker容器-实战(分享十六)
- 最小熵原理:“物以类聚”之从图书馆到词向量
- [转] 程序员面试题精选100题(35)-找出两个链表的第一个公共结点
- 一步步编写操作系统 50 加载内核3
- svchost占用内存过高_是什么导致你的Java服务器内存和CPU占用过高呢
- Spring源码追踪3——AOP机制
- C/C++库函数math用法案例篇一
- vue中获取输入框中得到值_如何获取vue input的值
- 设计模式03-工厂方法
- thinkphp 表单令牌
- tensorflow小案例
- C# 创建、读取Excel公式
- mysql数据库恢复
- html lab颜色,颜色标准LAB值对照表
- 利用tftpd32拷贝windows文件到虚拟机ubuntu中
- java 一年有多少周_用java怎么计算当前年有多少周
- 基于Pygame的中国象棋的制作(China Chess)
- primeng的Tree初始化选中,实现联动效果
- HFDS的Shell操作
- linux下rename用法--批量重命名
热门文章
- LSI存储论坛:6Gb SAS让DAS焕发新活力?
- 我个人的未来5年IT学习计划
- Iterm2 配置(不断更新)
- matplotlib绘制李萨如图(二) animation实现动态2D李萨如图
- http抓包实践--(一)--fiddler和http(s)
- k8s中资源对象单数、复数、简写的区别
- 三本学计算机没用吗,腾讯员工:我211学计算机都觉得写代码难,三本的人能写代码为啥考不上211...
- python优点和特点-Python的优点和缺点有哪些?Python语言的特点
- 服务器虚拟机要怎么安装,服务器虚拟机怎么安装
- 初级药师职称需要考计算机英语吗,药师职称评审政策解读:初级药师不用再考了!...