点群からボリューム補間によって面を作成する(ParaView) †ParaViewを使用して、点群データからボリューム(画像データ)上に点の位置を補間してから、マーチングキューブス法で面を作成する方法を説明します。 点群の読み込み †ここで使用するサンプルデータは、horse.particlesです。 この点群データは、比較的密でノイズもないきれいな馬のデータで、horse.particlesをテキストエディターなどで開くと、(x,y,z)の座標とスカラー値(全て1.0)が1行ずつ並んでいることを確認できます。なお、「*.particles」はVTK particle filesという点群用のデータ形式です。 まず、馬の点群データを読み込みます。ParaViewを起動し、ツールバーから File > Open... と進み、ファイルの指定ダイアログから、"horse.particles"を指定して読み込みますと、下のような馬の点群が表示されます。 点群のボリューム補間 †次に、馬の表面を取り出す前準備として、点群をボリュームデータ(画像データ)上に補間します。これには、"Point Volume Interpolator"を使用します。 File >> Filters >> Alphabetical >> Point Volume Interpolator この例の設定では、"Properties"タブにおいて、 Kernel: GaussinKernel Kernel Footprint: Radius Radius: 0.007 と設定し、"Apply"します。Radiusはデータ毎に調整する必要がありますが、を大きくすると、影響範囲が大きくなり、計算が終わらなくなるので注意ください。 これで、点群からボリュームへの補間が完了しました。 等値面 †次に、マーチングキューブス法によって、等値面を作成します。 通常は、等値面の作成には"Contour"を使用しますが、ここでは、クリップを使用します。ツールバーの"Clip"アイコンをクリックし、 Clip Type: Scalar Scalars: Scalar Value: 0.99 Invert: チェックを外す と設定してから、"Apply"します。以下のように馬が出てこない場合は、Invertにチェックを入れ、抽出する領域を反転させます。 スムージング †馬の等値面が抽出されましたが、表面がデコボコしていますので、スムージングを掛けます。 まず、スムージングを掛けるためには、データ形式をpoly dataに変換する必要があるので、 Filters >> Alphabetical >> Extract Syrface から"Apply"をします。 続けて、 Filters >> Alphabetical >> Smooth として、200回くらいスムージングします。 これで、滑らかな馬の面が抽出できました。 注意 †実は、上で抽出した面は、2重になっています。それは、抽出した面の不透明度"Opacity"を下げると、確認できます。 この2重面を1面にするのは、難しいです。以下のような方法が考えられますが、汎用性はないかもしれません。 まず、 Filters >> Alphabetical >> Generate Surface Normals で、鋭角な面で分断します。 次に、Connectivityフィルターにより、ひとつながりの面を抽出します。 Filters >> Alphabetical >> Connectivity 最期に、Thresholdフィルターでつながった面の中から、馬の内側の面を抽出します。 Filters >> Alphabetical >> threshold から、 Scalars: RegionId Minimum: 1 Maximum: 1 と設定し、"Apply"します。(この例では、内側の面のRegionIdは1でしたが、いつもそうではありません)。 これで、一枚の表面を抽出できました。 ダウンロード †馬の点群データ |