中值座標及其應用(僅討論圖像變形與紋理參數化)

  本文主要的參考文獻爲:
1. 遊戲編程中的數學——調和函數和中值座標
2. Hormann K, Floater M S. Mean value coordinates for arbitrary planar polygons[J]. Acm Transactions on Graphics, 2006, 25(4):1424-1441.
3. Floater M S. Mean value coordinates[J]. Computer Aided Geometric Design, 2003, 20(1):19-27.
  一般來說,我們不通過一個模型含有的網格(通常爲三角形網格或四邊形網格)以及頂點去理解它,而是在其網格上建立一個函數,這個函數擁有特定的性質,有助於解決我們面臨的難題。那麼這次介紹一個在網格上建立函數的方法——中值座標。中值座標是90年代後期產生的,其背後的數學原理卻得追述到18、19世紀了,然而直到今天它依然沒有受到遊戲開發界足夠的重視……本文重點是談談中值座標的構造與應用。

中值座標的“前菜”

  由Ceva 逆定理可以很容易證明三角形Δv1v2v3 的三條中線交於一點(重心)v ,即重心的存在性得以證明:ω1,ω2,ω3R,s.t.

ω1v1+ω2v2+ω3v3ω1+ω2+ω3=v.

  Mo¨bius 在1827年將ω1,ω2,ω3 定義爲v 的重心座標。在實際使用時,通常會對重心座標進行歸一化。
  這些歸一化後的重心座標在網格上是連續的,並且具有Lagrange 性:
ωi(vj)=δij={1,i=j0,ij.

  這就是爲什麼它們通常用於對一個三角形區域進行線性插值,並且在計算機圖形學中具有廣泛的應用(例如Phong 着色,紋理映射),幾何建模(例如B 樣條插值)以及許多其它領域(例如有限元方法)。
  在許多實際應用中,將重心座標推廣到具有任意n 邊形上的插值是非常必要的。並且通常用重心座標的下述表現形式:
i=1nωi(v)(viv)=0,

  再將其歸一化得
λi(v)=ωi(v)j=1nωj(v),

  這樣平面上的任一點v 均可以寫成v1,v2,,vn 在權重ω1,ω2,,ωn 下的仿射組合。而且,這些座標應該滿足Lagrange 性:
λi(vj)=δij={1,i=j0,ij.

中值座標的構造

  令Ψ 是平面上的一個任意簡單多邊形(在幾何形狀中,簡單多邊形是由直線,非相交的線段或“邊”組成的扁平形狀,其成對連接以形成封閉路徑。 如果兩邊相交,那麼多邊形並不簡單。定義參考自百度百科簡單多邊形),其頂點v1,,vn(n3) ,其各邊(互不相交)
  

ei=(vi,vi+1)={(1μ)vi+μvi+1:0<μ<1},i=1,n1,

  如圖所示爲一些簡單多邊形的小栗子:

  由上圖可以看出,簡單多邊形可以爲凹多邊形,也支持嵌套操作,並不侷限於單個凸多邊形。
  對於i=1,,n ,我們定義vR2vi 的距離:

ri(v)=||viv||,

  這是通常的歐氏距離,並用αi(v) 表示vivvi+1 。則
Ai(v)=ri(v)ri+1(v)sin(αi(v))2,Bi(v)=ri1(v)ri+1(v)sin(αi1(v)+αi(v))2,

  它們分別表示Δvvivi+1Δvvi1vi+1 的面積。各符號的直觀說明可參考下圖:

這裏寫圖片描述  

  易知Ai(v),Bi(v),Ai1(v) 是關於ivi1vivi+1v 的齊次重心座標,即

Ai(v)(vi1v)Bi(v)(viv)+Ai1(v)(vi+1v)=0.()

  通常,這些座標還需要進行歸一化,即需要除以Ci=Ai1(v)+Ai(v)Bi(v) 。顯然這些重心座標直接依賴於四邊形vvi1vivi+1 的各部分面積。這是一個很棒的性質(^▽^)!
  現在讓我們來考慮一下v 關於所有三角形1,,n 的齊次重心座標,不妨作如下定義(在後面你們便能夠體會到這樣的定義是多麼地巧妙~):
ωi(v)=bi1(v)Ai2(v)bi(v)Bi(v)+bi+1(v)Ai+1(v),

  其中權重函數bi:R2R 的選擇是有一定講究的(這個會放在後面討論),則由(*)可以知道函數ωi 是相應於Ψ 的齊次重心座標,這是因爲:
i=1nωi(v)(viv)=i=1nbi(v)(Ai(v)(vi1v)Bi(v)(viv)+Ai1(v)(vi+1v))=0.

  欲驗證上式,我們首先得解釋一下當i=1v0,A0 代表的意義,以及當i=nAn+1 代表的意義。其實用數據結構當中循環隊列的觀點去看待就很容易理解了:

  由上圖可以看出,v0 就相當於vn ,同理可得A0 相當於AnAn+1 相當於A0
  現在的關鍵步驟是對於齊次重心座標的歸一化,必須保證λi(v)=ωi(v)j=1nωj(v) 中的分母不爲0。對於凸多邊形這是容易實現的。
  事實上,由ωi(v) 的定義我們可以得到

W(v)=i=1nωi(v)=i=1nbi(v)Ci,

  當Ψ 是凸多邊形時,所有Ci 都有相同的符號,並且只要權重函數bi(v) 恆正(負),W(v) 不爲0。這裏權重函數bi(v) 的恆正(負)性是比較重要的(但在後面可以看到,這個並非決定因素),舉個栗子,不妨考慮Wachspress 齊次座標或者離散諧波座標,它們可以由下述權重函數產生:
bWi=1Ai1Ai,bDi=r2iAi1Ai.

  然而,在一個非凸多邊形中,W(v) 可能取0,很重要的一個原因是此時bi(v) 並不是恆正(負)的。於是歸一化後的齊次重心座標λi(v) 將有可能出現間斷點。
  爲了解決上述問題,通常採用的解決方案是令權重函數bi(v) 爲一個常數函數,如令bi=1Ci ,如此一來Wn>0 。儘管這樣一個特殊的操作能夠給出一個welldefined 的歸一化齊次座標λi (只要Ψ 中的任意三個頂點不共線即可),但卻出現了一個致命的缺陷!!!它不滿足Lagrange 性:
λi(vj)δij={1,i=j0,ij.

  針對上述問題,SukumarMalsch 在2005年提出了度量座標:
bMi=1Ciqi1qi,

  其中qi=ri+ri+1||vi+1vi|| 保證了W(v) 不爲0。其相應的歸一化座標滿足Lagrange 性,但它與離散齊次座標類似,它們都無法保證在一個凸多邊形內的取值介於0到1之間。因此,由此產生的插值函數有可能將插值點“放置”在數據集閉包的外邊,這在某些應用中是不希望的。
  現在,我們就來介紹一種最常用的重心座標,它就是我們今天這篇文章的主角——中值座標,其權重函數是醬紫定義的:
bMVi=riAi1Ai

  可能看到這裏就有人感到不解了,這貨長得不就跟Wachspress 齊次座標或者離散諧波座標的權重函數差不多嗎?爲什麼它們有可能使得W=0 ,而中值座標的權重函數就能避免這樣的情況發生呢?
  事實上,這個證明是比較複雜的,需要兩個引理才能證明,篇幅較長,因此這裏不再贅述。有興趣的同學可以看看第2篇參考文獻,文中的定理4.3便給出了答案。
  繼續走下去,將bMVi 代入ωi(v) 的定義式,得
ωi(v)=bi1(v)Ai2(v)bi(v)Bi(v)+bi+1(v)Ai+1(v)=ri1AiriBi+ri+1Ai1Ai1Ai,

  再將Ai(v)=ri(v)ri+1(v)sin(αi(v))2,Bi(v)=ri1(v)ri+1(v)sin(αi1(v)+αi(v))2 代入,同時結合一些三角函數的性質可以將ωi 簡化爲
ωi=2tan(αi1/2)+tan(αi/2)ri,

  上式是Floater 在2003年得到的結果。注意到這些ωi 雖然定義在平面區域上但卻具有三個分量(齊次座標),且ωi 只依賴於vi 及其兩個鄰點vi1,vi+1 。這與Wachspress 齊次座標或者離散諧波座標類似,但卻不適用於度量座標,因爲它依賴的是vi2,,vi+2 五個座標點。
  至此,離整個中值座標的構造便僅差一步了!!!✿✿ヽ(°▽°)ノ✿

中值座標的性質

  對於任一簡單多邊形的集合Ψ ,我們稱函數λi:R2R,i=1,,n 爲中值座標,其中

λi(v)=ωi(v)/nj=1ωj(v), vΨ,(1μ)δi,j+μδi,j+1,v=(1μ)vj+μvj+1ej,δij,v=vj

  中值座標具有如下優美的性質(證明都可以參見第2篇參考文獻):
  • 仿射精度:對於任一仿射函數φ:R2Rd 都有i=1nλiφ(vi)=φ
  • Lagrange 性:λi(vj)=δi,j
  • 光滑性:vvj 時,λiC ;而當v=vj 時,λiC0
  • 正則性:i=1nλi1
  • 相似不變性:如果φ:R2R2 是具有相似性的(此處具有相似性的變換定義爲該變換是一個平移變換,旋轉變換,反射變換,等距縮放變換或者它們的組合),且Ψ^=φ(Ψ) ,則λi(v)=λ^i(φ(v))
  • 線性無關性:如果i=1nciλi(v)=0,vR2 ,則ci=0
  • 如果我們令Ψ^ 是由Ψej 邊上增加一點v^=(1μ)vj+μvj+1 ,則λj=λ^j+λ,λj+1=λ^j+1+μλ^ ,且λi=λ^i,ij,j+1
  • 線性性:λiΨ 的任一條邊ej 上是線性的;
  • 非負性:λi 在凸多邊形的內核上是正的,其中,平面上簡單多邊形的核是該多邊形內部的一個點集,該點集中任意一點與多邊形邊界上一點的連線都處於這個多邊形內部。譬如說,就是一個在一個房子裏面放一個攝像 頭,能將所有的地方監視到的放攝像頭的地點的集合即爲多邊形的核。(參考自博客半平面交,求解多邊形內核

    至此,整個中值座標的構造算是大功告成了!!!✿✿ヽ(°▽°)ノ✿

中值座標的應用

  中值座標最主要的應用便是在給定簡單多邊形Ψ 的頂點vi 以後,對於整個多邊形區域的插值。換句話說,如果fi(v)Rd 是在vi 上的插值基函數,則我們可以將函數F:R2Rd 定義如下:

F(v)=i=1nλi(v)fi(v).

  由於λiLagrange 性和線性性,F(vi)=f(vi) ,且F(v)Ψ 的任一條邊ej 上是線性的。
  事實上,接下來所討論的兩個應用本質上還是體現了一種插值思想。

圖像變形

  中值座標的一個應用是圖像變形,因爲中值座標爲這個問題提供了一個特別簡單的解決方案,可簡要地說明如下。
  給定一個矩形區域Ω ,一個源多邊形的集合Ψ ,其頂點viΩ ,以及一個拓撲同胚的目標多邊形的集合Ψ^ (顯然ΨΨ^ 頂點數相同),其頂點v^iΩ ,我們想構建一個平滑的變形函數f:ΩΩ ,它將每一個vi 映射到相應的v^i 。這樣一個變形函數f 可以通過令I^=If1 將一個源圖像I:ΩCC 是一個顏色空間)轉換爲一個目標圖像I^:ΩC 。我們通常會令I^=If1 而非I^=If ,這樣一種思想也稱爲逆向映射(兩者的不同其實即爲正映射與逆向映射的區別,具體可以參見博客圖像變換——向前映射和向後映射),等等在後面會用一些實驗結果圖讓大家感受一下兩種映射方式的不同。
  許多時候,圖像變形函數可以用Ψ^ 的中值座標λ^i 去表示:

g(x)=i=1nλ^i(x)vi

  它將每一個v^i 映射到vi 上,如此一來便可以定義一個合適的圖像變形函數。舉一個不是特別恰當的例子,Shepard 提出了IDWInverse distance weighted interpolation methods )用於圖像變形,之所以說它不是很恰當,是因爲IDW 並不是嚴格建立在中值座標的理論基礎之上的,準確地說它是沿用了一般的重心座標的思想,該方法要求找到滿足以下形式的函數:
g(v^)=i=1nλi(v^)gi(v^).
 
  • gi(x) 滿足gi(v^i)=vi ,這是對於點v^i 的插值,i=1,2,,n 。對於插值基函數gi 而言,一般使用線性或者二次多項式,多項式係數可以用插值點處的導數值去確定。
  • λi:R2R 是權函數,須滿足條件λi(v^i)=1,i=1nλi(v^i)=1λi(v^)0,i=1,2,,n
      Shepard 提出了以下簡單的權函數:

    λi(v^)=ωi(v^)i=1nωj(v^),

      其中ωi(v^)=1ririv^v^i 的距離。
      IDW 是一種全局插值算法,即全部樣本點都會參與到與某一插值結點(實際運用當中又叫控制點)的運算當中去,所以它的計算複雜度起碼爲O(nN) ,其中n 是控制點的數量,N 是整個目標圖像的像素點數量。  
      我們不妨來看一下分別令I^=IfI^=Ig 會產生什麼不同的神奇現象。(g=f1 ,下面直接令gi(v^)=v^+viv^i
      若採用I^=If ,容易發現生成的目標圖像中會出現許多空洞點(爲了突出空洞點,圖中用深紅色點表示空洞點),如下圖所示:

    這裏寫圖片描述
    正向映射實驗效果圖

      對於上述問題,我們需要對空洞進行填補,我分別採用了均值濾波模板、中位數濾波模板與即時填充空洞進行處理:


    這裏寫圖片描述
    均值濾波模板填補效果圖



填補後局部放大圖

  容易看出,在對圖像進行空洞區域的填補以後,出現了一些疑似空洞的點,故仍需要進行改進。先來簡要分析一下原因~
  由於存在取平均值的操作,故當一個像素點周圍存在不同顏色的像素點時,填補以後容易出現顏色差異較大的點,譬如黑色方塊和白色方塊相鄰邊界上的空洞點,填補以後就會變成灰色點。
  找到原因以後便可以有針對性地進行改進,自己採用的解決方案是替換均值濾波模板改用中位數濾波模板,需要注意的是,對一個空洞點填補時並不考慮周圍的空洞點,即不應該將空洞點的像素用來求中位數;其次,若一個空洞點周圍的非空洞點像素點數量爲偶數時,其中位數是需要取平均的,此時容易出現類似使用均值濾波模板的填補錯誤,於是需要進行如下判斷,假設該空洞點周圍的非空洞點像素點數組爲surrounding_pixels,surrounding_pixels.size()%2==0

if surrounding_pixels[i] =  = surrounding_pixels[i - 1],i=surrounding_pixels.size()/2
  將surrounding_pixels[i]賦給空洞點;
else
  爲了避免出現取均值的操作,依然將surrounding_pixels[i]賦給空洞點;


這裏寫圖片描述
中位數濾波模板填補效果圖

  在作了上述改進以後,發現仍存在一些問題,如:


這裏寫圖片描述
改進填補後的局部放大圖

  可以看出,一些方塊邊緣會出現“毛邊”現象,即方塊顏色會“滲入”相鄰的方塊。究其原因,發現在填補時空洞點周圍的空洞點太多,影響了其中位數的取值,因爲對空洞點進行中位數濾波時是要捨去周圍的空洞像素的,如下圖所示:


這裏寫圖片描述

  爲了解決上述現象,需要對空洞點進行即時填補,因爲在之前的程序當中,找到空洞點對其進行中位數濾波以後,出於當前填補結果若是錯誤會對後面的填補效果產生影響的考慮,並非直接進行填補,而是先把像素存儲起來,等到最後再進行填補。
  而現在則需要對此做出改變,只要保證當前空洞點的填補結果是正確的就可以了。自己的做法如下所示:假設該空洞點周圍的非空洞點像素點數組爲surrounding_pixels,surrounding_pixels.size()%2==0

if surrounding_pixels[i] =  = surrounding_pixels[i - 1],i=surrounding_pixels.size()/2
  將surrounding_pixels[i]賦給空洞點;
else
  先不進行操作,將這個點記錄下來,等對全部點進行中值濾波以後再對這個點進行中值濾波,此時因爲之前的空洞點已被填補,故它能獲得更多有效的像素點;


這裏寫圖片描述
即時填補空洞效果圖

  可以看出,在改進以後實驗結果有了一定的改善。那麼,我們再來看一下采用I^=Ig 的實驗效果:


這裏寫圖片描述
逆向映射實驗效果圖

  可以看出,實驗的效果十分理想。無論是在算法運行時間及算法實現難度上都遠勝之前的正向映射+空洞填補算法。當然對於圖像變形還有其它優秀的算法,比如徑向基函數算法(RBF 算法),限於篇幅此處不再贅述,不過可以弱弱地放張效果圖讓你們看看哈:


這裏寫圖片描述

紋理參數化

  中值座標的另一個應用是紋理參數化,簡要地說明如下。


這裏寫圖片描述
(圖片畫得並不是很標準哈,見諒(:3 」∠)

  首先需要進行局部參數化:將局部結構映射到平面上,映射過程滿足下列條件:

||viv||=||xix||,vivvi+1=2πxixxi+1/θ,

  其中,θ=i=1dxixxi+1
  對於點v ,考慮多邊形v1v2vn ,它存在唯一的中值座標,不妨設其中值座標爲(λ1,λ2,,λn) ,則有v=i=1nλi(v)vi,λi(vj)=δij
  如此一來,我們便可以定義函數g(v) 來進行紋理參數化:
g(v)=i=1nλi(v)gi(v).

  其中,gi(vi),i=1,2,,n 根據自己的需要進行設置。
  然而,真正將上述方法用於紋理參數化的話會出現計算量太大的問題,因爲它需要對模型內每一個點進行計算。因此,在實際運用當中,如果模型是比較規則的或者有足夠多的頂點集,則可以棄用上述的中值座標,改用構造一個關於頂點變換的稀疏線性系統,亦可以求出形狀變化比較小的參數化結果。

這裏寫圖片描述
原網格


這裏寫圖片描述
參數化結果

總結

  我們已經表明,中值座標將三角形重心座標的概念推廣到任意的簡單多邊形,甚至是這些簡單多邊形的集合。中值座標具有許多很漂亮的性質(如Lagrange 性),對於在簡單多邊形的插值別有用。
  我們注意到,中值座標在任意簡單多邊形的情況下並不是處處都是正的。另一方面,可能是恰恰由於這些性質,中值座標的插值性能才能如此棒,而且在實際應用中發揮着重要作用。(๑•̀ㅂ•́)و✧文中實驗的源碼會上傳到我的Github 上,有興趣的同學可以自行下載玩玩~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章