PCL MLS論文Computing and Rendering Point Set Surfaces研讀筆記

前言

做點雲處理最有名的庫當屬PCL了。PCL的MLS(Moving Least Squares)模塊用於表面平滑,而其理論基礎便是Computing and Rendering Point Set Surfaces這篇論文。本篇主要探討論文裡的3 Defining the surface - projecting 5 Generating the representation point set 這兩部份。

本文著重理解算法各步驟的前後關係,並補全了論文當中省略的公式推導。文章中螢光標記的部份表示還沒完全明白,需要再仔細研究。

定義曲面 - 投影

投影步驟

MLS對點雲做平滑,實際上在做的事情是對點雲中的每個點(下文中的 r r r),都用它附近的點(下文的 { p 1 , . . . , p N } \{p_1, ..., p_N\} {p1,...,pN})擬合一個曲面(下文的 S p S_p Sp),然後再將該點投影到曲面上。但是在這篇論文中,並不是直接尋找曲面,而是先在局部擬合一個"平"面(下文的 H H H),然後才去尋找曲面。

尋找點 r r r的擬合平面(或說座標系) H H H

論文裡對平面H的描述如下: H = { x ∣ < n , x > − D = 0 , x ∈ R 3 } , n ∈ R 3 , ∥ n ∥ = 1 H = \{x | \left<n, x\right> - D = 0, x \in R^3\}, n \in \R^3, \|n\| = 1 H={xn,xD=0,xR3},nR3,n=1。乍看之下有點不明所以。

我們可以先從我們熟悉的平面方程上手: a x 1 + b x 2 + c x 3 + d = 0 ax_1+bx_2+cx_3+d = 0 ax1+bx2+cx3+d=0。論文裡寫的 < n , x > − D = 0 \left< n,x \right>-D = 0 n,xD=0與上式是其實同一個意思,只要把 n n n這個法向量看成 ( a , b , c ) (a,b,c) (a,b,c) D D D看成 − d -d d即可。觀察 < n , x > − D = 0 \left< n,x \right>-D = 0 n,xD=0,我們可以發現,一個平面是可以由其法向量及其到原點的距離來定義的(詳見Distance from point to plane)。

要用點 r r r附近的點擬合一個平面,我們有無數種選擇,因此這裡我們還需要一個cost function,用來指引什麼樣的平面是我們所偏好的。MLS希望找到的平面用文字說明如下:希望找到一個平面 H H H,使得集合 { p 1 , . . . , p N } \{p_1, ..., p_N\} {p1,...,pN}裡的所有點 p i p_i pi到平面 H H H的距離平方和是最小的。另外,每個點還會被進行加權,離點 r r r越近的點權重越高,反之則越低。到此,已經明確了我們的目標:最小化加權距離平方和。

以下即為論文裡的方程式(1),代表尋找 H H H時用的cost function:

Σ i = 1 N ( < n , p i > − D ) 2 θ ( ∥ p i − q ∥ ) \Sigma_{i=1}^N(\left<n,p_i\right>-D)^2\theta(\|p_i-q\|) Σi=1N(n,piD)2θ(piq)

其中 q q q為點 r r r在平面 H H H上的投影,即 r r r沿平面法向量 n n n方向移動到平面上的點,它們的關係可以用 q = r + t n q = r + tn q=r+tn描述,其中 t t t為一個常數。

方程式(1)中的 ( < n , p i > − D ) 2 (\left<n,p_i\right>-D)^2 (n,piD)2代表點 p i p_i pi到平面 H H H的距離的平方; θ ( ∥ p i − q ∥ ) \theta(\|p_i-q\|) θ(piq)則是點 p i p_i pi的權重,與 p i p_i pi q q q的距離成反相關,即距離越遠權重越低。

cost function還有另一種型式,即論文裡的方程式(2):

Σ i = 1 N < n , p i − r − t n > 2 θ ( ∥ p i − r − t n ∥ ) \Sigma_{i=1}^N \left< n, p_i-r-tn\right>^2 \theta(\|p_i-r-tn\|) Σi=1Nn,pirtn2θ(pirtn)

θ ( ∥ p i − r − t n ∥ ) \theta(\|p_i-r-tn\|) θ(pirtn)這一項很好理解,就是把 q q q替換成 r + t n r+tn r+tn而已。那麼 < n , p i − r − t n > 2 \left< n, p_i-r-tn\right>^2 n,pirtn2要怎麼理解呢?

先把 < n , p i − r − t n > 2 \left< n, p_i-r-tn\right>^2 n,pirtn2中的 r + t n r+tn r+tn替換回 q q q,得到 < n , p i − q > 2 = ( < n , p i > − < n , q > ) 2 \left< n,p_i-q \right>^2 = (\left< n,p_i\right>-\left< n,q\right>)^2 n,piq2=(n,pin,q)2。因為點 q q q在平面上,故 < n , q > = D \left< n, q \right> = D n,q=D。代回上式: ( < n , p i > − < n , q > ) 2 = ( < n , p i > − D ) 2 (\left< n,p_i\right>-\left< n,q\right>)^2 = (\left< n,p_i\right>-D)^2 (n,pin,q)2=(n,piD)2,得到了與方程式(1)相同型式。因此方程式(2)與方程式(1)是等價的。

cost function中,點 p i p_i pi的權重 θ ( ∥ p i − r − t n ∥ ) \theta(\|p_i-r-tn\|) θ(pirtn)是將 p i p_i pi q q q的距離代入一個平滑、單調遞減、恆為正值的函數 θ \theta θ中所得到,我們通常選取高斯函數作為 θ \theta θ。另外,這裡代入 θ \theta θ的是 p i p_i pi q q q的距離而非 p i p_i pi r r r的距離,這在3.2節會詳述。

注意到當我們把平面 H H H定義好了,我們同時也定義了局部座標系,這個座標系的原點即點 q q q。接下來在尋找曲面時,就會用到這個局部座標系。

尋找由 r r r定義的曲面 S p S_p Sp

在這篇論文中,是用一個雙變量的多項式來表達一個曲面的。為何是雙變量呢?這是因為一個曲面有兩個自由度。曲面的數學式寫為 g ( x , y ) g(x,y) g(x,y),為一純量函數。

來看看投影是怎麼進行的:對點 r r r來說,它在平面 H H H上的投影為 q = r + t n q = r + tn q=r+tn,在曲面 S p S_p Sp上的投影則為 P ( r ) = q + g ( 0 , 0 ) n = r + ( t + g ( 0 , 0 ) ) n \mathscr{P}(r) = q + g(0, 0)n = r + (t+g(0, 0))n P(r)=q+g(0,0)n=r+(t+g(0,0))n。觀察 P ( r ) = q + g ( 0 , 0 ) n \mathscr{P}(r) = q + g(0, 0)n P(r)=q+g(0,0)n,可以發現$ P ( r ) \mathscr{P}(r) P(r)是局部座標系原點 q q q沿 n n n方向移動 g ( 0 , 0 ) g(0,0) g(0,0)距離所得到的。我們同時也可以發現, r r r q q q P ( r ) \mathscr{P}(r) P(r)三點位於同一直線上。

r r r鄰域內的點 p i p_i pi,其在局部座標系下的座標為 ( x i , y i , f i ) (x_i,y_i,f_i) (xi,yi,fi),其中 f i = n ⋅ ( p i − q ) f_i = n \cdot (p_i - q) fi=n(piq)為點 p i p_i pi在局部座標系下的z座標。點 p i p_i pi在平面 H H H上的投影為 q i = ( x i , y i , 0 ) q_i = (x_i, y_i, 0) qi=(xi,yi,0),注意投影後的z座標為0。在曲面 S p S_p Sp上的投影為 P ( p i ) = q i + g ( x i , y i ) n = ( x i , y i , g ( x i , y i ) ) \mathscr{P}(p_i) = q_i + g(x_i, y_i)n = (x_i, y_i, g(x_i, y_i)) P(pi)=qi+g(xi,yi)n=(xi,yi,g(xi,yi))。注意不論是投影到平面或曲面上,x座標及y座標都不會改變。

到了這裡,我們就看得懂論文裡公式(3):

Σ i = 1 N ( g ( x i , y i ) − f i ) 2 θ ( ∥ p i − q ∥ ) \Sigma_{i=1}^N(g(x_i,y_i)-f_i)^2\theta(\|p_i-q\|) Σi=1N(g(xi,yi)fi)2θ(piq)

在寫什麼了:它定義了一個cost function,希望找到一個曲面 S p S_p Sp(或 g g g),使得 p i p_i pi投影到曲面上之後,能與原來的 p i p_i pi越接近越好(只關注它們的z座標)。公式(3)的第二項即為權重,其定義跟找 H H H時相同。

權重函數通常使用高斯函數,即論文裡的公式(4):

θ ( d ) = e − d 2 h 2 \theta(d) = e^{-\frac{d^2}{h^2}} θ(d)=eh2d2

其中 d d d代表兩點間的距離, h h h則是一個參數,反映了點雲中相鄰點距離的期望值。我們可以透過調整 h h h來決定平滑的強度:小的 h h h會導致高斯函數下降得很快,所以在平滑時只會考慮附近一小部份的點,所以平滑效果可能不明顯;大的 h h h則會考慮較大範圍的點來做平滑,給出較強的平滑效果。

上述"尋找 H H H之後尋找 S p S_p Sp的過程可由論文中的圖三總結:
The MLS projection procedure

projection property

這一小節提到了projection property: P ( P ( r ) ) = P ( r ) \mathscr{P}(\mathscr{P}(r))=\mathscr{P}(r) P(P(r))=P(r),用白話來說就是投影函數 P \mathscr{P} P對點 r r r投影一次跟投影多次都會在同一個位置上。

計算權重時用的是 p i p_i pi q q q的距離而非 p i p_i pi r r r的距離,這裡說如果使用的是 p i p_i pi r r r的距離,那麼 θ \theta θ的值將會在法向量方向上變動,這將導致 P \mathscr{P} P不再會是一個projection。 → \rightarrow 這句話沒看懂, θ \theta θ的值不是本來就會在法向量方向上變動? 猜想這句話的意思是:假想 r r r點沿法向量方向移動,那麼 p i p_i pi r r r的距離將會隨之變動,反之 p i p_i pi q q q的距離則不會。我們希望對於" r r r點沿法向量方向移動所得到的直線"上的每一點,與某個 p i p_i pi計算出來的 θ \theta θ值都是相同的。(還是不懂這跟projection property的聯繫)

在前一小節不論是定義 H H H S p S_p Sp的cost function時,裡面都有一項 θ \theta θ權重函數,這裡建議的權重函數為高斯函數: θ ( d ) = e ( − d 2 h 2 ) \theta(d) = e^{(-\frac{d^2}{h^2})} θ(d)=e(h2d2)

其參數 d d d如上面所看到的,應該代入 p i p_i pi q q q的距離。另外還有個參數 h h h,可以把它想成是標準差的角色。 h h h越小權重下降得越快,相當於用來擬合的點變少,所以得到的曲面細節會越豐富;反之當 h h h越來越大時,權重下降得越慢,相當於用來擬合的點變多,所以曲面會越平滑。

取小 h h h與大 h h h所產生的平滑效果如論文圖四:
parameter h

實際計算投影

尋找平面H

觀察方程式(2),其中 r r r { p 1 , p 2 , . . . p N } \{p_1,p_2,...p_N\} {p1,p2,...pN}皆是給定的輸入,只有 t t t n n n是未知數,我們的目標便是找到一組 n n n t t t,使得方程式(2)能最小化。方程式(2)有多個局部最小值,我們要找 t t t最小的一個,也就是希望 q q q r r r越近越好(因為 q = r + t n q=r+tn q=r+tn)。

此處的思想是:首先估計點 r r r的法向量 n n n,然後迭代優化 t t t q q q使損失函數最小化。

注:感謝@veryneo的指正,原文的第一到三步已修正成如下形式。

Initial normal estimate in r

首先注意這一步是可選的,如果輸入的點雲已包含法向量,就不需要這一步。

這一步是固定 t = 0 t=0 t=0,來求法向量 n n n的近似(注意 n n n的長度被固定為1,所以這一步估計的是法向量 n n n的方向)。

t = 0 t=0 t=0代入方程式(2), t n tn tn這項消失,並且 θ \theta θ變為 p i p_i pi的函數,跟 n n n無關,在此記為 θ i \theta_i θi,是一個常數。方程式(2)至此化簡為 Σ i = 1 N < n , p i − r > 2 θ i \Sigma_{i=1}^N \left< n, p_i-r\right>^2 \theta_i Σi=1Nn,pir2θi

接下來是將它寫成向量與矩陣相乘的形式,更正式的名稱為bilinear form

為了推導出方程式(2)的bilinear form,我們先只關注 i i i這一項: < n , p i − r > 2 θ i \left< n, p_i-r\right>^2 \theta_i n,pir2θi

將它展開:

< n , p i − r > 2 θ i = ( n 1 ( p i 1 − r 1 ) + n 2 ( p i 2 − r 2 ) + n 3 ( p i 3 − r 3 ) ) 2 θ i = ( ( p i 1 − r 1 ) 2 n 1 2 + ( p i 1 − r 1 ) ( p i 2 − r 2 ) n 1 n 2 + ( p i 1 − r 1 ) ( p i 3 − r 3 ) n 1 n 3 + ( p i 2 − r 2 ) ( p i 1 − r 1 ) n 2 n 1 + ( p i 2 − r 2 ) 2 n 2 2 + ( p i 2 − r 2 ) ( p i 3 − r 3 ) n 2 n 3 + ( p i 3 − r 3 ) ( p i 1 − r 1 ) n 3 n 1 + ( p i 3 − r 3 ) ( p i 2 − r 2 ) n 3 n 2 + ( p i 3 − r 3 ) 2 n 3 2 ) θ i \begin{aligned} \left< n, p_i-r\right>^2 \theta_i &= (n_1(p_{i1}-r_1)+n_2(p_{i2}-r_2)+n_3(p_{i3}-r_3))^2\theta_i \\ &= ((p_{i1}-r_1)^2n_1^2 + (p_{i1}-r_1)(p_{i2}-r_2)n_1n_2+(p_{i1}-r_1)(p_{i3}-r_3)n_1n_3 \\ &+ (p_{i2}-r_2)(p_{i1}-r_1)n_2n_1+(p_{i2}-r_2)^2n_2^2+(p_{i2}-r_2)(p_{i3}-r_3)n_2n_3 \\ &+(p_{i3}-r_3)(p_{i1}-r_1)n_3n_1+(p_{i3}-r_3)(p_{i2}-r_2)n_3n_2+(p_{i3}-r_3)^2n_3^2)\theta_i \end{aligned} n,pir2θi=(n1(pi1r1)+n2(pi2r2)+n3(pi3r3))2θi=((pi1r1)2n12+(pi1r1)(pi2r2)n1n2+(pi1r1)(pi3r3)n1n3+(pi2r2)(pi1r1)n2n1+(pi2r2)2n22+(pi2r2)(pi3r3)n2n3+(pi3r3)(pi1r1)n3n1+(pi3r3)(pi2r2)n3n2+(pi3r3)2n32)θi

到了這裡已經能看出矩陣的雛形了,接下來是把向量跟係數矩陣找出來,寫成向量與矩陣相乘的形式。

我們要找的向量自然是 n n n,所以在找係數矩陣時,可以先暫時忽略 n n n。找出的係數矩陣為:

[ ( p i 1 − r 1 ) 2 ( p i 1 − r 1 ) ( p i 2 − r 2 ) ( p i 1 − r 1 ) ( p i 3 − r 3 ) ( p i 2 − r 2 ) ( p i 1 − r 1 ) ( p i 2 − r 2 ) 2 ( p i 2 − r 2 ) ( p i 3 − r 3 ) ( p i 3 − r 3 ) ( p i 1 − r 1 ) ( p i 3 − r 3 ) ( p i 2 − r 2 ) ( p i 3 − r 3 ) 2 ] θ i \begin{bmatrix} (p_{i1}-r_1)^2 & (p_{i1}-r_1)(p_{i2}-r_2) & (p_{i1}-r_1)(p_{i3}-r_3) \\ (p_{i2}-r_2)(p_{i1}-r_1) & (p_{i2}-r_2)^2 & (p_{i2}-r_2)(p_{i3}-r_3) \\ (p_{i3}-r_3)(p_{i1}-r_1) & (p_{i3}-r_3)(p_{i2}-r_2) & (p_{i3}-r_3)^2 \end{bmatrix}\theta_i (pi1r1)2(pi2r2)(pi1r1)(pi3r3)(pi1r1)(pi1r1)(pi2r2)(pi2r2)2(pi3r3)(pi2r2)(pi1r1)(pi3r3)(pi2r2)(pi3r3)(pi3r3)2 θi

得到 n n n跟係數矩陣後可以自行驗證一下, n T [ . . . ] n = < n , p i − r > 2 θ i n^T[...]n = \left< n, p_i-r\right>^2 \theta_i nT[...]n=n,pir2θi應該是成立的。

記得剛剛我們只看了 i i i這一項,但我們要的應該是 Σ i N \Sigma_i^N ΣiN,因此還要對上面的係數矩陣中的各項都加上 Σ i N \Sigma_i^N ΣiN。到了這裡,應該可以很容易地看出,我們計算得到的矩陣跟論文裡的 B B B矩陣是一致的: B = { b j k } , B ∈ R 3 × 3 , b j k = Σ i θ i ( p i j − r j ) ( p i k − r k ) B = \{b_{jk}\}, B \in \R^{3 \times 3}, b_{jk} = \Sigma_i \theta_i ({p_i}_j - r_j)({p_i}_k - r_k) B={bjk},BR3×3,bjk=Σiθi(pijrj)(pikrk)

我們可以來看一下矩陣 B B B是由哪些元素組成的,也就是: { p 1 , . . . p N } \{p_1,...p_N\} {p1,...pN}, r r r { θ 1 , . . . θ N } \{\theta_1,...\theta_N\} {θ1,...θN}。我們已經知道 θ i \theta_i θi是由 p i p_i pi r r r決定的常數,所以矩陣 B B B實際上由 { p 1 , . . . p N } \{p_1,...p_N\} {p1,...pN} r r r決定,而這些向量全是已知的,所以矩陣 B B B也是已知的。

向量 n n n及矩陣 B B B都找到了之後,就可以將方程式(2)寫成bilinear form: n T B n n^TBn nTBn,回想方程式(2)是一個cost function,所以我們希望找到一個 n n n使得該式算出來的值最小化,於是我們的目標變成了:

m i n ∥ n ∥ = 1 n T B n min_{\|n\|=1}n^TBn minn=1nTBn

此最小化問題的解為矩陣 B B B最小特徵值所對應的特徵向量。原因為何?

先來回顧一下矩陣特徵值及特徵向量的物理意義:如果一個向量經過矩陣的變換後方向不變,則稱該向量為特徵向量,其縮放程度則為該特徵向量對應的特徵值。我們知道矩陣 B B B對"其最小特徵值對應的特徵向量"所進行的放大程度最小,所以這裡我們選擇該特徵向量的方向作為第一步的解 n n n

回頭看一下矩陣 B B B,它其實是一個共變異數/協方差矩陣,這是為什麼呢?

我們可以把 r r r看作 p i p_i pi的期望值,即 E [ p i ] E[p_i] E[pi]。那麼 p i j {p_i}_j pij p i k {p_i}_k pik的共變異數 c o v [ p i j , p i k ] = E [ ( p i j − r j ) ( p i k − r k ) ] cov[{p_i}_j,{p_i}_k] = E[({p_i}_j-r_j)({p_i}_k-r_k)] cov[pij,pik]=E[(pijrj)(pikrk)],與矩陣 B B B的元素 b j k = Σ i θ i ( p i j − r j ) ( p i k − r k ) b_{jk} = \Sigma_i \theta_i ({p_i}_j - r_j)({p_i}_k - r_k) bjk=Σiθi(pijrj)(pikrk)兩相對照,發現兩者十分吻合,只要我們將 Σ i θ i \Sigma_i\theta_i Σiθi這個加權平均的動作看成是取期望值即可。既然知道 b j k = c o v [ p i j , p i k ] b_{jk} = cov[{p_i}_j,{p_i}_k] bjk=cov[pij,pik],那麼我們也就知道 B B B是由 p i p_i pi任兩分量的變異數所組成的3*3共變異數矩陣!

Iterative non-linear minimization

接下來是交替優化 t t t q q q,為什麼不是優化 t t t n n n呢?論文中說道,在 t t t固定的情況下,其實我們本來是應該是要優化 n n n,相當於在一個球面上尋找更好的 q q q。但是為了使用conjugate gradient method來進行優化,所以這裡用的是球面的近似,也就是只在平面 H H H上尋找 q q q

固定n求t固定t優化q這兩步會持續進行,直到所有的參數在某一輪的變化量都小於一個事先定義的閾值 ϵ \epsilon ϵ才結束。

固定n求t

[ − h / 2 , h / 2 ] [-h/2,h/2] [h/2,h/2]的範圍內找一個使損失函數最小化的 t t t,計算方法同第二步。

為了求解方便,在論文中限制 t t t的範圍為 [ − h / 2 , h / 2 ] [-h/2,h/2] [h/2,h/2],因為在此處 t t t只會有一個局部極小值。 → \rightarrow 為什麼?

因為我們知道 t t t只有一個局部極小值,所以這一步可以直接設方程式(2)對 t t t的偏微分等於0來求出。

欲求 Σ i = 1 N < n , p i − r − t n > 2 θ ( ∥ p i − r − t n ∥ ) \Sigma_{i=1}^N \left< n, p_i-r-tn\right>^2 \theta(\|p_i-r-tn\|) Σi=1Nn,pirtn2θ(pirtn) t t t的微分,同樣先只關注 i i i這一項,令 A = C 2 = < n , p i − r − t n > 2 A = C^2 = \left< n, p_i-r-tn\right>^2 A=C2=n,pirtn2,所以目前我們所關注的是 A θ A\theta Aθ,其中 A A A θ \theta θ都是 t t t的函數( n n n在這一步固定)。

i i i這一項的微分: d ( A θ ) d t = d A d t θ + A d θ d t \frac{d(A\theta)}{dt} = \frac{dA}{dt}\theta + A\frac{d\theta}{dt} dtd(Aθ)=dtdAθ+Adtdθ

  • 先看第一項: d A d t = d A d C d C d t \frac{dA}{dt} = \frac{dA}{dC}\frac{dC}{dt} dtdA=dCdAdtdC,其中 d A d C = 2 C \frac{dA}{dC} = 2C dCdA=2C

    要計算 d C d t \frac{dC}{dt} dtdC,我們可以先把 C C C拆開來看看,即:

    C = < n , p i − r − t n > = n 1 ( p i 1 − r 1 − t n 1 ) + n 2 ( p i 2 − r 2 − t n 2 ) + n 3 ( p i 3 − r 3 − t n 3 ) = − ( n 1 2 + n 2 2 + n 3 2 ) t + < n , p i − r > = − t + < n , p i − r > \begin{aligned} C &= \left< n, p_i-r-tn\right> \\ &= n_1({p_i}_1-r_1-tn_1)+n_2({p_i}_2-r_2-tn_2)+n_3({p_i}_3-r_3-tn_3) \\ &= -(n_1^2 + n_2^2 + n_3^2)t + \left< n, p_i-r\right> \\ &= -t + \left< n, p_i-r\right> \end{aligned} C=n,pirtn=n1(pi1r1tn1)+n2(pi2r2tn2)+n3(pi3r3tn3)=(n12+n22+n32)t+n,pir=t+n,pir

    所以 d C d t = − 1 \frac{dC}{dt} = -1 dtdC=1

    所以微分第一項 d A d t θ = d A d C d C d t θ = 2 C ∗ ( − 1 ) ∗ θ = − 2 C θ \frac{dA}{dt}\theta = \frac{dA}{dC}\frac{dC}{dt}\theta = 2C*(-1)*\theta = -2C\theta dtdAθ=dCdAdtdCθ=2C(1)θ=2算出來的跟方程式(6)差一個負號?

  • 再看第二項: A d θ d t A\frac{d\theta}{dt} Adtdθ

    其中 θ ( t ) = e ( − d 2 h 2 ) \theta(t) = e^{(-\frac{d^2}{h^2})} θ(t)=e(h2d2) d = ∥ p i − r − t n ∥ d = \|p_i-r-tn\| d=pirtn

    θ ( t ) \theta(t) θ(t) t t t的微分: d θ d t = d θ d ( d 2 ) d ( d 2 ) d ( d ) d ( d ) d t \frac{d\theta}{dt} = \frac{d\theta}{d(d^2)} \frac{d(d^2)}{d(d)} \frac{d(d)}{dt} dtdθ=d(d2)dθd(d)d(d2)dtd(d)

    其中 d θ d ( d 2 ) = θ ∗ ( − 1 h 2 ) \frac{d\theta}{d(d^2)} = \theta*(-\frac{1}{h^2}) d(d2)dθ=θ(h21) d ( d 2 ) d ( d ) = 2 d \frac{d(d^2)}{d(d)} = 2d d(d)d(d2)=2d

    d ( d ) d t \frac{d(d)}{dt} dtd(d)的計算較為複雜。我們先將d化簡:

    d = ∥ p i − r − t n ∥ = ( p i 1 − r 1 − t n 1 ) 2 + ( p i 2 − r 2 − t n 2 ) 2 + ( p i 3 − r 3 − t n 3 ) 2 = ( n 1 2 + n 2 2 + n 3 2 ) t 2 − 2 [ n 1 ( p i 1 − r 1 ) + n 2 ( p i 2 − r 2 ) + n 3 ( p i 3 − r 3 ) ] t + ( p i 1 − r 1 ) 2 + ( p i 2 − r 2 ) 2 + ( p i 3 − r 3 ) 2 = t 2 − 2 < n , p i − r > t + ( p i 1 − r 1 ) 2 + ( p i 2 − r 2 ) 2 + ( p i 3 − r 3 ) 2 d = \|p_i-r-tn\| \\= \sqrt{({p_i}_1-r_1-tn_1)^2+({p_i}_2-r_2-tn_2)^2+({p_i}_3-r_3-tn_3)^2} \\= \sqrt{(n_1^2 + n_2^2 + n_3^2)t^2 - 2[n_1({p_i}_1-r_1)+n_2({p_i}_2-r_2)+n_3({p_i}_3-r_3)]t + ({p_i}_1-r_1)^2+({p_i}_2-r_2)^2+({p_i}_3-r_3)^2} \\= \sqrt{t^2 - 2\left< n, p_i-r \right> t + ({p_i}_1-r_1)^2+({p_i}_2-r_2)^2+({p_i}_3-r_3)^2} d=pirtn=(pi1r1tn1)2+(pi2r2tn2)2+(pi3r3tn3)2 =(n12+n22+n32)t22[n1(pi1r1)+n2(pi2r2)+n3(pi3r3)]t+(pi1r1)2+(pi2r2)2+(pi3r3)2 =t22n,pirt+(pi1r1)2+(pi2r2)2+(pi3r3)2

    d ( d ) d t = 1 2 d ( 2 t − 2 < n , p i − r > ) = t − < n , p i − r > d = − C d \frac{d(d)}{dt} = \frac{1}{2d} (2t-2\left< n, p_i-r \right>) = \frac{t-\left< n, p_i-r \right>}{d} = \frac{-C}{d} dtd(d)=2d1(2t2n,pir)=dtn,pir=dC

    所以微分第二項 A ∗ d θ d t = A ∗ θ ∗ ( − 1 h 2 ) ∗ 2 d ∗ ( − C d ) = 2 A θ C h 2 A*\frac{d\theta}{dt} = A*\theta*(-\frac{1}{h^2})*2d*(\frac{-C}{d}) = 2A\theta \frac{C}{h^2} Adtdθ=Aθ(h21)2d(dC)=2Aθh2C

算出cost function對 t t t的一階導數為 − 2 C θ + 2 A θ C h 2 = 2 C ( − 1 + A h 2 ) θ -2C\theta+2A\theta \frac{C}{h^2} = 2C(-1+\frac{A}{h^2})\theta 2+2Aθh2C=2C(1+h2A)θ,對所有 i i i的偏導數做總和,得到論文中的公式(6):

2 Σ i = 1 N < n , p i − r − t n > ( 1 + < n , p i − r − t n > 2 h 2 ) e ∥ p i − r − t n ∥ 2 h 2 2\Sigma_{i=1}^N\left<n, p_i-r-tn\right>(1+\frac{\left<n, p_i-r-tn \right>^2}{h^2})e^{\frac{\|p_i-r-tn\|^2}{h^2}} 2Σi=1Nn,pirtn(1+h2n,pirtn2)eh2pirtn2

(兩者差了一個負號?)

之後,可以使用Numerical
Recipes in C: The Art of Scientific Computing (2nd ed.) - 10.3 One-Dimensional Search with FirstDerivatives
裡提到的迭代的最小化方法來求解。

固定t優化q

使用conjugate gradient method在平面 H H H上找一個更好的 q q q ← \leftarrow 這樣子 q = r + t n q = r + tn q=r+tn還會成立?

計算曲面Sp

回顧一下計算曲面的cost function: Σ i = 1 N ( g ( x i , y i ) − f i ) 2 θ ( ∥ p i − q ∥ ) \Sigma_{i=1}^N(g(x_i,y_i)-f_i)^2\theta(\|p_i-q\|) Σi=1N(g(xi,yi)fi)2θ(piq)

H H H找到後, n n n t t t都固定下來,所以cost function裡的 θ i \theta_i θi f i f_i fi也都變為常數。計算cost function對曲面多項式中各係數的一階導數,可以得到一個線性方程組,其方程式數量正好等於多項式係數的個數。這個問題可以使用linear least squares的方法來求解。

生成具代表性的點雲

下採樣

下採樣的核心思想是計算各點的貢獻度,然後逐一移除貢獻度最低的點,直到停止條件被滿足為止。

貢獻度的計算:

  • 理想:用 P P P擬合一個曲面 S S S,再用將 p i p_i pi移除後的點集 { P − p i } \{P-p_i\} {Ppi}擬合一個曲面 S { P − p i } S_{\{P-p_i\}} S{Ppi},然後計算兩曲面的Hausdorff distance。但是這種做法的計算量太大,因此論文裡採用以下做法。

  • 現實:將 p i p_i pi投影到 S { P − p i } S_{\{P-p_i\}} S{Ppi}。(然後呢?論文沒說後續怎麼做)猜想是把加上 p i p_i pi投影點的 S { P − p i } S_{\{P-p_i\}} S{Ppi}當作 S S S,然後計算它們的Hausdorff distance。

得到每個點的貢獻度之後,將點存到一個priority queue裡面。在迭代過程中,每次會移除貢獻度最低的點。當一個點被移除後,我們需要重新計算該點附近的點的貢獻度。

以上過程會一直重複,直到點的數量小於某一閾值或者是各點的貢獻度都大於某一閾值後才停止。

上採樣

上採樣的核心思想是在MLS曲面上畫vonoroi diagram。畫法如下:取平面上任意三個點畫圓,圓要穿過這三個點(但實際上可能穿過更多的點),並要注意不能讓圓內包含其它的點。這些圓的圓心即為vonoroi diagram的頂點。得到vonoroi diagram之後,我們會挑選擁有最大半徑的圓的圓心,將它投影到MLS曲面上,得到的結果就是一個上採樣的點。

vonoroi diagram的畫法:

  • 理想:在MLS曲面上畫vonoroi diagram。
  • 現實:隨機從點雲裡挑選一個點,在點的鄰域內擬合一個"平面",將鄰域內的點都投影到該平面上。然後在該平面上畫vonoroi diagram。

上採樣的過程會一直重複,直到最小圓的半徑小於一個事先定義好的值才停止。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值