VTK序列图像的读取[转][改]
2014-07-03 01:27
906 查看
医学图像处理的应用程序中,经常会碰到读取一个序列图像的操作。比如CT、MR等所成的图像都是一个切面一个切面地存储的,医学图像处理程序要处理这些数据,第一步当然是把这些数据从磁盘等外部存储介质中导入内存。
利用VTK可以读取多种格式的图像文件,支持读取单个的二维图像(比如*.BMP、*.JPEG、*.PNG等)或者三维图像文件(*.VTK、*.mhd、*.mha等),也支持序列图像文件的导入。下面我们详细地讲解如何在VTK里实现序列图像文件的读取(我们以美国可视人的数据做为测试数据,数据可以从这里下载到)。
在讲解VTK序列图像读取之前,有一个问题需要注意的:就是待读取的序列图像的文件名必须是规则的,比如像下图所示的。
Tips:涉及到指改文件名的,如果熟悉Dos命令的,直接用rename命令就可以完成;或者是使用一个小软件Renamer来修改。
图1序列图像的命名示例
方法一:使用SetFileNames()方法读取序列图像。
说明:要读取的序列文件是存放在文件夹VisibleWomanHead里的,而且每个图像的命名规则是:VisibleWomanHead_01.jpg,VisibleWomanHead_02.jpg……如图1所示。方法一我们使用了vtkStringArray先构建一个包含要读取的序列图像文件的文件名数组,然后调用vtkJPEGReader里的SetFileNames()方法。方法SetFileNames()是在类vtkImageReader2里实现的,所以大部分VTK图像的读取类都可以用这种方法来读取序列图像文件。
方法二:使用SetFilePrefix()/SetFilePattern()方法读取序列图像。
前面我们已经提过,在读取序列图像文件时,要求序列里的文件名有规律地命名(如图1),既然这些文件名有规律,我们可以采用vtkImageReader2里的方法SetFilePrefix()/SetFilePattern()来读取序列图像。
至于为什么这么写,你们感受一下就知道了,特别是SetFilePrefix()、SetFilePattern()、SetDataExtent()这几个函数的参数。
方法三:一张一张地读入,然后合并成一个三维的数据体。
我们使用类vtkImageAppend做合并的操作,其中方法SetAppendAxis(2)是指定Z轴为读入的每层图像数据的堆叠方向。其他的代码你们继续感受一下,就不再叙述了。
==========欢迎转载,转载时请保留该声明信息==========
版权归@东灵工作室所有,更多信息请访问东灵工作室
教程系列导航:/article/1587785.html
================================================
这里再补充一种用vtkVolume16Reader类,读取DICOM文件的方法:
利用VTK可以读取多种格式的图像文件,支持读取单个的二维图像(比如*.BMP、*.JPEG、*.PNG等)或者三维图像文件(*.VTK、*.mhd、*.mha等),也支持序列图像文件的导入。下面我们详细地讲解如何在VTK里实现序列图像文件的读取(我们以美国可视人的数据做为测试数据,数据可以从这里下载到)。
在讲解VTK序列图像读取之前,有一个问题需要注意的:就是待读取的序列图像的文件名必须是规则的,比如像下图所示的。
Tips:涉及到指改文件名的,如果熟悉Dos命令的,直接用rename命令就可以完成;或者是使用一个小软件Renamer来修改。
图1序列图像的命名示例
方法一:使用SetFileNames()方法读取序列图像。
[cpp] view plaincopy //生成图像序列的文件名数组 vtkSmartPointer<vtkStringArray > fileArray = vtkSmartPointer<vtkStringArray >::New(); charfileName[128]; for(inti = 1; i < 20; i++) //几个图像就循环几次 { sprintf(fileName,"../VisibleWomanHead/VisibleWomanHead_%02d.jpg", i); vtkstd::stringfileStr(fileName); fileArray->InsertNextValue(fileStr); } //读取JPG序列图像 vtkSmartPointer<vtkJPEGReader>reader = vtkSmartPointer<vtkJPEGReader>::New(); reader->SetFileNames(fileArray); reader->Update();
说明:要读取的序列文件是存放在文件夹VisibleWomanHead里的,而且每个图像的命名规则是:VisibleWomanHead_01.jpg,VisibleWomanHead_02.jpg……如图1所示。方法一我们使用了vtkStringArray先构建一个包含要读取的序列图像文件的文件名数组,然后调用vtkJPEGReader里的SetFileNames()方法。方法SetFileNames()是在类vtkImageReader2里实现的,所以大部分VTK图像的读取类都可以用这种方法来读取序列图像文件。
方法二:使用SetFilePrefix()/SetFilePattern()方法读取序列图像。
前面我们已经提过,在读取序列图像文件时,要求序列里的文件名有规律地命名(如图1),既然这些文件名有规律,我们可以采用vtkImageReader2里的方法SetFilePrefix()/SetFilePattern()来读取序列图像。
vtkSmartPointer<vtkJPEGReader>reader = vtkSmartPointer<vtkJPEGReader>::New(); reader->SetFilePrefix ("D:/Data/VisibleWomanHead/VisibleWomanHead_"); reader->SetFilePattern("%s%02d.jpg"); reader ->SetDataExtent (0,511,0,511,1,20);//图像大小是512*512 reader->Update();
至于为什么这么写,你们感受一下就知道了,特别是SetFilePrefix()、SetFilePattern()、SetDataExtent()这几个函数的参数。
方法三:一张一张地读入,然后合并成一个三维的数据体。
vtkSmartPointer<vtkImageAppend > append = vtkSmartPointer<vtkImageAppend >::New(); append->SetAppendAxis(2); vtkSmartPointer<vtkJPEGReader>reader = vtkSmartPointer<vtkJPEGReader>::New(); char fileName[128]; for(int i = 1; i < 21; i++) { sprintf(fileName,"D:/Data/VisibleWomanHead/VisibleWomanHead_%02d.jpg", i); reader->SetFileName(fileName); append->AddInputConnection(reader->GetOutputPort()); }
我们使用类vtkImageAppend做合并的操作,其中方法SetAppendAxis(2)是指定Z轴为读入的每层图像数据的堆叠方向。其他的代码你们继续感受一下,就不再叙述了。
==========欢迎转载,转载时请保留该声明信息==========
版权归@东灵工作室所有,更多信息请访问东灵工作室
教程系列导航:/article/1587785.html
================================================
这里再补充一种用vtkVolume16Reader类,读取DICOM文件的方法:
vtkVolume16Reader *v16 = vtkVolume16Reader::New(); v16->SetFilePrefix( "E:/MedImage Data/Simon/SIMON_" ); v16->SetFilePattern("%s%02d.dcm"); v16->SetDataDimensions (512,512); v16->SetImageRange (0,54); v16->SetDataByteOrderToLittleEndian(); v16->SetDataSpacing (0.25, 0.25, 1.0);
相关文章推荐
- ITK+VTK+QT 读取DICOM序列图像遇到的问题(1)
- VTK读取序列图像
- VTK序列图像的读取
- VTK序列图像的读取
- VTK读取序列图像文件
- VTK学习(三)VTK读取序列图像
- VTK读取原始数据(裸数据)和序列图像
- VTK序列图像的读取
- 使用opencv读取图像序列
- matlab中批量读取图像序列并进行简单目标跟踪
- OpenCV读取视频和图像序列
- Opencv如何读取一批图像或者多幅图像序列
- Opencv如何读取一批图像或者多幅图像序列
- Vtk读取并显示保存图像
- VC++ VTK 读取序列CT图片三维重建
- VTK中各种图像格式的读取与显示
- vtk中当同一序列的影像尺寸不同时如何读取
- opencv读取序列图像并显示
- OpenCV读取视频和图像序列
- VTK读取序列的Dicom医学图片,用Marchingcube进行重建,并保存为obj文件