图像变形

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

    前言

      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

    single-line

    對於Destination Image上的每一個pixel,都可以在每一條特徵線上找到兩個變數v跟u,然後再去Source Image上對應的特徵線上帶入u跟v,可以取得一個新的點X’,Destination Image上的X的色彩值便是取自於Source Image的X’.
    以下是u , v的計算公式:

    u_and_v

    這邊的u與圖上的不太一樣,他多除了一個PQ長度,代表的是所占線段的長度比列,因此在算X’時u*(Q’ – P’)就不需要再除以P’Q’的長度了.

    不過我們不可能只有一對特徵線,如果要讓兩張圖相對應的話,我們會需要很多對特徵線,因此就衍生出了Multiple Lines的算法.

    Multi line-pair

    multi-line

    方法跟Single line-pair大同小異,只是現在Destination Image上的一個點在Source Image上會有很多個新產生的X’,因此為了將他們整合到一個點上,我們給予每個點一個Weight,代表他們各自的重要性:

    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’的距離
    weight_2
    ---因此最後整個的演算法如下

    algorithm

    ---其中最後在算出點X’時如果有小數點的話,利用bilinear interpolation來取得色彩值

    bilinear

    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

    womencheetah
    women source imagecheetah source image
    wc_pab_011wc_pab_012
    p = 0 , a = 1 , b = 1p = 0 , a = 1 , b = 2
    wc_pab_022wc_pab_112
    p = 0 , a = 2 , b = 2p = 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

    成品效果

    man最基本的人臉Morphing
    ellisMonta Ellis從勇士轉去公鹿了...
    Thank You , Ellis...
    linLinsanity!!!!!
    回顧林書豪籃球生涯
    (這一部分主要是morph身體姿勢)
    op我要成為海賊王!!!
    cat_pika貓 與 皮卡丘

    TOP

    程式使用說明

    1. 將檔案解壓縮之後會有一個Morphing資料夾,裡面會有morphing.c和morphing.h這兩個source code,如果有安裝opencv可以compile之後執行,亦能修改程式內容。然後有兩個資料夾test_img和result,前者是提供一些可以用來morphing的圖片,而後者提供了我們跑出的一些結果,使用者也能把自己跑出的影像放入。最後是morphing.exe執行檔,使用者能直接開起來執行我們的程式。

    example1

    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 會得到較好的結果
    example2

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

    example3

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

    example4

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

    example5

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

    example6

    TOP

    檔案下載

    TOP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值