*点群からボリューム補間によって面を作成する(ParaView) [#b3d5e174]

[[ParaView:http://www.paraview.org/]]を使用して、点群データからボリューム(画像データ)上に点の位置を補間してから、マーチングキューブス法で面を作成する方法を説明します。

**点群の読み込み [#d5a38f7a]

ここで使用するサンプルデータは、horse.particles(このページの一番下からダウンロード)です。

この点群データは、比較的密でノイズもないきれいな馬のデータで、horse.particlesをテキストエディターなどで開くと、(x,y,z)の座標とスカラー値(全て1.0)が1行ずつ並んでいることを確認できます。なお、「*.particles」はVTK particle filesという点群用のデータ形式です。

まず、馬の点群データを読み込みます。ParaViewを起動し、ツールバーから

  File > Open...

と進み、ファイルの指定ダイアログから、"horse.particles"を指定して読み込みますと、下のような馬の点群が表示されます。

#ref(load_points.png,center,nowrap,30%,馬の点群);

**点群のボリューム補間 [#s49f4245]

次に、馬の表面を取り出す前準備として、点群をボリュームデータ(画像データ)上に補間します。これには、"Point Volume Interpolator"を使用します。

  File >> Filters >> Alphabetical >> Point Volume Interpolator

この例の設定では、"Properties"タブにおいて、

  Kernel: GaussinKernel
  Kernel Footprint: Radius
  Radius: 0.007

と設定し、"Apply"します。Radiusはデータ毎に調整する必要がありますが、を大きくすると、影響範囲が大きくなり、計算が終わらなくなるので注意ください。

#ref(gaussian_kernel.png,center,nowrap,30%,ガウシアンカーネルの設定);

これで、点群からボリュームへの補間が完了しました。

**等値面 [#t97f64ea]

次に、マーチングキューブス法によって、等値面を作成します。

通常は、等値面の作成には"Contour"を使用しますが、ここでは、クリップを使用します。ツールバーの"Clip"アイコンをクリックし、

  Clip Type: Scalar
  Scalars: Scalar
  Value: 0.99
  Invert: チェックを外す

と設定してから、"Apply"します。以下のように馬が出てこない場合は、Invertにチェックを入れ、抽出する領域を反転させます。

#ref(isosurface.png,center,nowrap,30%,コンター図の設定);

**スムージング [#r53f6212]

馬の等値面が抽出されましたが、表面がデコボコしていますので、スムージングを掛けます。

まず、スムージングを掛けるためには、データ形式をpoly dataに変換する必要があるので、

  Filters >> Alphabetical >> Extract Syrface

から"Apply"をします。

#ref(extract_surface.png,center,nowrap,30%,ポリゴンデータ形式に変換);

続けて、

  Filters >> Alphabetical >> Smooth

として、200回くらいスムージングします。

#ref(smoothing.png,center,nowrap,30%,スムージング);

これで、滑らかな馬の面が抽出できました。

**注意 [#gfa31bef]

実は、上で抽出した面は、2重になっています。それは、抽出した面の不透明度"Opacity"を下げると、確認できます。

#ref(duplicate_surface.png,center,nowrap,30%,面が2重);

この2重面を1面にするのは、難しいです。以下のような方法が考えられますが、汎用性はないかもしれません。

まず、

  Filters >> Alphabetical >> Generate Surface Normals

で、鋭角な面で分断します。

#ref(splitting_surface.png,center,nowrap,30%,面の分断);

次に、Connectivityフィルターにより、ひとつながりの面を抽出します。

  Filters >> Alphabetical >> Connectivity

#ref(connectivity.png,center,nowrap,30%,connectivity);

最期に、Thresholdフィルターでつながった面の中から、馬の内側の面を抽出します。

  Filters >> Alphabetical >> threshold

から、

  Scalars: RegionId
  Minimum: 1
  Maximum: 1

と設定し、"Apply"します。(この例では、内側の面のRegionIdは1でしたが、いつもそうではありません)。

#ref(threshold.png,center,nowrap,30%,threshold);

これで、一枚の表面を抽出できました。

#ref(non_duplicate.png,center,nowrap,30%,1枚面);


**ダウンロード [#k551ac14]
馬の点群データ
#ref(horse.zip)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS