图像处理与VTK/ITK文章列表

等值面(线)

抽取轮廓的操作对象是标量数据。其思想是:将数据集中标量值等于某一指定恒量值的部分提取出来。对于3D的数据集而言,产生的是一个等值面;对于2D的数据集而言,产生的是一个等值线。其典型的应用有气象图中的等温线、地形图中的等高线。对于医学数据而言,不同的标量值代表的是人体的不同部分,因而可以分别提取出人的皮肤或骨头。

等值线

提取等值线需要vtkContourFilter过滤器,输入数据源,设置等值线,更新即可得到等值线数据。

// 1 提取轮廓 corresponding to the black limit of the image

vtkSmartPointer<vtkContourFilter> contourFilter = vtkSmartPointer<vtkContourFilter>::New();

contourFilter->SetInputConnection(sphereWindowToImageFilter->GetOutputPort());

contourFilter->GenerateValues(5, 0, 400);// 5个等值线0 100 200 300 400

contourFilter->Update();

// 得到等值线数据

vtkSmartPointer<vtkPolyData> contourPolyData = contourFilter->GetOutput();

vtkContourFilter

抽取轮廓的功能是由一个过滤器实现的,如vtkContourFilter 。vtkContourFilter 可以接受任意数据集类型作为输入,因而具有 一般性。使用vtkContourFilter 时,除了需要设置输入数据集外,还需要指定一个或多个用于抽取的标量值。

可用如下两种方法进行设置:

SetValue()

  • 逐个设置抽取值。该方法有个两个参数:第一个参数是抽取值的索引号,表示第几个 抽取值。索引号从0开始计数;第二个参数就是指定的抽取值。
  •  SetValue(i,value) i表示第几条等值线,从0开始计算,value表示等值线的值。
  • 多边形的每个点都有一个属性值,两个相邻的属性值之间要先通过插值,再把这些属性值作为该函数的输入。
  • 如SetValue(0,5) 画一条等值为5的等值线两个相邻的点的属性值为3和6,则先插值为(3,4,5,6),所以该先应该经过这条边的2/3处。

GenerateValues()

  • 自动产生一系列抽取值。该方法有三个参数:第一个参数是抽取值的个数,后面两个参数是抽取值的取值范围。
  • 例如:vtkSmartPointer<vtkContourFilter> contours =

vtkSmartPointer<vtkContourFilter>::New();

contours->GenerateValues(5.0, 0.0, 1.2);

最终产生的抽取值为0.0, 0.3, 0.6, 0.9和1.0,这是一个等差数列。

SetValueGenerateValues的区别与联系

  • 这两个函数的不同之处在于SetValue设置一条等值线值,而GenerateValues对应n条等值线的值,同时数量n包括两个边界值,其余n-2条等值线的值自动按照线性关系产生。
  • SetValue和GenerateValues函数根据先后调用关系产生覆盖,即后调用的函数产生的等值线可能覆盖掉先调用函数产生的等值线,这与等值线的条数(GetNumberOfContours)相关。
  • 例如:首先调用GenerateValues(3, 100, 300)产生3条等值线,分别为100、200、300;然后调用SetValue(0, 125),则最终效果为共有3条等值线,分别为125、200、300;如果改为调用SetValue(3, 400),则最终效果为共有4条等值线,分别为100、200、300、400。
  • SetValue一般用于覆盖某一条已经存在的等值线,或者增加一条等值线;GenerateValues一般重新设置等值线的条数。

等值线示例

m_contourFilter->SetValue(0, 1);// 设置值为1的等值线

m_contourFilter->SetValue(1, 2);// 设置值为2的等值线

m_contourFilter->SetValue(2, 3);// 设置值为3的等值线

m_contourFilter->SetValue(3, 4);// 设置值为4的等值线

m_contourFilter->SetValue(4, 5);// 设置值为5的等值线

m_contourFilter->SetValue(5, 6);// 设置值为6的等值线

m_contourFilter->SetValue(6, 7);// 设置值为7的等值线

m_contourFilter->Update(); // 计算出轮廓数据

不同值之间如果差距过大,中间总是会被插入对应的等值线:

vtkContourFilter等值面(线)

 

如下图所示,0和5之间插入了4条等值线。这个时候等值线已经无法体现轮廓的效果。

vtkContourFilter等值面(线)

相关文章:

  • 2021-07-15
  • 2021-05-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-02
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-12-10
  • 2021-09-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-06
相关资源
相似解决方案