部落格:blog.shinelee.me | 部落格園 | CSDN
寫在前面
2D影像常見的座標變換如下圖所示:
這篇文章不包含透視變換(projective/perspective transformation),而將重點放在仿射變換(affine transformation),將介紹仿射變換所包含的各種變換,以及變換矩陣該如何理解記憶。
仿射變換:平移、旋轉、放縮、剪下、反射
仿射變換包括如下所有變換,以及這些變換任意次序次數的組合:
平移(translation)和旋轉(rotation)顧名思義,兩者的組合稱之為歐式變換(Euclidean transformation)或剛體變換(rigid transformation);
放縮(scaling)可進一步分為uniform scaling和non-uniform scaling,前者每個座標軸放縮係數相同(各向同性),後者不同;如果放縮係數為負,則會疊加上反射(reflection)——reflection可以看成是特殊的scaling;
剛體變換+uniform scaling 稱之為,相似變換(similarity transformation),即平移+旋轉+各向同性的放縮;
剪下變換(shear mapping)將所有點沿某一指定方向成比例地平移,語言描述不如上面圖示直觀。
各種變換間的關係如下面的venn圖所示:
通過變換矩陣可以更清晰地看出這些變換間的關係和區別。
變換矩陣形式
沒有平移或者平移量為0的所有仿射變換可以用如下變換矩陣描述:
\[ \left[ \begin{array}{l}{x'} \\ {y'}\end{array}\right]=\left[ \begin{array}{ll}{a} & {b} \\ {c} & {d}\end{array}\right] \left[ \begin{array}{l}{x} \\ {y}\end{array}\right] \]
不同變換對應的\(a, b, c, d\)約束不同,排除了平移變換的所有仿射變換為線性變換(linear transformation),其涵蓋的變換如上面的venn圖所示,其特點是原點位置不變,多次線性變換的結果仍是線性變換。
為了涵蓋平移,引入齊次座標,在原有2維座標的基礎上,增廣1個維度,如下所示:
\[ \left[ \begin{array}{l}{x^{\prime}} \\ {y^{\prime}} \\ {1}\end{array}\right] =\left[ \begin{array}{lll}{a} & {b} & {c}\\ {d} & {e} & {f} \end{array}\right] \left[ \begin{array}{l}{x} \\ {y} \\ {1}\end{array}\right] \]
所以,仿射變換的變換矩陣統一用 \(\left[ \begin{array}{lll}{a} & {b} & {c}\\ {d} & {e} & {f}\end{array}\right]\)來描述,不同基礎變換的\(a,b,c,d,e,f\)約束不同,如下所示:
此外,旋轉和平移相乘得到剛體變換的變換矩陣,如下,有3個自由度(\(\theta, t_x, t_y\)),這裡旋轉方向為逆時針方向,因此與上圖中的正負號不同,
\[
\left[ \begin{array}{ccc}{\cos (\theta)} & {-\sin (\theta)} & {t_{x}} \\ {\sin (\theta)} & {\cos (\theta)} & {t_{y}}\end{array}\right] \left[ \begin{array}{l}{x} \\ {y} \\ {1}\end{array}\right]=\left[ \begin{array}{c}{x^{\prime}} \\ {y^{\prime}} \\ {1}\end{array}\right]
\]
再乘上uniform scaling得到相似變換,有4個自由度(\(s, \theta, t_x, t_y\)),如下:
\[ \left[ \begin{array}{ccc}{s\cos (\theta)} & {-s\sin (\theta)} & {t_{x}} \\ {s\sin (\theta)} & {s\cos (\theta)} & {t_{y}}\end{array}\right] \left[ \begin{array}{l}{x} \\ {y} \\ {1}\end{array}\right]=\left[ \begin{array}{c}{x^{\prime}} \\ {y^{\prime}} \\ {1}\end{array}\right] \]
自然,仿射變換的變換矩陣有6個自由度(\(a,b,c,d,e,f\))。
變換矩陣的理解與記憶
座標系由座標原點和基向量決定,座標原點和基向量確定了,座標系也就確定了。
對於座標系中的位置\((x, y)\),其相對座標原點在\([1, 0]\)方向上的投影為\(x\),在\([0, 1]\)方向上的投影為\(y\)——這裡投影的意思是過\((x, y)\)做座標軸的平行線與座標軸的交點到原點的距離,即\((x, y)\)實際為:
\[\left[ \begin{array}{l}{x} \\ {y}\end{array}\right] = x\left[ \begin{array}{l}{1} \\ {0}\end{array}\right] + y\left[ \begin{array}{l}{0} \\ {1}\end{array}\right] = \left[ \begin{array}{ll}{1} & {0} \\ {0} & {1}\end{array}\right] \left[ \begin{array}{l}{x} \\ {y}\end{array}\right]\]
當座標系變化,座標系中的點也跟著變化,但點相對新座標系(\(x'-y'\)座標系)的位置不變仍為\((x, y)\),以旋轉變換為例,新座標軸的基向量則變為\([\cos (\theta), \sin (\theta)]\)和\([-\sin (\theta), \cos (\theta)]\),所以點變化到新位置為:
\[\left[ \begin{array}{l}{x'} \\ {y'}\end{array}\right] = x\left[ \begin{array}{l}{\cos (\theta)} \\ { \sin (\theta)}\end{array}\right] + y\left[ \begin{array}{r}{- \sin (\theta)} \\ { \cos (\theta)}\end{array}\right] = \left[ \begin{array}{lr}{\cos (\theta)} & {-\sin (\theta)} \\ {\sin (\theta)} & {\cos (\theta)}\end{array}\right] \left[ \begin{array}{l}{x} \\ {y}\end{array}\right]\]
新位置和新基向量是相對絕對座標系(\(x-y\)座標系)而言的。其他變換矩陣同理。
總結一下:
- 所有變換矩陣只需關注一點:座標系的變化,即基向量和原點的變化;
- 座標系變化到哪裡,座標系中的所有點也跟著做同樣的變化;
- 座標系的變換分為 基向量的變化 以及 座標原點的變化,在仿射變換矩陣 \(\left[ \begin{array}{lll}{a} & {b} & {c}\\ {d} & {e} & {f} \\ 0 & {0} & {1}\end{array}\right]\)中, \(\left[ \begin{array}{l}{a} \\ {d}\end{array}\right]\)和\(\left[ \begin{array}{l}{b} \\ {e}\end{array}\right]\)為新的基向量,\(\left[ \begin{array}{l}{c} \\ {f}\end{array}\right]\)為新的座標原點,先變化基向量,再變化座標原點;
這時再對照上面的各種變換矩陣,就很好理解了。
變換矩陣的引數估計
如果給定兩個對應點集,如何估計指定變換矩陣的引數?
一對對應點可以列兩個線性方程,多個對應點可以列出線性方程組,為了求解引數,需要的對應點數至少為自由度的一半,多個點時構成超定方程組,可以基於最小二乘或者SVD分解等方法進行求解,這裡不再展開。