博客:blog.shinelee.me | 博客園 | CSDNide
2D圖像常見的座標變換以下圖所示:
這篇文章不包含透視變換(projective/perspective transformation),而將重點放在仿射變換(affine transformation),將介紹仿射變換所包含的各類變換,以及變換矩陣該如何理解記憶。idea
仿射變換包括以下全部變換,以及這些變換任意次序次數的組合:
spa
平移(translation)和旋轉(rotation)顧名思義,二者的組合稱之爲歐式變換(Euclidean transformation)或剛體變換(rigid transformation);.net
放縮(scaling)可進一步分爲uniform scaling和non-uniform scaling,前者每一個座標軸放縮係數相同(各向同性),後者不一樣;若是放縮係數爲負,則會疊加上反射(reflection)——reflection能夠當作是特殊的scaling;3d
剛體變換+uniform scaling 稱之爲,類似變換(similarity transformation),即平移+旋轉+各向同性的放縮;orm
剪切變換(shear mapping)將全部點沿某一指定方向成比例地平移,語言描述不如上面圖示直觀。blog
各類變換間的關係以下面的venn圖所示:
經過變換矩陣能夠更清晰地看出這些變換間的關係和區別。ci
沒有平移或者平移量爲0的全部仿射變換能夠用以下變換矩陣描述:get
\[ \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\)座標系)而言的。其餘變換矩陣同理。
總結一下:
這時再對照上面的各類變換矩陣,就很好理解了。
若是給定兩個對應點集,如何估計指定變換矩陣的參數?
一對對應點能夠列兩個線性方程,多個對應點能夠列出線性方程組,爲了求解參數,須要的對應點數至少爲自由度的一半,多個點時構成超定方程組,能夠基於最小二乘或者SVD分解等方法進行求解,這裏再也不展開。