![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMhhTMhZGMyUGZidDO0gTMjZWYiBzYxMWN3cjYmBzN18CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
本文同步發表在我的微信公衆号“計算攝影學”,歡迎掃碼關注
你有沒有想過,下面這個視訊中的特效應該如何實作?
Morphing Female Starshttps://www.zhihu.com/video/1179863411041787904
【轉載請注明來源與作者】
這個效果叫做面部變形(Face Morph),這裡面将要用到一種叫做扭曲(Image Warp)的圖像變換技術。在3. 數位相機内的圖像處理-基本圖像濾波中,我講過基本的圖像處理包括如下兩大類,當時我重點介紹了圖像的濾波類操作。
- 改變圖像的像素值, 我們稱為濾波(Filtering)
- 改變圖像的像素位置,我們稱為扭曲(Warping)
圖像的兩類變換
而今天這篇文章則會給大家講解2D圖像的扭曲類操作。
1. 基本圖像扭曲變換
2D圖像的變換有多種,包括平移、旋轉、比例縮放、仿射變換、透視變換、柱狀變換等,如下圖所示:
各種2D圖像變換
我們來看看一種稱之為Scaling的縮放變換,下面從圖1到圖2就是一次Scaling變換
如果用數學表達式表達,那麼上述變換是:
如果我們對上述公式略加改造,變為:
那麼得到的将是另外一種叫做Shear的變換:
對于圖像的旋轉,那麼有:
上面的幾種2D變換都可以這樣表達,即圖像中的每個點的坐标都經過一個矩陣M的改變來得到:
這裡的M是一個2 x 2的矩陣,很多變換都可以這樣來表達,例如
2. 齊次坐标
但并非所有的2D變換都可以用2 x 2的變換矩陣來表達,例如2D的平移:
這裡 2 x 2的M就不存在,你可以仔細試試,看是否能行?
那麼此時我們如何再把平移表現為矩陣M和點的乘法呢?這裡就必須引入一種新的武器了,這就是所謂的
齊次坐标。對于2D點來說,齊次坐标就是在原有的坐标分量上加入一個常量1
從定義上講,其次坐标乘以任意常量後的三維向量間都是等價的
有了這個武器,我們就能夠将2D坐标的平移表示為矩陣和點的乘積了
其中
這裡有個例子:
我們再來看看其次坐标的一些更多特性:
齊次坐标具有一定的實體意義:
我們可以将一些常見的2D變換用齊次坐标表示如下,對應的矩陣M稱為變換矩陣
當對一個點連續做多種不同的變換時,可以将多種變換的合并為一個矩陣
這裡要注意的是,變換的順序不同,結果可是
不一樣的哦!
3. 各種類型的扭曲變換及其自由度
各種類型的扭曲變換的變換矩陣如下圖所示,包括平移變換(Translation)、剛體變換(Rigid)、相似變換(Similarity)、仿射變換(Affine)、投影變換(Projective)。
它們對應的變換矩陣如下:
平移、剛體、相似變換的變換矩陣拆開看如下所示, 它們的自由度,或者說控制變量,分别為2、3、4。
而仿射變換的自由度是6,它更加的複雜:
在3維空間中,仿射變換後的物體和變換前的物體位于同一個平面上。
最複雜的變換稱為投影變換:
在3維空間中,仿射變換後的物體和變換前的物體位于通常不在同一個平面上。
4. 确定未知的圖像變換
如果已經知道下面兩個三角形 ABC和DEF,如果已知A變換為D,B變換為E,C變換為F,我們如何确定兩者之間的變換類型?
我們可以觀察到兩者時間應該有:
- 旋轉
- 平移
- 錯切
- 一點點縮放
根據前面所講的各種變換模型,我們可以認為兩者之間至少是一種仿射變換:
那麼如何求取組成變換矩陣M的各個變量的值呢?這裡我們認為:
先把變換關系表達如下:
這其實是一個2元1次方程組,其中已知的是x, y, x', y'。 相當于有兩個等式,6個未知數。 那麼我們知道為了确定所有未知數,我們至少需要6個方程,是以至少需要3對比對點。
把這樣的3對比對點的變換關系累積起來,可以寫成如下的關系:
于是,整個變換關系就可以表達為Ax=b這樣非常簡單的形式了,我們完全可以采用最小二乘法來求取x,即變換矩陣M的各個元素
有的時候,我們會遇到這種情況,即已知一對圖像I1和I1', I1'由I1變換得到。 同時我們還有圖像f,要求對f采用同樣的變換得到一幅圖像g'。 這時我們的有兩種方法:
正向變換法:
- 首先在I1和I1’之間建立足夠多對的比對點對
- 根據可能的先驗知識,假設I1和I1'之間滿足某種變換關系,例如假設他們之間滿足仿射變換關系,或者投影變換關系,建構變換矩陣
- 利用上面講的方法,求取變換矩陣中的未知量
- 對f上的點,應用此變換矩陣,将f(x,y)貼到g(x', y')上。
注意這裡第4步
注意這裡的第4步會遇到的問題,點(x,y)映射到了(x',y')上,但是x',y'是浮點數。此時我們的解決方案是将值f(x,y)散布(splatting)到(x',y')周圍的整數坐标點上。這就存在g中一個點可能會收獲(gather)多個源像素點值的可能性,這就要求我們還要計算這些值的權重均值。正向變換如此複雜,是以人們又考慮了另外一種方法叫做反向變換。
反向變換法
- 首先在I1和I1’之間建立足夠多對的比對點對
- 根據可能的先驗知識,假設I1和I1'之間滿足某種變換關系,例如假設他們之間滿足仿射變換關系,或者投影變換關系,建構變換矩陣T
- 利用上面講的方法,求取變換矩陣T中的未知量
- 求取T的逆矩陣T-1
- 對g上的點(x',y'),應用此變換矩陣T-1,可以得到源坐标(x,y)。
- 把f(x,y)拷貝到g(x',y')即完成了變換
這裡的關鍵問題依然是浮點數的處理
如果求得的(x,y)是浮點數,那麼一般會采用插值方法來擷取最終的值g(x',y'),典型的插值方法是雙線性插值,其示意圖如下:
在Matlab中,調用interp2函數即可友善的實作雙線性插值。
5. 總結
今天我給各位介紹了2D圖像的各種基本變換,包括動作包括平移、旋轉、錯切、縮放等,進一步我們引入了齊次坐标表達式,把基本的變換都用齊次坐标表達式統一起來了。接下來,我介紹了各種圖像扭曲變換,包括平移變換、剛體變換、相似變換、仿射變換,以及投影變換。這些都是非常非常重要而基礎的知識,在包括計算攝影在内的很多領域都發揮着重要的作用。例如,利用圖像的扭曲變換,可以得到非常有趣的結果,例如Face Morphy(面部變形)。
希望今天的介紹對有幫助。正如我在計算攝影學及本專欄介紹中所說,計算攝影學是多種學科的綜合學科。接下來的許多篇文章都會偏重于與計算攝影相關的投影幾何相關的知識,從某種程度上講它們更偏向于計算機視覺,敬請期待,别忘了給我點贊哦^_^
計算攝影學是綜合學科
6. 參考文獻
- CMU 2017 Fall Computational Photography Course 15-463, Lecture 10
- https://www.youtube.com/watch?v=pHlV-8UYlvw