1.等值面提取

等值面(线)提取是一种常用的可视化技术,常应用于医学、地质、气象等领域。例如,在医学图像处理中,由于CT、MRI等图像分辨率越来越高,虽然体绘制技术可以清晰地对数据内部结构进行可视化但是其计算量和效率却制约了其使用。此时可通过等值面提取技术,仅提取感兴趣的一个或者几个组织轮廓,并生成网格模型以供后续的处理和研究。
根据数据类型的不同,VTK中提供了多个等值面提取类,其类图如图所示:
VTK中的等值面提取算法多基于MarchingCube算法来实现。MarchingCube是经典的移动立方体等值面提取算法。该算法是由W.E.Lorenson和H.E.Cline在1987年提出的。由于这一方法原理简单,易于实现,目前已经得到了较为广泛的应用,称为三维数据等值面生成的经典算法。等值面提取类根据数据类型的不同而有所侧重。
  • vtkImageMarchingCubes:主要处理三维图像数据
  • vtkMarchingCubes:主要针对规则体数据生成等值面
  • vtkMarchingSquares:则是针对二维规则网格数据生成等值线
  • vtkMarchingContourFilter:可以接受任何类型的数据,其内部根据数据不同生成不同的算法对象实现等值面/线的提取,具有较高的效率
  • vtkContourFilter:则是一个更加通用的等值面提取类,其可以接受任意的数据类型生成等值线或等值面。
vtkDiscreteMarchingCubes继承自vtkMarchingCubes,主要针对Label图像,比如利用图像分割算法对医学图像进行分割后得到含有不同Label值得数据,每个Label对应一个组织,吐过想要得到其中一个或者几个组织的洛括模型,则可以考虑使用该类。

2.vtkMarchingCubes用于等值线提取实验

上面的几个类的使用方法基本一致,下面仅以vtkMarchingCubes为例来演示提取图像数据等值面的效果:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkImageData.h>
#include <vtkMarchingCubes.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkVoxelModeller.h>
int main()
{vtkSmartPointer<vtkMetaImageReader> reader =vtkSmartPointer<vtkMetaImageReader>::New();reader->SetFileName("HeadMRVolume.mhd");reader->Update();vtkSmartPointer<vtkMarchingCubes> surface =vtkSmartPointer<vtkMarchingCubes>::New();surface->SetInputData(reader->GetOutput());surface->ComputeNormalsOn();surface->SetValue(0, 100);  //第0个等值面  值为:200surface->Update();//surface->GenerateValues(0, 150, 200);///vtkSmartPointer<vtkPolyDataMapper> surfMapper =vtkSmartPointer<vtkPolyDataMapper>::New();surfMapper->SetInputConnection(surface->GetOutputPort());vtkSmartPointer<vtkActor> surfActor =vtkSmartPointer<vtkActor>::New();surfActor->SetMapper(surfMapper);surfActor->GetProperty()->SetColor(1, 0, 0);vtkSmartPointer<vtkRenderer> surfRender =vtkSmartPointer<vtkRenderer>::New();surfRender->AddActor(surfActor);surfRender->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(surfRender);rw->SetSize(640, 480);rw->SetWindowName("PolyData MarchingCubes");rw->Render();vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0;
}

首先通过一个reader对象来读取一幅图像,并将输入到vtkMarchingCubes中,提取等值面时,最重要的是要设置等值面的数值,SetValue()函数用于设置等值面的值,其第一个参数表示等值面的序号,因此可以通过这个函数设置多个等值面值来提取多个等值面。另外我们也可以通过GenerateValues提取多个等值面。

void GenerateValues(int numContours,double range[2]);
void GenerateValues(int numContours, double rangStart, double rangeEnd);

其中,numContour为生成等值面的个数,range表示获取等势面数值的范围。

其实,这里面还有一个求取法向量的过程,我们可能会感到比较奇怪??!
通过前面分析的内容,我们知道,法向量可以提高渲染质量。

3. cannot convert parameter 1 from 'vtkImageData *' to 'vtkDataObject *'

在vtkuser里看到有人提问了。
解决方法很简单:
增加头文件:
#include "vtkImageData.h"即可

4.一直以来未解决的问题

貌似一直以来除了我,没有人遇到过啊???其实在32bit平台上也没有遇到过。。。继续吧。。。

5.参看资料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道55:图形基本操作进阶_表面重建技术(等值面提取)相关推荐

  1. VTK修炼之道54:图形基本操作进阶_表面重建技术(三角剖分)

    1.表面重建 通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构.拓扑结构对于实际图形处理以及可视化具有更重要的意义.因此,这就需要利用表面重建技术奖点云数 ...

  2. VTK_Learning_图形基本操作进阶_表面重建技术(三角剖分)

    1.表面重建 通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构.拓扑结构对于实际图形处理以及可视化具有更重要的意义.因此,这就需要利用表面重建技术奖点云数 ...

  3. VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)

    1.点云重建 虽然Delaunay三角剖分算法可以实现网格曲面重建,但是其应用主要在二维剖分,在三维空间网格生成中遇到了问题.因为在三维点云曲面重建中,Delaunay条件不在满足,不仅基于最大最小角 ...

  4. VTK修炼之道46:图形基本操作进阶_三角网格体积、表面积、测地距离、包围盒

    1.基本图形操作意义 图形处理,比如图形平滑.多分辨率分析.特征提取等都离不开一些基本的图形操作.掌握这些基本的图形操作有助于理解和深入学习图形处理和分析方法. VTK中提供了多种图形的基本操作,其中 ...

  5. VTK修炼之道49:图形基本操作进阶_网格平滑(点云的曲面重建技术)

    1.网格平滑 现代扫描技术的发展使得获取点云数据不再困难,通过曲线重建技术可以获取表面网格来表示各种复杂的实体.但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理. 拉普拉斯平滑是一 ...

  6. VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)

    1.点云配准 在计算机逆向工程中,通过三维扫描等实物数字化技术可以获取各种点云数据.但是受到测量环境和设备的影响,再一次测量的情况下,难以获取实物整体的点云数据,因此需要多次从不同角度进行测量.但不同 ...

  7. VTK修炼之道59:图形基本操作进阶_纹理映射

    1.纹理映射 纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程.纹理生成过程实质上是将所定义的纹理映射为某种三维物体表面的属性,并参与后续的光照计算.在三维图形中,纹理映射运用的十分广泛, ...

  8. VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)

    1.Iterative Closest Points算法 点云数据配准最经典的方法是迭代最近点算法(Iterative Closest Points,ICP).ICP算法是一个迭代的过程,每次迭代中对 ...

  9. VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)

    1.模型细化 vtk中实现网格细化的累有vtkLinearSubdivisionFilter.vtkLoopsubdivisionFilter.vtkButterflySubdivisionFilte ...

最新文章

  1. Linux查看所有用户和组信息
  2. 深入理解java虚拟机---读书笔记
  3. 读后感《我回阿里的29个月》
  4. 出让执行权:Task.Yield, Dispatcher.Yield
  5. c# 口口乱码_c# 乱码解决方法
  6. IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)
  7. NLP 事件抽取综述(中)—— 模型篇
  8. mega软件 linux,Debianubuntu系安装MegaCli
  9. C++语言,线性素数筛(欧拉筛)
  10. 4、day04利用XInput,在C/C++创建的窗口中读取键盘输入
  11. leetcode:BFS/DFS--腐烂的橘子
  12. Android实现自定义铃音
  13. Botnet趋势漏洞利用状况分析
  14. 尤雨溪告诉你为什么Vue比yox优秀
  15. 网络黑客攻击呈现三大特点 形成利益链条
  16. 计算机视觉:支持M:N匹配与活体检测的百度人脸Api调用典例
  17. 基于微信公众平台的美食分享系统设计与开发
  18. 对三星彩色打印机鼓清零的感悟
  19. 南邮 OJ 1208 邮局选址问题
  20. 几何画板Sketchpad5.0.6安装及PPT2016无缝使用

热门文章

  1. 解决Ubuntu系统中文乱码显示问题,终端打开文件及查看目录
  2. Centos6.5_x86_64 编译安装Subversion-1.8.5
  3. Ubuntu 安装 Qt 开发环境 简单实现
  4. virtual server2005下创建citrix集群的一点记录
  5. 嘿嘿,又中毒了spoolsv.exe
  6. poj 1186 方程的解数(线性探测再哈希)
  7. nyoj985带通配符的数
  8. AngularJS实战之Controller之间的通信
  9. poi控制简单的word
  10. Android项目打包开启proguard的混淆优化带来的问题