在VTK中连通区域分析常用到的类是:vtkPolyDataConnectivityFilter。从名字可以看出来其输入类型为vtkPolyData;了解VTK的人都知道这是图形的基本数据结构保存了图形的几何结构和拓扑结构。如果你要进行连通分析的对象是图形那自然就没问题。但如果需要对图像进行连通区域分析,那该类就不能直接用了,要先进行一步数据类型转换。根据参考文1,我们可以以一种非严谨方式将VTK数据处理算子(Filter)分为一下几类:
1、图像处理 其输入为vtkImageData(图像基本数据类型),输出也为vtkImageData
2、几何提取 其输入为vtkImageData,输出为vtkPolyData
3、图形处理 其输入为vtkPolyData,输出也为vtkPolyData,例如前面的vtkPolyDataConnectivityFilter
4、渲染 如Mapper和Actor 来完成图形图像的显示
vtkpolydataconnectivityfilter是一个筛选器,它提取共享公共点和/或满足标量阈值条件的单元格。
(这样的单元格组称为连通域。)
此筛选器专门用于多边形数据。这意味着它运行得更快,更容易构建处理多边形数据的可视化网络。
可以通过启用布尔ivar scalarconnectivity来修改vtkpolydataconnectivityfilter的行为。如果此标志处于启用状态,则修改连接算法,以便仅当1)单元格是几何连接的(共享一个点)和2)单元格的点的标量值落在指定的标量范围内时,才认为单元格是连接的。如果启用scalarconnectivity和fullscalarconnectivity,则单元格的所有点都必须位于为该单元格指定的标量范围内,才能符合连接条件。如果fullscalarconnectivity处于禁用状态,则单元格的任何一个点都可能位于用户指定的标量范围内,以便单元格符合连接条件。
scalarconnectivity的这种用法对于选择单元格以供以后处理特别有用。
完成数据类型转换我们就可以使用vtkPolyDataConnectivityFilter来提取连通区域。该类在提取连通区域时候有如下6中模式:
1)提取数据集中的最大(最多点)连接区域:SetExtractionModeToLargestRegion();
2)提取指定区域号:SetExtractionModeToSpecifiedRegions();
3)提取共享指定点ids的所有区域:SetExtractionModeToPointSeededRegions();
4)提取共享指定单元ID的所有区域:SetExtractionModeToCellSeededRegions();
5)提取最靠近指定点的区域:SetExtractionModeToClosestPointRegion();
6)提取所有区域(用于着色区域):SetExtractionModeToAllRegions()
可以用来 显示或删除部分数据;
vtkNew<vtkPolyDataConnectivityFilter> connectivityFilter;
connectivityFilter->SetInputData(mStlPolyData);
connectivityFilter->SetExtractionModeToSpecifiedRegions();
//connectivityFilter->SetExtractionModeToLargestRegion();
connectivityFilter->AddSpecifiedRegion(0); // select the region to extract
// here
connectivityFilter->Update();
int count = connectivityFilter->GetNumberOfExtractedRegions();