注釈
Go to the end をクリックすると完全なサンプルコードをダウンロードできます.
連結度#
この例では, connectivity()
フィルタの応用例を紹介します.
ノイズの多い等値面を取り除く#
ノイズの多い等値面を削除するには,連結度を使用します.
このセクションは この VTK の例 に似ています.
import numpy as np
import pyvista as pv
from pyvista import examples
ノイズの多い等値面を持つデータセットをロードします
プロットされたメッシュは非常にノイズが多いです. connectivity()
フィルタの 'largest'
extraction_mode
を使用することで,最大連結等曲面を抽出することができます.同様に, extract_largest()
フィルタを使用することもできます.
# Grab the largest connected volume present
largest = pine_roots.connectivity('largest')
# or: largest = mesh.extract_largest()
p = pv.Plotter()
p.add_mesh(largest, color='#965434')
p.add_mesh(pine_roots.outline())
p.camera_position = cpos
p.show()
小領域の抽出#
上記のノイズの多い等値面を除去する例で除去された,より小さい 'noisy' な領域を抽出するために接続性を使用します.
まず,すべての領域IDのリストを取得します.
all_regions = pine_roots.connectivity('all')
region_ids = np.unique(all_regions['RegionId'])
領域IDは降順 (セル数順) にソートされているので, connectivity()
フィルタの 'specified'`
extraction_mode
を使用して,最大の領域を除くすべての領域を抽出することができます.
noise_region_ids = region_ids[1::] # All region ids except '0'
noise = pine_roots.connectivity('specified', noise_region_ids)
ノイズの多い領域をプロットします.文脈のために、最大の領域もプロットします.
p = pv.Plotter()
p.add_mesh(noise, cmap='glasbey', categories=True)
p.add_mesh(largest, color='lightgray', opacity=0.1)
p.add_mesh(pine_roots.outline())
p.camera_position = cpos
p.show()
切断された領域にラベルをする#
接続性を使用して,すべての切断された領域にラベルを付けます.
このセクションは `このVTKの例<https://examples.vtk.org/site/Cxx/PolyData/ColorDisconnectedRegionsDemo/>`__ に似ています.
まず,切断された領域を含むデータセットをロードします.
mesh = examples.download_foot_bones()
すべての領域を抽出します.
conn = mesh.connectivity('all')
ラベルを付けた領域をプロットします.
# Format scalar bar text for integer values.
scalar_bar_args = dict(
fmt='%.f',
)
cpos = [(10.5, 12.2, 18.3), (0.0, 0.0, 0.0), (0.0, 1.0, 0.0)]
conn.plot(
categories=True,
cmap='glasbey',
scalar_bar_args=scalar_bar_args,
cpos=cpos,
)
シードポイントから領域を抽出する#
スカラーデータとシードポイントを用いて,連結性を利用して関心のある領域を抽出します.
まず,顕著な特徴を持つデータセットを作成します.ここでは丘を作り,曲率を使って山と谷を定義します.
mesh = pv.ParametricRandomHills()
mesh["Curvature"] = mesh.curvature()
山と谷を視覚化します.山は正の曲率が大きい (つまり凸状) 谷は負の曲率が大きい (つまり凹状) 平坦な領域は曲率がゼロに近いです.
mesh.plot(
clim=[-0.5, 0.5],
cmap='bwr',
below_color='blue',
above_color='red',
)
connectivity()
フィルターの 'point_seed'
extraction_mode
を使用して関心のある領域を抽出します. 曲率が最大になるシードポイントを使用して,最も急峻なピークを抽出してみましょう.
# Get seed point
peak_point_id = np.argmax(mesh['Curvature'])
# Define a scalar range of the region to extract
data_min, data_max = mesh.get_data_range()
peak_range = [0.2, data_max] # Peak if curvature > 0.2
peak_mesh = mesh.connectivity('point_seed', peak_point_id, scalar_range=peak_range)
connectivity()
フィルターの 'closeest'
extraction_mode
を使用して,最も急峻なピークに最も近い谷も抽出してみましょう.
valley_range = [data_min, -0.2] # Valley if curvature < -0.2
peak_point = mesh.points[peak_point_id]
valley_mesh = mesh.connectivity('closest', peak_point, scalar_range=valley_range)
抽出された領域をプロットします.
p = pv.Plotter()
_ = p.add_mesh(mesh, style='wireframe', color='lightgray')
_ = p.add_mesh(peak_mesh, color='red', label='Steepest Peak')
_ = p.add_mesh(valley_mesh, color='blue', label='Closest Valley')
_ = p.add_legend()
p.show()
Total running time of the script: (0 minutes 9.658 seconds)