Morphing一種影像處理技術,可以產生從一張影像慢慢轉變回另外一張影像中間的過程。而我們這次主要是閱讀及實作Feature-Based Image Metamorphosis這一篇paper.
-Feature-Based Image Metamorphosis , SIGGRAPH 1992
Morphing主要分為兩部分,分別是warping和cross-dissolving。首先要做的是warping,warping改變的是兩張圖的形狀使其相似,這是paper主要在陳述的部分。而cross-dissolving則是將兩張warping過的圖做色彩的內插。
TOP
Single line-pair
對於Destination Image上的每一個pixel,都可以在每一條特徵線上找到兩個變數v跟u,然後再去Source Image上對應的特徵線上帶入u跟v,可以取得一個新的點X’,Destination Image上的X的色彩值便是取自於Source Image的X’.
以下是u , v的計算公式:
這邊的u與圖上的不太一樣,他多除了一個PQ長度,代表的是所占線段的長度比列,因此在算X’時u*(Q’ – P’)就不需要再除以P’Q’的長度了.
不過我們不可能只有一對特徵線,如果要讓兩張圖相對應的話,我們會需要很多對特徵線,因此就衍生出了Multiple Lines的算法.
Multi line-pair
方法跟Single line-pair大同小異,只是現在Destination Image上的一個點在Source Image上會有很多個新產生的X’,因此為了將他們整合到一個點上,我們給予每個點一個Weight,代表他們各自的重要性:
其中length是特徵線的長度,而distance的算法如下:
先取得點X’對於P’Q的u
(1).如果0 < u <1 ,distance的值就是abs(v)
(2).如果 u < 0 ,distance的值就是點X’到P’的距離
(3).如果 u > 1 ,distance的值就是點X’到Q’的距離
---因此最後整個的演算法如下
---其中最後在算出點X’時如果有小數點的話,利用bilinear interpolation來取得色彩值
TOP
1.Line (線段資料)
CvPoint2D32f P; //start CvPoint2D32f Q; //end CvPoint2D32f M; //mid double len; //線的長度 double degree; void PQtoMLD(); //已知PQ點 算出中點,長度,角度 void MLDtoPQ(); //已知中點,長度,角度 算出PQ點 void show(); //印出線段資料 P, Q, M, len, degree double Getu(CvPoint2D32f X); //傳入一個點X算出X在此線段的u double Getv(CvPoint2D32f X); //傳入一個點X算出X在此線段的v CvPoint2D32f Get_Point(double u , double v); //傳入u , v 算出此線段上u v所產生的新點X’ double Get_Weight(CvPoint2D32f X); //傳入一點X算出X在此線段所能獲得的Weight2.LinePair (兩張圖相對應的特徵線資料)
Line leftLine; //左圖的特徵線 Line rightLine; //右圖的特徵線 vector warpLine; //兩張圖中間line Interpolation所產生的特徵線 void genWarpLine(); //產生兩張圖中間用line Interpolation的特徵線 void showWarpLine(); //印出相關資料3.Image (產生新圖的資料)
int frame_index; //第幾個frame IplImage *new_image; //要新產生的圖 Image(int i); //一宣告就初始化 是第i個frame CvScalar bilinear(IplImage *image , double X , double Y ); //做bilinear interpolation的運算,取得點(X,Y)的色彩值 void Warp(); //實作PAPER的演算法並產生新的影像 //warping + cross-dissolving
TOP
TOP
women source image | cheetah source image |
p = 0 , a = 1 , b = 1 | p = 0 , a = 1 , b = 2 |
p = 0 , a = 2 , b = 2 | p = 1 , a = 1 , b = 2 |
雖然每次畫的線多少都有點誤差,不過從上圖中我們可以發現在p = 0 , a = 1 , b = 1時效果相當差,眼睛跟嘴巴的位置都跑掉了。但是把b從1調到2(只變動b)之後,效果明顯大增,眼睛跟嘴巴幾乎都有對到。如果我們把a從1調到2(只變動a)之後,效果沒有明顯的變動。如果我們把p從0調到1(只變動p)之後,效果卻下降了,眼睛跟嘴巴的位置開始跑掉。這幾張看來,p = 0 , a = 1 , b = 2這張的效果最佳.
TOP
最基本的人臉Morphing | |
Monta Ellis從勇士轉去公鹿了... Thank You , Ellis... |
|
Linsanity!!!!! 回顧林書豪籃球生涯 (這一部分主要是morph身體姿勢) |
|
我要成為海賊王!!! | |
貓 與 皮卡丘 |
TOP
1. 將檔案解壓縮之後會有一個Morphing資料夾,裡面會有morphing.c和morphing.h這兩個source code,如果有安裝opencv可以compile之後執行,亦能修改程式內容。然後有兩個資料夾test_img和result,前者是提供一些可以用來morphing的圖片,而後者提供了我們跑出的一些結果,使用者也能把自己跑出的影像放入。最後是morphing.exe執行檔,使用者能直接開起來執行我們的程式。
2. 接著程式會需要使用者輸入一些資訊。依順序是:
3. 輸入完資訊後便會產生兩個視窗,分別是left和right,程式的目標便是把left的影像逐漸準變為right視窗的影像。
4. 接著可以在影像上畫出相對應的特徵線。按下小寫c便可以畫一對特徵線,要先在left視窗換完一條特徵線之後,再去right視窗畫一條相對應的特徵線。等畫完這一對特徵線後,按一次小寫c便可以重複這步驟在劃一對特徵線。(注意:每畫一對特徵線一定要先按一次小寫c才可以)
***特徵線頭尾也是相對應的,所以對應的特徵線方向也要一致!***
5. 畫完特徵線之後,按下小寫w變可以開始morpging! 這時請耐心等待
6. 最後便會秀出產生的結果,並且在你設定的路徑儲存檔案。如果要結束程式的話便可以按小寫q離開。
TOP
TOP