首先,我們從一個不受光照限制的環境中拍攝一組輸入圖像,這些圖像包含了頭發的不同視角和姿態。我們對這些圖像進行半自動的分割,將頭發從背景中分離出來,然后使用PMVS ,一種先進的多視角立體算法,來重建一個點云。我們通常使用30到50張輸入圖像來進行重建。
然后,我們對重建的點云和PMVS估計的法向量進行濾波,因為它們可能會有噪聲。我們使用移動最小二乘法(MLS)來平滑它們:對于每個點,我們用最優的平面來擬合它附近的加權鄰居點。平面的法向量和點在平面上的投影就用來更新點的原始法向量和位置。我們使用2毫米的標準差來得到合理的濾波結果。
接下來,我們對濾波后的點云進行方向場的計算,這個方向場表示了每個點的3D方向。我們使用了一種基于圖像的方法,它利用了輸入圖像中的方向信息。我們首先對每張輸入圖像進行方向濾波,得到每個像素的2D方向。然后,我們對每個點云中的點,找到它在輸入圖像中的對應像素,以及它的鄰居點在輸入圖像中的對應像素。我們用這些像素的方向來計算點云中的點的3D方向,這個方向是無指向性的,只表示方向但不區分左右。我們使用了一種基于PCA的方法,它可以從多個2D方向中推斷出一個3D方向。
?詳細:從輸入圖像中提取出每個像素的方向信息,這個信息可以幫助網絡重建出毛發的形狀和流動性。
?在點云上生長毛發段的過程是這樣的:對于每個點云中的點,我們根據它的方向,找到它的下一個鄰居點,然后將它們連接成一條線段,這條線段就是一個毛發段的一部分。我們重復這個過程,直到遇到以下情況之一:1) 沒有找到合適的鄰居點;2) 鄰居點的方向與當前點的方向差異過大;3) 鄰居點已經被其他毛發段占用。這樣,我們就可以在點云上生長出一組局部的毛發段,它們可以近似地用一條曲線來表示。
用帶狀物覆蓋毛發段的過程是這樣的:對于每個毛發段,我們用一個固定的寬度和厚度的帶狀物來覆蓋它,這個帶狀物的方向和長度都是由毛發段的數據決定的。然后,我們對每個帶狀物進行聚類,根據它們的位置和方向的相似性,將它們分成若干個組,每個組包含一些相鄰的帶狀物,它們可以近似地用一條曲線來表示。這樣,我們就可以用帶狀物覆蓋點云,揭示出局部一致的毛發束結構,這些結構可以反映出頭發的紋理和流動性,而且也可以與導向毛發關聯,用于動畫。
- 發現帶狀物之間的缺失連接的過程是這樣的:由于遮擋和缺失數據,帶狀物之間可能存在一些空隙,這些空隙會影響毛發束的完整性和連續性。為了解決這個問題,我們嘗試用圓弧來擬合帶狀物覆蓋的毛發段,看看是否可以在空隙處建立連接。我們對每個帶狀物,找到它的一個端點,然后在它的鄰域內,尋找另一個帶狀物的一個端點,看看它們是否可以用一個圓弧來連接。我們使用了一種基于最小二乘法的方法,來計算圓弧的參數,包括圓心、半徑和角度。我們還定義了一個擬合誤差的度量,它取決于圓弧和毛發段的距離和方向的差異。如果擬合誤差小于一個閾值,我們就認為這兩個帶狀物之間有一個合理的連接,我們將這個連接編碼在一個連接圖中,用于后續的分析和優化。
- 對帶狀物進行方向分析的過程是這樣的:由于方向場的180度歧義,帶狀物的方向可能是不確定的,這會導致毛發束的方向不一致或者不合理。為了解決這個問題,我們對帶狀物進行一個全局的方向分析,使用一個馬爾可夫隨機場(MRF)公式,來優化每個帶狀物的方向。我們的目標是使得帶狀物的方向盡可能地與連接圖中的連接和帶狀物方向的局部提示相兼容。連接圖中的連接表示了帶狀物之間的拓撲關系,它們應該滿足一些幾何約束,例如,相鄰的帶狀物的方向應該是平滑的,而不是突然轉彎的。帶狀物方向的局部提示表示了帶狀物的形狀特征,它們可以從點云中的數據中提取出來,例如,帶狀物的曲率、長度和方向變化等。我們使用了一種基于圖割的方法,來求解這個MRF公式,得到每個帶狀物的最優方向。這樣,我們就可以保證毛發束的方向是一致和合理的。
- 將帶狀物連接成毛發束的過程是這樣的:在進行了連接和方向分析之后,我們就可以將帶狀物連接成完整的毛發束了。我們的目標是使得每個毛發束都能從頭皮開始,到頭發的末端結束,而且不會有斷裂或重疊的現象。我們使用了一種基于深度優先搜索的方法,來遍歷連接圖中的所有節點,即帶狀物的端點,然后根據它們的連接和方向,將它們連接成一條連續的曲線,這條曲線就是一個毛發束。我們重復這個過程,直到遍歷完所有的節點,或者達到預設的毛發束的數量。這樣,我們就可以從帶狀物中生成一組完整的毛發束,它們可以反映出頭發的結構和風格,而且也可以作為導向毛發,用于動畫和模擬。?