四頂點校正透視變換的線性方程解


透視變換(Perspective Transformation)用於解決仿射變換(Affine Transformation)無法改變形狀內部的相對位置關系的問題。類似Photoshop中的“自由變換”功能,或者GIMP中的“透視”功能,都可以用透視變換矩陣來實現。

現在給定2個四邊形:Poly1={{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}}、Poly2={{u1, v1}, {u2, v2}, {u3, v3}, {u4, v4}},求做一個透視變換Matrix,滿足Poly1的點能夠變形(Warp)到Poly2中的點。

perspectivewarping

[問題在哪里]
透視變換矩陣的形式為:

latex1113_1

TEX:[code]begin{pmatrix}
wu
wv
w
end{pmatrix}
=
begin{pmatrix}
m0 & m1 & m2
m3 & m4 & m5
m6 & m7 & 1
end{pmatrix}
begin{pmatrix}
x
y
1
end{pmatrix}[/code]

顯然,我們需要求解的只是矩陣中8個未知量;已知量包括四邊形的4個頂點 x 2個坐標(x, y),一共是8個方程,數量剛剛好。對於每個頂點坐標,Poly1中的點總是通過下面的方程轉換到Poly2中:

latex1113_2

TEX:[code]begin{cases}
u=frac{m_0x+m_1y+m_2}{m_6x+m_7y+1}
v=frac{m_3x+m_4y+m_5}{m_6x+m_7y+1}
end{cases}[/code]

問題的關鍵在於,上面的公式需要求解非線性方程。因此,在解決Homography的問題上,常常用最小二乘法(Least Squares)求得參數估計。而真正令[tc]卻步的問題在於,這一次的需求與上一次用Levenberg Marquardt算法求解非線性回歸不同,這一次有兩個自變量(x、y),而且這兩個量之間存在關系。

[花絮]
其實.net平台下還有一個變通的解決方案,是利用System.Drawing.Drawing2D.GraphicsPath的Warp()方法,實現對路徑的變形,而且在指定了WarpMode.Perspective之后,也能獲得透視效果。雖然這樣做的代價是無法直接得到變換矩陣,因此對任意圖像的變形存在困難,但是如果能簡化編程,也算是一件好事。

糟糕的是,當我下載到mono-2.4.2.3、libgdiplus-2.4.2之后,才知道mono暫時沒有實現這個功能。graphics-path.c的GdipWarpPath函數中標注為“NOT IMPLEMENTED”。

隨后我就將目光轉向專門解決homography問題的homest。然后華麗的發現它依賴於Lapack,Lapack是用Fortran書寫的……

[我的解法]
好吧,回到我的思路。其實稍加分析就不難發現,上面那個使用了分式的所謂“非線性方程”,實際上可以變形為:

latex1113_3

TEX:[code]begin{cases}
u=m_0x+m_1y+m_2-m_6xu-m_7yu
v=m_3x+m_4y+m_5-m_6xv-m_7yv
end{cases}[/code]

它居然變成了線性方程!看來一切試圖用Newton迭代的算法都是沒有必要的,因為我們可以用最簡單的線性代數來解決:

latex1113_4

 

TEX:[code]begin{pmatrix}
u_1
v_1
u_2
v_2
u_3
v_3
u_4
v_4
end{pmatrix}
=
begin{pmatrix}
x_1 & y_1 & 1 & 0 & 0 & 0 & -x_1u_1 & -y_1u_1
0 & 0 & 0 & x_1 & y_1 & 1 & -x_1v_1 & -y_1v_1
x_2 & y_2 & 1 & 0 & 0 & 0 & -x_2u_2 & -y_2u_2
0 & 0 & 0 & x_2 & y_2 & 1 & -x_2v_2 & -y_2v_2
x_3 & y_3 & 1 & 0 & 0 & 0 & -x_3u_3 & -y_3u_3
0 & 0 & 0 & x_3 & y_3 & 1 & -x_3v_3 & -y_3v_3
x_4 & y_4 & 1 & 0 & 0 & 0 & -x_4u_4 & -y_4u_4
0 & 0 & 0 & x_4 & y_4 & 1 & -x_4v_4 & -y_4v_4
end{pmatrix}
begin{pmatrix}
m_0
m_1
m_2
m_3
m_4
m_5
m_6
m_7
end{pmatrix}[/code]

現在已經太簡單了,你是用GaussJordan消去法還是LU分解法,總之得到的m0…m7就組成了所需的透視變換矩陣。

附注:關於LaTex公式刷不出來的問題,我還在努力,估計今晚就能顯示了。
更新(當日14:20):我放棄了,公式改用LaTeX Equation Editor靜態生成,現在應該可以顯示了。


免責聲明!

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



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