單應性(homography)變換的推導


矩陣的一個重要作用是將空間中的點變換到另一個空間中。這個作用在國內的《線性代數》教學中基本沒有介紹。要能形像地理解這一作用,比較直觀的方法就是圖像變換,圖像變換的方法很多,單應性變換是其中一種方法,單應性變換會涉及到單應性矩陣。單應性變換的目標是通過給定的幾個點(通常是4對點)來得到單應性矩陣。假設單應性矩陣為:

$$
H= \begin{bmatrix}
h_{11} & h_{12} & h_{13} \\
h_{21} & h_{22} & h_{23} \\
h_{31} & h_{32} & h_{33}
\end{bmatrix}
$$
 上面的矩陣$H$會將一幅圖像上的一個點的坐標$a=(x,y,1)$映射成另一幅圖像上的點的坐標$b=(x_1,y_1,1)$,但H是未知的。通常需要根據在同一平面上已知的一些點對(比如$a$,$b$)來求$H$。 假設已知點對($a$,$b$),則有下面的公式:
\begin{equation}
b=Ha^T
\end{equation}
即:
\begin{equation}
\left\{
\begin{aligned}
x_1=h_{11}x + h_{12}y + h_{13}\\
y_1=h_{21}x + h_{22}y + h_{23}\\
1=h_{31}x + h_{32}y + h_{33} \\
\end{aligned}
\right.
\end{equation}
由上面這個公式中的$1=h_{31}x + h_{32}y + h_{33}$可得到下面兩個等式
\begin{equation}
\left\{
\begin{aligned}
x_1=\frac{x_1}{1}=\frac{h_{11}x + h_{12}y + h_{13}}{h_{31}x + h_{32}y + h_{33}}\\
y_1=\frac{y_1}{1}=\frac{h_{21}x + h_{22}y + h_{23}}{h_{31}x + h_{32}y + h_{33}}\\
\end{aligned}
\right.
\end{equation}
\begin{equation*}
\Rightarrow
\end{equation*}
\begin{equation}
\left\{
\begin{aligned}
h_{11}x+h_{12}y+h_{13}=h31xx_1+h_{32}yx_1+h_{33}x_1\\
h_{21}x + h_{22}y + h_{23}=h31xy_1+h_{32}yy_1+h_{33}y_1\\
\end{aligned}
\right.
\end{equation}
\begin{equation*}
\Rightarrow
\end{equation*}
\begin{equation}
\label{eq1}
\left\{
\begin{aligned}
0=h_{31}xx_1+h_{32}yx_1+h_{33}x_1-(h_{11}x+h_{12}y+h_{13})\\
0=h_{31}xy_1+h_{32}yy_1+h_{33}y_1-( h_{21}x + h_{22}y + h_{23})\\
\end{aligned}
\right.
\end{equation}
對於方程(1)可寫成一個矩陣與一個向量相乘,即:
\begin{equation}
\label{eq2}
\begin{bmatrix}
-x & -y &-1&0&0&0&xx_1&yx_1&x_1 \\
0&0&0& -x & -y &-1&xy_1&yy_1&y_1 \\
\end{bmatrix} h=0
\end{equation}
其中,$h=[h_{11} , h_{12} , h_{13} , h_{21} , h_{22} , h_{23} , h_{31} , h_{32} , h_{33}]^T$,是一個9維的列向量。若令:
\begin{equation}
A=\begin{bmatrix}
-x & -y &-1&0&0&0&xx_1&yx_1&x_1 \\
0&0&0& -x & -y &-1&xy_1&yy_1&y_1 \\
\end{bmatrix}
\end{equation}
則$\eqref{eq2}$可以記為
\begin{equation}
Ah=0
\end{equation}
這里的$A\in R^{2\times 9}$。這只是1對點所得到的矩陣$A$。究竟要多少點對才能求出$H$?由於我們是采用齊次坐標(即(x,y,1))來表示平面上的點,所以存在一個非零的標量$s$,使得$b_1=sHa^T$與$b=sHa^T$都表示同一個點$b$。若令$s=\frac{1}{h_{33}}$,則$\frac{1}{h_{33}}H$為

\begin{equation}
\label{eq3}
\frac{1}{h_{33}}H=
\begin{bmatrix}
\frac{h_{11}}{h_{33}} &\frac{h_{12}}{h_{33}} &\frac{h_{13}}{h_{33}} \\
\frac{h_{21}}{h_{33}} &\frac{h_{22}}{h_{33}} &\frac{h_{23}}{h_{33}} \\
\frac{h_{31}}{h_{33}} &\frac{h_{32}}{h_{33}} &1
\end{bmatrix}
\end{equation}

從公式$\eqref{eq3}$可以看出,其實$H$只有8個變量(8個自由度)。因此,只需要4個點對,然后通過解線性方程組就可以求得$H$。也可以多於4個點對。

假設有$n\geq 4$個點對,則得到的矩陣$A\in R^{2n\times 9}$。如何求解向量$h$呢?方法很簡單,真接對$A$進行SVD分解,即
\begin{equation}
U*\Sigma*V^T
\end{equation}
然后取$V$的最后一列出來作為求解$h$。因為矩陣$A$是行滿秩,即只有一個自由度。
具體實現時,先要得到兩幅圖,然后在兩幅圖之間找到4對點的坐標,由此得到矩陣$A$,然后在matlab中可以這樣實現:

[U,S,V]=svd(A);

h=V(:,9);

H= reshape(h,3,3);

由單應性矩陣可以得到仿射變換,還可以在單應性矩陣上做圖像拼接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM