首页 > 其他分享 >单应性变换与仿射变换

单应性变换与仿射变换

时间:2024-01-24 09:45:08浏览次数:25  
标签:线性变换 单应性 变换 矩阵 旋转 坐标 仿射变换

参考链接:单应性变换与仿射变换 - 知乎 (zhihu.com)

一、齐次坐标

(1)从普通坐标转换成齐次坐标时

如果(x,y,z)是个点,则变为(x,y,z,1);

如果(x,y,z)是个向量,则变为(x,y,z,0)

(2)从齐次坐标转换成普通坐标时

如果是(x,y,z,1),则知道它是个点,变成(x,y,z);

如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

例如:对于一个普通坐标的P=(Px, Py, Pz),有对应的一族齐次坐标(wPx, wPy, wPz, w),其中w不等于零。比如,P(1, 4, 7)的齐次坐标有(1, 4, 7, 1)、(2, 8, 14, 2)、(-0.1, -0.4, -0.7, -0.1)等等。因此,如果把一个点从普通坐标变成齐次坐标,给x,y,z乘上同一个非零数w,然后增加第4个分量w;如果把一个齐次坐标转换成普通坐标,把前三个坐标同时除以第4个坐标,然后去掉第4个分量。

二、仿射变换

仿射变换是二维坐标到二维坐标之间的线性变换(相同平面)

1、概念

仿射变换包括如下所有变换,以及这些变换任意次序次数的组合:

仿射变换
  • 平移(translation)和旋转(rotation)的组合称为欧式变换或刚体变换
  • 放缩(scaling)可进一步分为uniform scaling和non-uniform scaling,前者每个坐标轴放缩系数相同(各向同性),后者不同;如果放缩系数为负,则会叠加上反射(reflection)
  • 刚体变换+uniform scaling称为相似变换,即平移+旋转+各向同性的放缩
  • 剪切变换(shear)将所有点沿某一指定方向成比例的平移
  • 排除了平移变换的所有仿射变换称为线性变换,有原点位置不变,多次线性变换的结果仍是线性变换
  • 实际上仿射变换可以看成基础的线性变换+平移的组合

通常仿射变换对点、线、面具有一定的保持性,这种保持性体现在:

  • 经过变换后,点还是点,线还是线,面还是面(如果不是仿射变换而是3D投影的话,在一定的视角下,面有可能变成线,线有可能变成点)
  • 经过变换后,平行线和平行面依然平行
  • 经过变换后,图形间的某些比例关系保持不变,比如两条平行线的长度比不变,点在线段中的位置比例保持不变

2、仿射变换矩阵

  • 平移量为0的仿射变换称为线性变换,可以用下列矩阵表示: 

  • 只有平移变换而没有线性变换的仿射变换,可以用下列矩阵表示: 

  • 将同时含有线性变换和平移变换的仿射变换,用下列矩阵表示:

仿射变换的变换矩阵统一用 [������001] 来描述,不同基础变换的a,b,c,d,e,f约束不同,如下所示:

使用三组坐标点,即可求出仿射变换矩阵

3、实验

(1)平移变换

代码:

结果:

平移结果

(2)旋转

用数学式子表示可以表示

设top为旋转后最高点的纵坐标,down为旋转后最低点的纵坐标,left为旋转后最左边点的横坐标,right为旋转后最右边点的横坐标。

原图像的像素坐标要经过三次的坐标变换:

  1. 将坐标原点由图像的左上角变换到旋转中心
  2. 以旋转中心为原点,图像旋转角度a
  3. 旋转结束后,将坐标原点变换到旋转后图像的左上角

可以得到下面的旋转公式:(x’,y’)旋转后的坐标,(x,y)原坐标,(x0,y0)旋转中心,a旋转的角度(顺时针)

代码:

结果:

旋转结果

(3)仿射变换

在opencv中提供了对应的仿射变换的API接口函数warpAffine

进行仿射变换时,首先要得到仿射变换矩阵,为了实现这个功能,常常使用getRotationMatrix2D()函数用来计算二维旋转矩阵,这个变换会将旋转中心映射到它自身

Mat getRotationMatrix2D( Point2f center, double angle, double scale );

这个函数中有三个参数,第一个参数是Point2f类型的center,也就是原图像的旋转中心;第二个参数是double 类型的angle,也就是我们说的旋转角度,值得一提的是,当angle的值为正时,表示的是逆时针旋转,当angle的值为负时,表示的是顺时针旋转。第三个参数scale表示的是缩放系数

具体矩阵计算为:

得到仿射变换矩阵后,即可调用仿射函数:

参数解释
. src: 输入图像
. dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致
. M: 2X3的变换矩阵
. dsize: 指定图像输出尺寸
. flags: 插值算法标识符

代码:

结果:

仿射变换结果

三、单应性变换

“用无镜头畸变的相机从不同位置拍摄同一平面物体的图像之间存在单应性,可以用投影变换(单应性变换)表示”

1、概念

单应(Homography)是射影几何中的概念,又称为射影变换。它把一个射影平面上的点(三维齐次矢量)映射到另一个射影平面上,并且把直线映射为直线,具有保线性质。总的来说,单应是关于三维齐次矢量的一种线性变换,可以用一个3×3的非奇异矩阵H表示,简单来说单应性变换是一个平面到另一个平面的变换关系

2、单应矩阵

用数学表达为:

单应矩阵 3×3 的求解过程为:

单应矩阵具有8个自由度,求解时一般添加约束 ℎ33=1 ,所以还有 ℎ11∼ℎ32 共8个未知数。由于一组匹配点 对应2组方程,那么只需要 4 组不共线的匹配点即可求解H的唯一解。

3、实验

代码:

结果:

输入 单应变化结果

四、仿射变换与单应性变换

二者的应用场景相同,都是针对二维图片的变换。仿射变换affine是透视变换的子集,透视变换是通过homography单应矩阵实现的

 

S为缩放因子

从数学的角度,homography即H阵,是一个秩为3的可逆矩阵:

由于第三行没有未知数,仿射矩阵最常用的是两行三列的形式。计算H阵需要4对不共线点,计算仿射阵只需要3对不共线的点。

affine一般比homography更稳定一些,所以可以先计算affine,然后再用affine作为homography的初始值,进行非线性优化。

标签:线性变换,单应性,变换,矩阵,旋转,坐标,仿射变换
From: https://www.cnblogs.com/jimchen1218/p/17983923

相关文章

  • 无涯教程-MATLAB - 变换(Transforms)
    MATLAB提供了用于处理变换的命令,例如Laplace和Fourier变换,转换在科学和工程中用作简化分析并从另一个角度查看数据的工具。例如,傅立叶变换允许我们将表示为时间函数的信号转换为频率函数,拉普拉斯变换使我们能够将微分方程转换为代数方程。MATLAB提供了laplace,傅立叶和fft命......
  • HM变换系数修改
    一.边预测边修改:(1)在 TEncCu::compressCtu中提取分块信息://analysisofCUDEBUG_STRING_NEW(sDebug)xCompressCU(m_ppcBestCU[0],m_ppcTempCU[0],0DEBUG_STRING_PASS_INTO(sDebug));/*stringctu=to_string(pCtu->getCtuRsAddr());ofstream......
  • OpenCV仿射变换+投射变换+单应性矩阵
    OpenCV仿射变换+投射变换+单应性矩阵本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~estimateRigidTransform():计算多个二维......
  • 【笔记-Manim】空间与变换
    【笔记-Manim】空间与变换所有常量都可以在constants.py中找到屏幕空间屏幕中心为原点(0,0,0),遵循右手坐标系,向右为x轴正方向,向上为y轴正方向,向前为z轴负方向,旋转时正方向为顺时针方向。相关常量名称描述FRAME_HEIGHT屏幕高度,默认为8FRAME_WIDTH屏幕宽度,默认为......
  • 开关电源的设计反激变换器
    开关电源的设计是一份非常耗时费力的苦差事,需要不断地修正多个设计变量,直到性能达到设计目标为止。本文step-by-step介绍反激变换器的设计步骤,并以一个6.5W隔离双路输出的反激变换器设计为例,主控芯片采用NCP1015。基本的反激变换器原理图如图1所示,在需要对输入输出进行电气隔......
  • 基于TIC6000 DSP教学实验箱_数字图像处理操作教程:5-20 图像离散余弦变换(LCD显示)
    一、实验目的学习图像离散余弦变换的原理,掌握图像的读取方法,并实现在LCD上显示余弦变换前后的图像。二、实验原理图像离散余弦变换图像的离散余弦变换广泛用于图像的压缩。对原始图像进行离散余弦变换,变换后DCT系数能量主要集中在左上角,其余大部分系数接近于零,DCT具有适用于图像压......
  • 双向广搜->字符变换(洛谷P1032)
    题意:给起始和终止串A和B,以及不超过6个字符串变换规则,求A->B能否在10步以内变换完成。分析:暴力bfs每次有6条路可以走,时间复杂度是6^10大概6e8的时间复杂度,会TLE。于是这题是一道经典的双向bfs。直接开两个队列,两个map,暴力搜1~5步即可。双向bfs的时间复杂度是2*(6^5)=1e4......
  • 二维离散傅立叶变换的性质
    二维离散傅立叶变换的性质周期性线性微分性质旋转性质令则可分离性空域平移性质频域平移性质平均和对称性质......
  • Advanced Algebra高等代数 - 多元建模有多个方程(多元线性)组成 - 使用 NumPy 实现 矩
    线性:指多元变量的每一元变量都是1次方(可以将高于1次方的元,以新一元变量代换,求解再做开方运算)将应用问题转化为多个多元线性方程,并成一组;由多元线性方程组抽出增广矩阵,并以“消元法”的策略,步步判断求解;对增广矩阵的多个“方程”应用“行消元法”化简成阶......
  • 6. N 字形变换(中)
    目录题目题解题目题解classSolution:defconvert(self,s:str,numRows:int)->str:ifnumRows<2:#如果行数小于2,不需要转换,直接返回原始字符串returnsres=[""for_inrange(numRows)]#创建一个列表,用于存储按行转换后......