仿射变换 (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)=(ab−ba)(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=∑(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−(∑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=21∂b∂f=−∑vi(aui−bvi−xi+t1)+∑ui(avi+bui−yi+t2)+bλ=b(λ+∑(ui2+vi2))−t1∑vi+t2∑ui−(∑uiyi−∑vixi)
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}
(xiyi)=(a′b′−b′a′)(uivi)+(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+Q2a=P2+Q2Pb=P2+Q2Q
至此,这个问题就圆满解决了。