VTK序列图像的读取

        医学图像处理的应用程序中,经常会碰到读取一个序列图像的操作。比如CT、MR等所成的图像都是一个切面一个切面地存储的,医学图像处理程序要处理这些数据,第一步当然是把这些数据从磁盘等外部存储介质中导入内存。

        利用VTK可以读取多种格式的图像文件,支持读取单个的二维图像(比如*.BMP、*.JPEG、*.PNG等)或者三维图像文件(*.VTK、*.mhd、*.mha等),也支持序列图像文件的导入。下面我们详细地讲解如何在VTK里实现序列图像文件的读取(我们以美国可视人的数据做为测试数据,数据可以从这里下载到)。

在讲解VTK序列图像读取之前,有一个问题需要注意的:就是待读取的序列图像的文件名必须是规则的,比如像下图所示的。

Tips:涉及到指改文件名的,如果熟悉Dos命令的,直接用rename命令就可以完成;或者是使用一个小软件Renamer来修改。

 

图1序列图像的命名示例

 

方法一:使用SetFileNames()方法读取序列图像。

 

[cpp]  view plain  copy
  1. //生成图像序列的文件名数组  
  2. vtkSmartPointer<vtkStringArray > fileArray =  
  3. vtkSmartPointer<vtkStringArray >::New();  
  4. charfileName[128];  
  5. for(inti = 1; i < 20; i++) //几个图像就循环几次  
  6. {  
  7. sprintf(fileName,"../VisibleWomanHead/VisibleWomanHead_%02d.jpg", i);  
  8. vtkstd::stringfileStr(fileName);  
  9. fileArray->InsertNextValue(fileStr);     
  10. }  
  11. //读取JPG序列图像  
  12. vtkSmartPointer<vtkJPEGReader>reader =  
  13. vtkSmartPointer<vtkJPEGReader>::New();  
  14. reader->SetFileNames(fileArray);  
  15. reader->Update();  
 

说明:要读取的序列文件是存放在文件夹VisibleWomanHead里的,而且每个图像的命名规则是:VisibleWomanHead_01.jpg,VisibleWomanHead_02.jpg……如图1所示。方法一我们使用了vtkStringArray先构建一个包含要读取的序列图像文件的文件名数组,然后调用vtkJPEGReader里的SetFileNames()方法。方法SetFileNames()是在类vtkImageReader2里实现的,所以大部分VTK图像的读取类都可以用这种方法来读取序列图像文件。

 

方法二:使用SetFilePrefix()/SetFilePattern()方法读取序列图像。

前面我们已经提过,在读取序列图像文件时,要求序列里的文件名有规律地命名(如图1),既然这些文件名有规律,我们可以采用vtkImageReader2里的方法SetFilePrefix()/SetFilePattern()来读取序列图像。

[cpp]  view plain  copy
  1. vtkSmartPointer<vtkJPEGReader>reader =  
  2. vtkSmartPointer<vtkJPEGReader>::New();  
  3. reader->SetFilePrefix ("D:/Data/VisibleWomanHead/VisibleWomanHead_");  
  4. reader->SetFilePattern("%s%02d.jpg");  
  5. reader ->SetDataExtent (0,511,0,511,1,20);//图像大小是512*512  
  6. reader->Update();  

至于为什么这么写,你们感受一下就知道了,特别是SetFilePrefix()、SetFilePattern()、SetDataExtent()这几个函数的参数。

 

方法三:一张一张地读入,然后合并成一个三维的数据体。

[cpp]  view plain  copy
  1. vtkSmartPointer<vtkImageAppend > append =  
  2.        vtkSmartPointer<vtkImageAppend >::New();  
  3. append->SetAppendAxis(2);  
  4.    
  5. vtkSmartPointer<vtkJPEGReader>reader =  
  6.        vtkSmartPointer<vtkJPEGReader>::New();  
  7. char fileName[128];  
  8. for(int i = 1; i < 21; i++)  
  9. {  
  10.        sprintf(fileName,"D:/Data/VisibleWomanHead/VisibleWomanHead_%02d.jpg", i);  
  11.        reader->SetFileName(fileName);  
  12.        append->AddInputConnection(reader->GetOutputPort());  
  13. }  

我们使用类vtkImageAppend做合并的操作,其中方法SetAppendAxis(2)是指定Z轴为读入的每层图像数据的堆叠方向。其他的代码你们继续感受一下,就不再叙述了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值