图像变形

前言 演算法 程式主要的資料結構 程式流程 參數改變 成品效果 程式使用說明 檔案下載

前言

  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在此線段所能獲得的Weight
			
2.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

程式流程

  1. 使用者畫線
  2. 取得所有LinePair並做line interpolation產生新的特徵線
  3. 用warping + cross-dissolving產生新圖
  4. 秀出新圖並存檔

TOP

參數改變

WOMEN & CHEETAH

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. 接著程式會需要使用者輸入一些資訊。依順序是:

  1. 第一張要用來morphing的影像名稱(是相對路徑,範例是test_img資料夾中的1.jpg,因此輸入test_img/1.jpg。如果影像位置與morphing.exe相同的話只要輸入1.jpg即可)
    ***注意:兩張影像的大小需一樣 範例使用的是500 x 500***
  2. 第二張要用來morphing的影像名稱(是相對路徑,範例是test_img資料夾中的2.jpg,因此輸入test_img/2.jpg)
    ***注意:兩張影像的大小需一樣 範例使用的是500 x 500***
  3. Frame number,就是兩張影像轉換中間所要產生的照片數。(ex : 如果要產生50%的第一張圖和50%的第二張圖的影像一張,就輸入1。如果要分別產生第一張影像佔新影像比例25% , 50% , 75%的話便輸入3)
  4. 產生的新影像的名稱(是相對路徑,範例是result/morphing,因此在result資料夾中會產生morphing_0 , morphing_2 , morphing_3這三張影像)
  5. 最後輸入的是a , b , p三個參數,如果讀過paper的人可以自行下參數取得結果。我們推薦的參數是a = 1 , b = 2 , p = 0 會得到較好的結果

3. 輸入完資訊後便會產生兩個視窗,分別是left和right,程式的目標便是把left的影像逐漸準變為right視窗的影像。

4. 接著可以在影像上畫出相對應的特徵線。按下小寫c便可以畫一對特徵線,要先在left視窗換完一條特徵線之後,再去right視窗畫一條相對應的特徵線。等畫完這一對特徵線後,按一次小寫c便可以重複這步驟在劃一對特徵線。(注意:每畫一對特徵線一定要先按一次小寫c才可以)
***特徵線頭尾也是相對應的,所以對應的特徵線方向也要一致!***

5. 畫完特徵線之後,按下小寫w變可以開始morpging! 這時請耐心等待

6. 最後便會秀出產生的結果,並且在你設定的路徑儲存檔案。如果要結束程式的話便可以按小寫q離開。

TOP

檔案下載

  • Morphing.rar

TOP

你可能感兴趣的:(图像处理)