一、基礎概念
1. projective transformation = homography = collineation.
2. 齊次坐標:使用N+1維坐標來表示N維坐標,例如在2D笛卡爾坐標系中加上額外變量w來形成2D齊次坐標系$(x,y) \Rightarrow (x,y,w)$
齊次坐標具有規模不變性,同一點可以被無數個齊次坐標表達.$(x,y,1) \Rightarrow (ax,ay,a)$ 齊次坐標轉化為笛卡爾坐標可以通過同除最后一項得到.
3. 單應性變換是對齊次坐標下點的線性變換,可以通過矩陣運算來表達$ x^{'}= Hx$
H為非奇異矩陣.
二、基礎變換
剛體變換(rigid transformation): 旋轉和平移變換/rotation,translation, 3個自由度,點與點之間的距離不變
$$ x' = \begin{pmatrix} R&t \\ 0^T&1\end{pmatrix}x $$
R為2*2旋轉矩陣,t為2維列向量,0^T為0的二維行向量
相似變換(similarity transformation): 增加了縮放尺度, 四個自由度,點與點之間的距離比不變
$$x' = \begin{pmatrix} sR & t \\ 0^T & 1 \end{pmatrix}x$$
s為縮放尺度
仿射變換(affine transformation): 仿射變換和相似變換近似,不同之處在於相似變換具有單一旋轉因子和單一縮放因子,仿射變換具有兩個旋轉因子和兩個縮放因子,因此具有6個自由度. 不具有保角性和保持距離比的性質,但是原圖平行線變換后仍然是平行線.
$$x' = \begin{pmatrix}A&t \\ 0^T&1\end{pmatrix}x$$
A為2*2的非奇異矩陣,可被分解為如下: $A = R(\theta)R(-\phi)DR(\phi)$
其中$R(\theta) R(\phi)$ 為旋轉矩陣,D為對角陣$ D = \begin{pmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{pmatrix} $
$\lambda_1 和 \lambda_2$可以看做兩個方向的縮放比.
投影變換(projective transformation): 也叫作單應性變換。投影變換是齊次坐標下非奇異的線性變換。然而在非齊次坐標系下卻是非線性的,這說明齊次坐標的發明是很有價值的。投影變換比仿射變換多2個自由度,具有8個自由度。上面提到的仿射變換具有的“不變”性質,在投影變換中已不復存在了。盡管如此,它還是有一項不變性,那就是在原圖中保持共線的3個點,變換后仍舊共線。投影變換表示如下:
$$x' = \begin{pmatrix}A&t \\ V^T&v\end{pmatrix}x$$
其中$V = (v_1,v_2)^T$
透視變換: 透視變換將圖像投影到一個新的視平面,是二維到三維再到另一個二維(x', y')空間的映射。
透視變換前兩行和仿射變換相同,第三行用於實現透視變換。透視變換前后,原來共線的三個點,變換之后仍然共線。
以上公式設變換之前的點是z值為1的點,它三維平面上的值是x,y,1,在二維平面上的投影是x,y,通過矩陣變換成三維中的點X,Y,Z,再通過除以三維中Z軸的值,轉換成二維中的點x’,y’.
從以上公式可知,仿射變換是透視變換的一種特殊情況.它把二維轉到三維,變換后,再轉映射回之前的二維空間(而不是另一個二維空間)
三、Python實現
python版本:2.7
依賴包:scipy,numpy,pylab,PIL
1. 使用仿射矩陣進行image warping: 圖像扭曲
圖片:trees_001.jpg
from scipy import ndimage from numpy import * from PIL import Image from pylab import * im = array(Image.open('trees_001.jpg').convert('L')) H = array([[1.4,0.05,-100],[0.05,1.5,-100],[0,0,1]]) #im2 = ndimage.affine_transform(im,H[:2,:2],(H[0,2],H[1,2])) im2 = ndimage.affine_transform(im,H[:2,:2],(H[0,2],H[1,2])) figure() gray() imshow(im2) show()
結果: