1. 程式人生 > 其它 >影象的幾何變換

影象的幾何變換

(1)縮放變換(Scale)

可以用矩陣乘法的形式表示:

不規則縮放的表示:

(2)映象變換(Reflection)

(3)切割變換(Shear)

變換的只是橫座標,垂直方向沒有變。固定一邊,拉動另一邊。

推導過程可以拿其中具體的某些點,比如左上方那個點的前後變化。

(3)旋轉變換(Rotate)

推導過程可以拿右下角的點和左上角的點的前後變化,列方程求解。下面是拿右下角的點推匯出矩陣第一列的值。

旋轉 -θ 角度如下。可以看到,旋轉 -θ 角和旋轉 θ 角的轉置是相等的。從定義上來看,旋轉 -θ 角其實就是旋轉 θ 角的矩陣得到的逆。

於是在旋轉中,旋轉矩陣的逆就等於旋轉矩陣的轉置。那麼我們如果想知道往相反方向旋轉角度的矩陣,就只需要得到正向旋轉的矩陣,然後轉置。

(在這裡插一句,在數學上,如果一個矩陣的逆等於它的轉置,那麼我們稱這個矩陣為正交矩陣)

(4)平移變化(Linear Transforms)

以上的變換都是線性變換,即都可用下面的 2 * 2 的變換矩陣來表示:

但是現在來看平移變換:

用矩陣的方式來表示平移變換如下。平移不能夠直接寫成一個矩陣乘以一個向量的形式,可見平移變換不是線性變換。

也就是說我們現在沒辦法用 2 * 2 的變換矩陣來表示平移變換了,但我們又不想單獨為平移變換開一個特例。

於是引入齊次座標的概念,即將一個原本是 n 維的向量用一個 n+1 維向量來表示。

需要注意的是,當我們引入了齊次座標的概念後,就有如下對以前概念的新的解釋:

比如二維的點加上一個維度,是 1;二維的向量加上一個維度,是 0。

我們從新的概念上看,向量相加仍然是向量,座標點相減得到向量,座標點與向量相加得到座標點,這都符合我們原先對於向量的概念。而在這裡,點與點相加,意味著第三個維度不再是 1,我們假設為 w,則三個維度都除以 w,得到新的座標點,這個座標點其實是兩個座標點的中點。

我們將需要進行平移變換的變換稱為仿射變換(Affine Transformations)

並且引入齊次座標後的變換如下:

那麼此時縮放、旋轉、平移的 3 * 3 變換矩陣如下:

可以看到第三行的資料都是 0 0 1,因此儲存變換矩陣時其實只需要儲存前面兩行的資料。

(5)逆變換

逆變換是變換矩陣的逆矩陣。所以通過對變換矩陣求逆就能實現從變換後的圖形變換回原影象。

(6)組合變換

上圖的變換不是簡單通過一個變換就能實現的,我們有兩種思路,先平移再旋轉,或先旋轉再平移。

先平移後旋轉的思路是行不通的,平移後再圍繞原點座標怎麼也轉不到預期的位置。

所以採用先旋轉後平移。

考慮到變換矩陣都是 3 * 3 的,根據結合律,無論前面進行了多少次變換,最終得到的都是一個 3 * 3 的矩陣。

如何將一個遠離原點的圖形在給定點上進行旋轉變換呢?

先平移向量 c 到原點位置,再進行旋轉操作,最後再平移向量 c 回去。矩陣形式在上面。

(7)類推到三維

(8)三維空間中的變換

縮放和平移沒有問題,但在三維空間中最複雜的操作可能就是旋轉了。

任意的旋轉較複雜,我們先看最簡單的繞固定的 x、y、z 軸的旋轉

繞 x 軸的旋轉,x 是不變的,反映在矩陣中就是左上角 3 * 3 的矩陣中第一行是 1 0 0,第一列是 1 0 0。而那個 2 * 2 的矩陣就是對 y、z 平面進行的 α 角度的旋轉。

同樣道理,繞 z 軸旋轉也是類似的。但是繞 y 軸的旋轉就有點不一樣。

是 z 叉乘 x 得到 y,而不是 x 叉乘 z,右手座標系,因此是反的。

能夠用簡單的旋轉組合成複雜的旋轉,分別繞三個軸旋轉 α角、β角、γ角,這三個角又被稱為尤拉角。可以形象的看作飛機滾轉(Roll);飛機俯仰(Pitch);飛機偏航(Yaw)。

圖形學裡也有人用以上公式將繞任意軸的旋轉分解成繞 x、y、z 軸的旋轉的組合。

繞軸 n 旋轉 α 角度,但 n 只是一個向量,因此如果說繞某個軸旋轉,則是預設過原點的,即軸的起點在原點上。

那如果我真的要讓它沿著任意軸旋轉怎麼辦?用之前的辦法,先平移到原點,再旋轉,然後平移回來。

I 是單位矩陣,矩陣 N 的理解如下:

這裡的 * 並不是乘的意思,而是矩陣 A*。矩陣 N 實際上就是向量 ( x, y, z ) 的 dual matrix,可取代其做叉乘。