仿射变换和透视变换

本文介绍图像处理基本算法中的仿射变换和透视变换,可分别看作二维和三维坐标变换。阐述了求解所需映射点数量,还提及图像几何变换步骤、插值运算方法。介绍仿射变换的两种基本方法,以及图像扭曲的映射方式和操作步骤。

图像处理基本算法--仿射变换和透视变换

仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”或者“二维坐标变换”和“三维坐标变换”。一个是二维坐标(x,y),一个是三维坐标(x,y,z)。也就是:

 

仿射变换:
这里写图片描述

透视变换:
这里写图片描述

从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。

 



图像最常用的是仿射变换一般形式如下:

(x, y)为变换后的坐标,(v, w)为变换前的坐标。通过变换矩阵T,可以进行图像的缩放,旋转,平移等。

 

空间图像几何变换包括两个主要步骤:

(1) 空间坐标变换

(2)变换坐标的赋值、插值运算

有了上面仿射矩阵的坐标的变换,下面一步就是进行像素灰度级的赋值了。从原始图像映射到变换图像,赋值的时候需要进行插值运算。通常情况下有三种插值运算:最邻近插值法、双线性插值法、双三次插值法。【代码最后做了双线性内插的,保证得到的图像更平滑。】

在仿射变换的一般表达式中,有两种基本的变换方法。第一种是forward mapping, 第二种 是inverse mapping(backward mapping)。在inverse mapping 中,(v, w) = T¬-1(x, y)。一般情况下,inverse mapping 比forward mapping更有效。仿射变换的原始坐标中,首先将原坐标变换为齐次坐标(齐次坐标的理解)。并且经过仿射变换后,你有了图像插值的基础,这样你就可以学习Image Warping了。姑且翻译为图像扭曲吧。Image Warping 同时也分为 Forward Warping 和 Backward Warping。

【前向映射一个问题是,输入图像的的两个或多个像素会映射到输出图像的同一个位置,另一种可能是某些输出位置完全没有像素,因此反向映射比前向映射更加有效】

 

Image Warping:

 

和Mapping一样,都是从原始图像向目标图像映射。其中(x’,y’)= T(x,y),x,y为原始图像坐标。同理,作为Backward Warping则为相反的方向。

 

其中,(x,y) =inverse(T (x’,y’))。就是从目标图像向原始图像进行映射了。

 

总结图像做图像扭曲(warp)步骤是:先根据两幅图像的三对对应点计算出仿射变换矩阵,再将原图像根据这个变换矩阵变换到后图像(插值)(或采取逆向)

<think>好的,我现在需要帮助用户理解仿射变换透视变换之间的区别,特别是在维度上的差异。首先,我得回顾一下自己对这些概念的理解,确保准确无误。 根据用户提供的引用资料,仿射变换是二维的线性变换,保持平行性角度关系,而透视变换属于三维投影变换,会导致平行线相交,属于非线性变换。用户特别关注维度上的差异,所以我需要重点比较两者在处理维度转换时的不同步骤。 首先,我需要明确仿射变换的数学表示。根据引用[3],仿射变换使用一个可逆矩阵A,可能包括平移、旋转、缩放剪切。变换后的点仍然在二维平面上,只是坐标被线性变换。例如,仿射变换的矩阵是2x3的,应用时每个点(x,y)通过矩阵乘法平移得到新的坐标。这里需要注意,仿射变换虽然可以引入三维矩阵运算,但结果仍投影回原二维空间,如引用[4]提到的,变换后的Z值保持为1,因此不影响最终投影。 接下来是透视变换,也就是射影变换。根据引用[1],透视变换有8个自由度,而仿射变换有6个。这说明透视变换的参数更多,能够处理更复杂的形变。关键点在于,透视变换矩阵是3x3的,并且变换后的点需要除以Z坐标(在齐次坐标中),这导致非线性效应。例如,引用[4]提到,透视变换会将二维点提升到三维,再进行投影,导致平行线可能不再平行。这一点在维度处理上与仿射不同,仿射变换虽然也可能用到三维矩阵,但不会改变Z值,因此投影时直接忽略Z,保持线性。 用户可能存在的疑问是:为什么同样是使用矩阵,仿射透视在维度处理上有这样的差异?根据引用[4],仿射变换透视变换的特例,当透视矩阵的第三行特定元素为零时,就退化为仿射变换。这时候Z的缩放不会影响投影,因为Z保持为1,所以变换后的坐标不需要除以Z,从而保持线性。 另外,需要解释维度变化带来的效果差异。例如,透视变换会引入“近大远小”的效果,而仿射变换不会。这是因为透视变换考虑了深度信息(Z轴),导致远处的物体在投影后变小,而仿射变换忽略了这一点。引用[2]指出,透视变换改变平行线角度,这正是三维投影的典型特征。 在应用场景上,仿射适用于平面物体的旋转、缩放,而透视用于需要三维效果的情况,比如图像矫正。这里可能需要举例说明,比如在OpenCV中,仿射变换用2x3矩阵,而透视变换用3x3矩阵,并且需要四个点来定义变换,因为四边形在透视变换后可能变成任意四边形,而仿射变换保持平行四边形结构。 总结时,应强调维度处理的核心区别:仿射变换在二维线性空间操作,而透视变换通过三维投影引入非线性变化,导致不同的几何属性变化。</think>### 仿射变换透视变换的维度差异分析 #### 1. **数学定义与维度操作** - **仿射变换** 本质是二维线性变换,通过齐次坐标扩展为3维矩阵运算,但最终结果仍投影回原二维平面。其变换矩阵为: $$ \begin{bmatrix} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{bmatrix} $$ 其中平移、旋转、缩放、剪切均保持二维平面的平行性。变换后点的坐标计算为: $$ x' = a \cdot x + b \cdot y + t_x, \quad y' = c \cdot x + d \cdot y + t_y $$ 所有操作均未引入三维空间投影的除法操作[^3][^4]。 - **透视变换** 属于三维空间到二维平面的投影变换,需使用齐次坐标并引入非线性运算。其变换矩阵为: $$ \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix} $$ 变换后的坐标为: $$ x' = \frac{h_{11}x + h_{12}y + h_{13}}{h_{31}x + h_{32}y + h_{33}}, \quad y' = \frac{h_{21}x + h_{22}y + h_{23}}{h_{31}x + h_{32}y + h_{33}} $$ 分母项$h_{31}x + h_{32}y + h_{33}$导致非线性效应(如平行线相交),这是三维投影的核心特征[^1][^4]。 #### 2. **几何特性对比** | **特性** | **仿射变换** | **透视变换** | |----------------|---------------------------|---------------------------| | **平行性保持** | 平行线仍平行[^2] | 平行线可能相交(如铁轨)[^2] | | **角度保持** | 角度不变[^2] | 角度改变[^2] | | **自由度** | 6(平移2+线性变换4)[^3] | 8(需额外参数控制投影)[^1] | | **维度操作** | 二维线性空间内的变换 | 三维投影到二维平面 | #### 3. **应用场景差异** - **仿射变换**:适用于平面图像调整(如旋转、缩放证件照),因不破坏平行关系[^3]。 - **透视变换**:用于模拟三维视角(如倾斜拍摄的图片矫正为正面视图),需处理“近大远小”效果[^4]。 #### 4. **OpenCV实现对比** ```python # 仿射变换(需3个对应点,使用2x3矩阵) import cv2 src_points = np.float32([[0,0], [1,0], [0,1]]) dst_points = np.float32([[0,0], [2,0], [0,2]]) M_affine = cv2.getAffineTransform(src_points, dst_points) result = cv2.warpAffine(image, M_affine, (width, height)) # 透视变换(需4个对应点,使用3x3矩阵) src_quad = np.float32([[0,0], [1,0], [1,1], [0,1]]) dst_quad = np.float32([[0,0], [1,0], [0.8,1.2], [0.2,1]]) M_perspective = cv2.getPerspectiveTransform(src_quad, dst_quad) result = cv2.warpPerspective(image, M_perspective, (width, height)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值