当前位置 博文首页 > berry_K的博客:图像变形

    berry_K的博客:图像变形

    作者:[db:作者] 时间:2021-09-16 19:24

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

      前言

      ? 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

      檔案下載

      • Morphing.rar

      TOP

    cs