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

仿射变换 (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} (xiyi)=(cosθsinθsinθcosθ)(uivi)+(t1t2)

需要计算的参数只有三个 θ \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 (xiyi)=(abba)(uivi)+(t1t2)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=(auibvi+t1xi)2+(bui+avi+t2yi)2+λ(a2+b21)

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=21af=ui(auibvixi+t1)+vi(avi+buiyi+t2)+aλ=a(λ+(ui2+vi2))+t1ui+t2vi(uixi+viyi)

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=21bf=vi(auibvixi+t1)+ui(avi+buiyi+t2)+bλ=b(λ+(ui2+vi2))t1vi+t2ui(uiyivixi)

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=21t1f=(auibvixi+t1)=auibvixi+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=21t2f=(bui+aviyi+t2)=avi+buiyi+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=xixˉyi=yiyˉui=uiuˉvi=vivˉ

这里 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} \\ (xiyi)=(abba)(uivi)+(t1t2)

( 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} \\ (xixˉyiyˉ)=(abba)(uiuˉvivˉ)+(t1t2)
( 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} (xiyi)=(abba)(uivi)+(t1+xˉauˉ+bvˉt2+yˉbuˉavˉ)

可以看出有如下关系:
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=ab=bt1=t1+xˉauˉ+bvˉt2=t2+yˉbuˉavˉ

而且通过后面的计算我们还会知道 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=ab=bt1=xˉauˉ+bvˉt2=yˉbuˉavˉ

我们回到原来的问题:

( 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} \\ (xiyi)=(abba)(uivi)+(t1t2)

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=21t1f=(auibvixi+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=21t2f=(bui+aviyi+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=21af=ui(auibvixi)+vi(avi+buiyi)+aλ=a(λ+(ui2+vi2))(uixi+viyi)

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=21bf=vi(auibvixi)+ui(avi+buiyi)+bλ=b(λ+(ui2+vi2))(uiyivixi)

这里设:
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=λ+(ui2+vi2)P=uixi+viyiQ=uiyivixi

那么有:
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 Pb=P2+Q2 Q

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

猜你喜欢

转载自blog.csdn.net/liyuanbhu/article/details/116257732