opencv中的仿射变换

什么是仿射变换?

原理:1、一个任意的仿射变换都能表示为 乘以一个矩阵(线性变换) 接着再 加上一个向量(平移)

2、综上所述,我们能够用仿射变换来表示:

  1)旋转(线性变换)

  2)平移(向量加)

  3)缩放操作(线性变换)

事实上,仿射变换代表的是两幅图之间的关系。

3、我们通常使用2*3矩阵来表示仿射变换:

考虑到我们要使用矩阵A和B对二维向量做变换,所以也能表示为下列形式:

怎样才能求得一个仿射变换?

1、我们在上文有提到过仿射变换基本表示的就是两幅图片之间的联系。关于这种联系的信息大致可以从一下两种场景获得:

  1)我们一直 X 和 T 而且我们知道他们是有联系的,接下来我们的工作就是求出矩阵 M

  2)我们已知 M 和 X,想要求的 T。我们只要应用算式 T = M*X 即可,对于这种联系的信息可以用矩阵 M 清晰的表达或者可以用两幅图片之间的集合关系来表达

2、因为矩阵 M 联系着两幅图片,我们以其表示两图种各三点直接的联系为例。见下图:

3、点1,2,3(在上图1中形成一个三角形)与图二中的三点一一映射,仍然形成三角形。

 

转载于:https://www.cnblogs.com/zhibei/p/9349006.html

### OpenCV仿射变换的几何性质解释 #### 什么是仿射变换仿射变换是一种二维坐标到二维坐标的线性变换,它保持了共线性和比例关系不变。具体来说,在仿射变换下,直线仍然会映射成直线,并且平行线仍保持平行[^1]。 #### 几何性质描述 仿射变换由六个自由度组成:两个旋转角度、两个缩放因子以及两个平移向量 \(t_x\) 和 \(t_y\)。其矩阵形式如下所示: \[ M = \begin{bmatrix} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{bmatrix} \] - **旋转**:通过调整参数 \(a, b, c,\) 和 \(d\) 可以实现图像绕某个中心点的旋转操作[^1]。 - **缩放**:\(a\) 和 \(d\) 控制着水平方向和垂直方向上的尺度变化;当它们大于零小于一的时候代表缩小,反之则放大[^1]。 - **剪切**:如果仅改变其中一个维度的比例而另一个固定,则会产生倾斜效果即所谓的“shearing”现象。 - **平移**:最后两项 \(t_x\) 和 \(t_y\) 负责整体位移,使得整个图形可以在平面内移动而不发生形变[^2]。 这些基本的操作组合起来能够完成复杂的空间转换需求,比如校正透视失真或者匹配不同视角下的同一场景对象等应用场合。 ```python import numpy as np import cv2 # 定义原始图片中的三个点及其对应的目标位置 pts_src = np.float32([[50, 50], [200, 50], [50, 200]]) pts_dst = np.float32([[10, 100], [200, 50], [100, 250]]) # 计算仿射变换矩阵 M M = cv2.getAffineTransform(pts_src, pts_dst) # 应用仿射变换至输入图像 img_input 上得到结果图 img_output img_output = cv2.warpAffine(img_input, M, (cols, rows)) ``` 以上代码片段展示了如何基于给定点集计算出相应的仿射变换矩阵并应用于实际图像之上。 #### 插值的作用 由于仿射变换可能不会正好落在整数像素网格上,因此需要采用某种方法估计新位置处的颜色值。这就是为什么提到过插值的重要性——为了使最终输出更加连续和平滑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值