仿射变换 (Affine transform) 参数估计方法

最近一个机器视觉课题中的一个小问题。两幅图像中各有一些特征点,我们分别称为 ( x i , y i ) (x_i, y_i) (xi​,yi​) 和 ( u i , v i ) (u_i, v_i) (ui​,vi​)。这两组特征点可以由坐标的旋转和平移变换相联系。也就是说:
( x i y i ) = ( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) ( u i v i ) + ( t 1 t 2 ) \begin{pmatrix} x_i \\ y_i \end{pmatrix} = \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix} \begin{pmatrix} u_i \\ v_i \end{pmatrix}+\begin{pmatrix} t_1 \\ t_2 \end{pmatrix} (xi​yi​​)=(cosθsinθ​−sinθcosθ​)(ui​vi​​)+(t1​t2​​)

需要计算的参数只有三个 θ \theta θ , t 1 t_1 t1​ 和 t 2 t_2 t2​,理论上只要有三组坐标就可以求出来。

但是 ( x i , y i ) (x_i, y_i) (xi​,yi​) 和 ( u i , v i ) (u_i, v_i) (ui​,vi​) 可能存在误差,因此我们需要求最小二乘解。

因为三角函数是超越函数,不方便计算,我们把坐标变换公式重写一下:

( x i y i ) = ( a − b b a ) ( u i v i ) + ( t 1 t 2 ) a 2 + b 2 = 1 \begin{pmatrix} x_i \\ y_i \end{pmatrix} = \begin{pmatrix} a & -b \\ b & a \end{pmatrix} \begin{pmatrix} u_i \\ v_i \end{pmatrix}+\begin{pmatrix} t_1 \\ t_2 \end{pmatrix} \\ a^2 + b^2 =1 (xi​yi​​)=(ab​−ba​)(ui​vi​​)+(t1​t2​​)a2+b2=1

这个和普通的最小二乘法唯一的区别就是多了个约束项。可以用拉格朗日乘数法来处理约束项。

f = ∑ ( a u i − b v i + t 1 − x i ) 2 + ∑ ( b u i + a v i + t 2 − y i ) 2 + λ ( a 2 + b 2 − 1 ) f = \sum{(a u_i - b v_i+t_1 - x_i)^2}+\sum{(b u_i + a v_i + t_2 - y_i)^2} + \lambda (a^2 + b^2 -1) f=∑(aui​−bvi​+t1​−xi​)2+∑(bui​+avi​+t2​−yi​)2+λ(a2+b2−1)

f f f 极值对应如下关系:

0 = 1 2 ∂ f ∂ a = ∑ u i ( a u i − b v i − x i + t 1 ) + ∑ v i ( a v i + b u i − y i + t 2 ) + a λ = a ( λ + ∑ ( u i 2 + v i 2 ) ) + t 1 ∑ u i + t 2 ∑ v i − ( ∑ u i x i + ∑ v i y i ) 0 = \frac{1}{2} \frac{\partial f}{\partial a} = \sum u_i \left(a u_i-b v_i-x_i+t_1\right)+ \sum v_i \left(a v_i+b u_i-y_i+t_2\right)+ a \lambda \\ = a \left(\lambda + \sum{(u_i ^2 + v_i^2)} \right) + t_1 \sum u_i+t_2 \sum v_i - \left(\sum u_i x_i+\sum v_i y_i \right) 0=21​∂a∂f​=∑ui​(aui​−bvi​−xi​+t1​)+∑vi​(avi​+bui​−yi​+t2​)+aλ=a(λ+∑(ui2​+vi2​))+t1​∑ui​+t2​∑vi​−(∑ui​xi​+∑vi​yi​)

0 = 1 2 ∂ f ∂ b = − ∑ v i ( a u i − b v i − x i + t 1 ) + ∑ u i ( a v i + b u i − y i + t 2 ) + b λ = b ( λ + ∑ ( u i 2 + v i 2 ) ) − t 1 ∑ v i + t 2 ∑ u i − ( ∑ u i y i − ∑ v i x i ) 0 = \frac{1}{2} \frac{\partial f}{\partial b} = -\sum v_i \left(a u_i-b v_i-x_i+t_1\right)+ \sum u_i \left(a v_i+b u_i-y_i+t_2\right)+ b \lambda \\ = b \left(\lambda + \sum{(u_i ^2 + v_i^2)} \right) - t_1 \sum v_i + t_2 \sum u_i - \left(\sum u_i y_i - \sum v_i x_i \right) 0=21​∂b∂f​=−∑vi​(aui​−bvi​−xi​+t1​)+∑ui​(avi​+bui​−yi​+t2​)+bλ=b(λ+∑(ui2​+vi2​))−t1​∑vi​+t2​∑ui​−(∑ui​yi​−∑vi​xi​)

0 = 1 2 ∂ f ∂ t 1 = ∑ ( a u i − b v i − x i + t 1 ) = a ∑ u i − b ∑ v i − ∑ x i + N t 1 0 = \frac{1}{2} \frac{\partial f}{\partial t_1} = \sum \left(a u_i-b v_i-x_i+t_1\right) \\ = a \sum {u_i} - b \sum{v_i} - \sum{x_i} + N t_1 0=21​∂t1​∂f​=∑(aui​−bvi​−xi​+t1​)=a∑ui​−b∑vi​−∑xi​+Nt1​

0 = 1 2 ∂ f ∂ t 2 = ∑ ( b u i + a v i − y i + t 2 ) = a ∑ v i + b ∑ u i − ∑ y i + N t 2 0 = \frac{1}{2} \frac{\partial f}{\partial t_2} = \sum \left(b u_i + a v_i - y_i + t_2\right) \\ = a \sum {v_i} + b \sum{u_i} - \sum{y_i} + N t_2 0=21​∂t2​∂f​=∑(bui​+avi​−yi​+t2​)=a∑vi​+b∑ui​−∑yi​+Nt2​

在加上约束方程: a 2 + b 2 = 1 a^2+b^2=1 a2+b2=1 构成 4 元 2 次方程组。可以直接求出解,但是比较麻烦。我们用一些取巧的办法来处理。

首先把原始数据做个坐标平移,原点移动到坐标点的质心。

x i ′ = x i − x ˉ y i ′ = y i − y ˉ u i ′ = u i − u ˉ v i ′ = v i − v ˉ x_i' = x_i - \bar{x} \\ y_i' = y_i - \bar{y} \\ u_i' = u_i - \bar{u} \\ v_i' = v_i - \bar{v} xi′​=xi​−xˉyi′​=yi​−yˉ​ui′​=ui​−uˉvi′​=vi​−vˉ

这里 x ˉ , y ˉ , u ˉ , v ˉ \bar{x}, \bar{y}, \bar{u}, \bar{v} xˉ,yˉ​,uˉ,vˉ 是平均值:
x ˉ = ∑ x i / N y ˉ = ∑ y i / N u ˉ = ∑ u i / N v ˉ = ∑ v i / N \bar{x} = \sum{x_i} / N \\ \bar{y} = \sum{y_i} / N \\ \bar{u} = \sum{u_i} / N \\ \bar{v} = \sum{v_i} / N xˉ=∑xi​/Nyˉ​=∑yi​/Nuˉ=∑ui​/Nvˉ=∑vi​/N

之所以原点移动到坐标点的质心是因为这时有:
∑ x i ′ = ∑ y i ′ = ∑ u i ′ = ∑ v i ′ = 0 \sum{x_i'} = \sum{y_i'} = \sum{u_i'} = \sum{v_i'} = 0 ∑xi′​=∑yi′​=∑ui′​=∑vi′​=0

利用这些关系可以简化计算。

当然这里还有一个问题需要解决,那就是 x i , y i , u i , v i x_i, y_i, u_i, v_i xi​,yi​,ui​,vi​ 算出的 a , b , t 1 , t 2 a, b, t_1, t_2 a,b,t1​,t2​ 和 x i ′ , y i ′ , u i ′ , v i ′ x_i', y_i', u_i', v_i' xi′​,yi′​,ui′​,vi′​ 算出的 a , b , t 1 , t 2 a, b, t_1, t_2 a,b,t1​,t2​ 有什么关系。

我们可以这样写, x i ′ , y i ′ , u i ′ , v i ′ x_i', y_i', u_i', v_i' xi′​,yi′​,ui′​,vi′​ 算出的参数记为 a ′ , b ′ , t 1 ′ , t 2 ′ a', b', t_1', t_2' a′,b′,t1′​,t2′​。那么有:

( x i ′ y i ′ ) = ( a ′ − b ′ b ′ a ′ ) ( u i ′ v i ′ ) + ( t 1 ′ t 2 ′ ) \begin{pmatrix} x_i' \\ y_i' \end{pmatrix} = \begin{pmatrix} a' & -b' \\ b' & a' \end{pmatrix} \begin{pmatrix} u_i' \\ v_i' \end{pmatrix}+\begin{pmatrix} t_1' \\ t_2' \end{pmatrix} \\ (xi′​yi′​​)=(a′b′​−b′a′​)(ui′​vi′​​)+(t1′​t2′​​)

( x i − x ˉ y i − y ˉ ) = ( a ′ − b ′ b ′ a ′ ) ( u i − u ˉ v i − v ˉ ) + ( t 1 ′ t 2 ′ ) \begin{pmatrix} x_i - \bar{x} \\ y_i - \bar{y} \end{pmatrix} = \begin{pmatrix} a' & -b' \\ b' & a' \end{pmatrix} \begin{pmatrix} u_i - \bar{u} \\ v_i - \bar{v} \end{pmatrix}+\begin{pmatrix} t_1' \\ t_2' \end{pmatrix} \\ (xi​−xˉyi​−yˉ​​)=(a′b′​−b′a′​)(ui​−uˉvi​−vˉ​)+(t1′​t2′​​)
( x i y i ) = ( a ′ − b ′ b ′ a ′ ) ( u i v i ) + ( t 1 ′ + x ˉ − a ′ u ˉ + b ′ v ˉ t 2 ′ + y ˉ − b ′ u ˉ − a ′ v ˉ ) \begin{pmatrix} x_i \\ y_i \end{pmatrix} = \begin{pmatrix} a' & -b' \\ b' & a' \end{pmatrix} \begin{pmatrix} u_i \\ v_i \end{pmatrix} + \begin{pmatrix} t_1' + \bar{x} - a' \bar{u} + b' \bar{v}\\ t_2' + \bar{y} - b' \bar{u} - a' \bar{v}\end{pmatrix} (xi​yi​​)=(a′b′​−b′a′​)(ui​vi​​)+(t1′​+xˉ−a′uˉ+b′vˉt2′​+yˉ​−b′uˉ−a′vˉ​)

可以看出有如下关系:
a = a ′ b = b ′ t 1 = t 1 ′ + x ˉ − a ′ u ˉ + b ′ v ˉ t 2 = t 2 ′ + y ˉ − b ′ u ˉ − a ′ v ˉ a = a' \\ b = b' \\ t_1 = t_1' + \bar{x} - a' \bar{u} + b' \bar{v} \\ t_2 = t_2' + \bar{y} - b' \bar{u} - a' \bar{v} a=a′b=b′t1​=t1′​+xˉ−a′uˉ+b′vˉt2​=t2′​+yˉ​−b′uˉ−a′vˉ

而且通过后面的计算我们还会知道 t 1 ′ = t 2 ′ = 0 t_1' = t_2' = 0 t1′​=t2′​=0,所以有:
a = a ′ b = b ′ t 1 = x ˉ − a ′ u ˉ + b ′ v ˉ t 2 = y ˉ − b ′ u ˉ − a ′ v ˉ a = a' \\ b = b' \\ t_1 = \bar{x} - a' \bar{u} + b' \bar{v} \\ t_2 = \bar{y} - b' \bar{u} - a' \bar{v} a=a′b=b′t1​=xˉ−a′uˉ+b′vˉt2​=yˉ​−b′uˉ−a′vˉ

我们回到原来的问题:

( x i ′ y i ′ ) = ( a − b b a ) ( u i ′ v i ′ ) + ( t 1 ′ t 2 ′ ) \begin{pmatrix} x_i' \\ y_i' \end{pmatrix} = \begin{pmatrix} a & -b \\ b & a \end{pmatrix} \begin{pmatrix} u_i' \\ v_i' \end{pmatrix}+\begin{pmatrix} t_1' \\ t_2' \end{pmatrix} \\ (xi′​yi′​​)=(ab​−ba​)(ui′​vi′​​)+(t1′​t2′​​)

0 = 1 2 ∂ f ∂ t 1 ′ = ∑ ( a u i − b v i − x i + t 1 ′ ) = N t 1 ′ 0 = \frac{1}{2} \frac{\partial f}{\partial t_1'} = \sum \left(a u_i-b v_i-x_i + t_1'\right) = N t_1' 0=21​∂t1′​∂f​=∑(aui​−bvi​−xi​+t1′​)=Nt1′​

0 = 1 2 ∂ f ∂ t 2 ′ = ∑ ( b u i + a v i − y i + t 2 ′ ) = N t 2 ′ 0 = \frac{1}{2} \frac{\partial f}{\partial t_2'} = \sum \left(b u_i + a v_i - y_i + t_2'\right) = N t_2' 0=21​∂t2′​∂f​=∑(bui​+avi​−yi​+t2′​)=Nt2′​

这里利用了 ∑ x i ′ = ∑ y i ′ = ∑ u i ′ = ∑ v i ′ = 0 \sum{x_i'} = \sum{y_i'} = \sum{u_i'} = \sum{v_i'} = 0 ∑xi′​=∑yi′​=∑ui′​=∑vi′​=0, 所以 t 1 ′ = t 2 ′ = 0 t_1' = t_2' = 0 t1′​=t2′​=0。

0 = 1 2 ∂ f ∂ a = ∑ u i ′ ( a u i ′ − b v i ′ − x i ′ ) + ∑ v i ′ ( a v i ′ + b u i ′ − y i ′ ) + a λ = a ( λ + ∑ ( u i ′ 2 + v i ′ 2 ) ) − ( ∑ u i ′ x i ′ + ∑ v i ′ y i ′ ) 0 = \frac{1}{2} \frac{\partial f}{\partial a} = \sum u_i' \left(a u_i'-b v_i'-x_i'\right)+ \sum v_i' \left(a v_i'+b u_i'-y_i'\right)+ a \lambda \\ = a \left(\lambda + \sum{( {u_i'} ^2 + {v_i'}^2)} \right) - \left(\sum u_i' x_i'+\sum v_i' y_i' \right) 0=21​∂a∂f​=∑ui′​(aui′​−bvi′​−xi′​)+∑vi′​(avi′​+bui′​−yi′​)+aλ=a(λ+∑(ui′​2+vi′​2))−(∑ui′​xi′​+∑vi′​yi′​)

0 = 1 2 ∂ f ∂ b = − ∑ v i ′ ( a u i ′ − b v i ′ − x i ′ ) + ∑ u i ′ ( a v i ′ + b u i ′ − y i ′ ) + b λ = b ( λ + ∑ ( u i ′ 2 + v i ′ 2 ) ) − ( ∑ u i ′ y i ′ − ∑ v i ′ x i ′ ) 0 = \frac{1}{2} \frac{\partial f}{\partial b} = -\sum v_i' \left(a u_i'-b v_i'-x_i'\right)+ \sum u_i' \left(a v_i'+b u_i'-y_i'\right)+ b \lambda \\ = b \left(\lambda + \sum{({u_i'} ^2 + {v_i'}^2)} \right) - \left(\sum u_i' y_i' - \sum v_i' x_i' \right) 0=21​∂b∂f​=−∑vi′​(aui′​−bvi′​−xi′​)+∑ui′​(avi′​+bui′​−yi′​)+bλ=b(λ+∑(ui′​2+vi′​2))−(∑ui′​yi′​−∑vi′​xi′​)

这里设:
W = λ + ∑ ( u i ′ 2 + v i ′ 2 ) P = ∑ u i ′ x i ′ + ∑ v i ′ y i ′ Q = ∑ u i ′ y i ′ − ∑ v i ′ x i ′ W = \lambda + \sum{({u_i'} ^2 + {v_i'}^2)} \\ P = \sum u_i' x_i'+\sum v_i' y_i' \\ Q = \sum u_i' y_i' - \sum v_i' x_i' W=λ+∑(ui′​2+vi′​2)P=∑ui′​xi′​+∑vi′​yi′​Q=∑ui′​yi′​−∑vi′​xi′​

那么有:
a W = P b W = Q a W = P\\ b W = Q aW=PbW=Q

再利用 a 2 + b 2 = 1 a^2 + b^2 = 1 a2+b2=1 可以得到:

W = P 2 + Q 2 a = P P 2 + Q 2 b = Q P 2 + Q 2 W = \sqrt{P^2+Q^2}\\ a = \frac{P}{\sqrt{P^2+Q^2}}\\ b = \frac{Q}{\sqrt{P^2+Q^2}} W=P2+Q2 ​a=P2+Q2 ​P​b=P2+Q2 ​Q​

至此,这个问题就圆满解决了。

仿射变换 (Affine transform) 参数估计方法相关推荐

  1. 仿射变换affine和透视变换

    仿射变换和单应矩阵 首先明确:二者的应用场景相同,都是针对二维图片的变换.仿射变换affine是透视变换的子集,透视变换是通过homography单应矩阵实现的. 从数学的角度,homography即 ...

  2. 【IM】从贝叶斯角度理解生成式和判别式及参数估计方法

    生成式和判别式及参数估计方法,综合如下博文,参考<图解机器学习>一书,有如下两页理解. https://blog.csdn.net/fjssharpsword/article/detail ...

  3. OpenCV仿射变换Affine Transformations

    OpenCV仿射变换Affine Transformations 仿射变换Affine Transformations 目标 理论 什么是仿射变换? 我们如何获得仿射变换? 代码 这个程序做什么? 解 ...

  4. 【 unity3d 】Transform.LookAt()方法

    Transform.LookAt()方法 public void LookAt (Transform target); 旋转当前脚本对象,让向前向量z指向target的当前位置.简单说,旋转物体使z轴 ...

  5. 机器学习两种参数估计方法:最大似然估计和最小二乘法估计

    参数估计方法 一.最大似然估计 原理: 最合理的参数估计量应该使得从模型中抽取该n组样本观测值的概率最大,也就是概率分布函数或者说是似然函数最大. 二.最小二乘法 当从模型总体随机抽取n组样本观测值后 ...

  6. 仿射变换 Affine transformation

    这个太重要了,我得再研究研究.并争取搞个code出来.这篇先来理论. 本文属转载. 变换模型是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型.可采用的变 ...

  7. 机器学习(一):模型的参数估计方法

    机器学习(一):模型的参数估计方法 前言:   之前在看李航的<统计学习方法>,思考的同时打算对于其中一些问题做一些总结和记录,希望以后再看的时候能够有更深入的理解. 文章目录 机器学习( ...

  8. matlab 广义帕累托分布,基于对数矩的广义帕累托分布参数估计方法与流程

    本发明属于信号处理技术领域,具体涉及一种广义帕累托分布参数估计方法,可用于海杂波背景下的目标检测. 背景技术: 海杂波背景下的目标检测技术是雷达应用技术中一个至关重要的研究方向,在军事和民用领域已经得 ...

  9. 基础:常见的参数估计方法——MLE和MAP

    抽样.样本数据 -->观察数据趋势 -->选择模型 -->模型参数估计 -->假设检验 类别 名称 核心函数 求解目标 点估计 最小二乘法 模型参数的误差平方和函数 求偏导数, ...

最新文章

  1. ML之xgboost:绘制xgboost的二叉树graphviz的两种方法代码实现
  2. bcb 如何在DLL中捕捉系统级异常
  3. leetcode-python-优先级队列与时间复杂度
  4. python调用支付宝支付接口详细示例—附带Django demo代码
  5. 原生js绑定click为什么点一次执行两次_前端小知识10点(2020.10.8)
  6. 祖父元素_帮助祖父母建立Skype帐户的UX经验教训
  7. VB讲课笔记05:数据输入输出
  8. 游戏脚本在移动游戏设计中的作用_游戏设计中道具设计分步解说
  9. 5个让前端代码变得简洁的最佳实践
  10. Entity Framework 学习总结之三:架构组成介绍
  11. 毕设项目 - 基于SSM的毕业设计管理系统(含源码+论文)
  12. axios中文文档整理
  13. 智慧路灯网关下的校园智慧路灯照明解决方案
  14. TMC5160步进电机驱动芯片,简析
  15. 平面设计中的对比设计技巧
  16. C# Stream篇(五) -- MemoryStream
  17. 多臂赌博机Multi-Armed Bandit(MAB)
  18. 怎么将多张图片打印在一张A4纸上?
  19. 使用rename命令批量修改后缀名
  20. 计算机桌面备份在哪里,怎样备份系统,文件备份在哪里

热门文章

  1. 女友和直男程序员吵架,要删代码。网友:你这是在玩火
  2. (一)Open Image Dataset V5概述
  3. 关于Linux 驱动以及应用调试信息打印方式总结
  4. java银联接口代码_银联接口测试——详细(JAVA)
  5. chrome浏览器另存为/上传附件崩溃
  6. 项目人力资源管理 试题分析
  7. git clone ***
  8. arduino 读取当前时间_Arduino语法-时间函数
  9. 什么是并查集?【建议收藏】
  10. (转)一个你看了会哭得真实故事!