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

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

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

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

图1序列图像的命名示例

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

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

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

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

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

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

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

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

  1. vtkSmartPointer<vtkImageAppend > append =
  2. vtkSmartPointer<vtkImageAppend >::New();
  3. append->SetAppendAxis();
  4.  
  5. vtkSmartPointer<vtkJPEGReader>reader =
  6. vtkSmartPointer<vtkJPEGReader>::New();
  7. char fileName[];
  8. for(int i = ; i < ; 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轴为读入的每层图像数据的堆叠方向。其他的代码你们继续感受一下,就不再叙述了。

==========欢迎转载,转载时请保留该声明信息==========
版权归@东灵工作室所有,更多信息请访问东灵工作室
教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686
================================================

这里再补充一种用vtkVolume16Reader类,读取DICOM文件的方法:

  1. vtkVolume16Reader *v16 = vtkVolume16Reader::New();
  2. v16->SetFilePrefix( "E:/MedImage Data/Simon/SIMON_" );
  3. v16->SetFilePattern("%s%02d.dcm");
  4. v16->SetDataDimensions (,);
  5. v16->SetImageRange (,);
  6. v16->SetDataByteOrderToLittleEndian();
  7. v16->SetDataSpacing (0.25, 0.25, 1.0);

VTK序列图像的读取[转][改]的更多相关文章

  1. Opencv-Python:图像尺寸、图像的读取、显示、保存与复制

    Opencv-Python:图像尺寸.图像的读取.显示.保存与复制 原创 2017年11月23日 21:30:49 4440 在使用opencv的方法时,首先必须导入opencv包.新的opencv导 ...

  2. OpenCV中图像的读取,显示与保存

      图像的读取,显示与保存 相关函数:cv2.imread().cv2.imshow().cv2.imwrite() 1.读入图像: 用cv2.imread()函数来读取图像,cv2.imread(路 ...

  3. opencv:图像的读取,显示,写入文件

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  4. 根据序列图像聚焦区域获取深度 Shape From Focus

    最为超新新新新鸟...我也不知道第一篇文章应该写什么..所以,把自己最近正在研究的东西报一下吧, 研究的东西其实也不算深奥,就是对一个图像序列中的每张图像进行检测,发现每张图片的聚焦清晰区域,找到这个 ...

  5. mongodb python image 图像存储读取

    最近做一些数据库调研的工作,目标是实现影像更快的入库.出库.查询,并实现并行访问等操作. 将结果总结成一个mongoImg类,也算是小结吧. ''' Created on 2013-8-6 class ...

  6. OpenCV2学习笔记04:图像的读取与显示

    1. 图像读取:imread() Mat imread( ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取 ...

  7. Python下的OpenCV学习 02 —— 图像的读取与保存

    OpenCV提供了众多对图片操作的函数,其中最基本的就是图片的读取与输出了. 一.读取图片 利用OpenCV读取一张图片是非常容易的,只需要用到 imread() 函数,打开shell或者cmd,进入 ...

  8. 第十二节,OpenCV学习(一)图像的读取、显示、保存

    一.读取图像 所谓的图像就是一个数组,对图像的处理就是对数字的处理 import cv2 import numpy as np img = cv2.imread('dog.jpg') print(im ...

  9. HDU 1087 Super Jumping! Jumping! Jumping!(求LSI序列元素的和,改一下LIS转移方程)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limit: 20 ...

随机推荐

  1. greensock的tween源码阅读笔记

    对于一个处于gc状态的tween,如果这个gc状态是由kill触发的,那么直接从masterList删除否则的话,被tweenlite的垃圾回收删除! 对于一个不是立即启动的tween,它被添加到ti ...

  2. 【转】Xcode中的iOS模拟器(iOS Simulator)的介绍和使用心得

    iOS模拟器简介 iOS功能简介 iOS模拟器,是在Mac下面开发程序时,开发iOS平台的程序时候,可以使用的辅助工具. 其功能是,帮你模拟iOS平台设备,在模拟器上运行对应的程序,以方便你没有实体设 ...

  3. 多数据源问题--Spring+Ibatis 访问多个数据源(非分布式事务)

    有的时候,我在一个工程中需要访问两个以上的数据源,尤其是在系统集成的时候,以下是我在系统集成的时候遇到的情况,我的工程的架构是:spring2.0+ibatis2.0+struts1.2. 数据库是o ...

  4. UIImageView 点击放大缩小

    static CGRect oldframe; -(void)showImage:(UIImageView *)avatarImageView{ UIImage *image=avatarImageV ...

  5. <转>selenium+python+API分类总结

    分类 方法 方法描述 客户端操作 __init__(self, host, port, browserStartCommand, browserURL) 构造函数.host:selenium serv ...

  6. linux modprobe.conf怎么不见了—-CentOS 6

    用习惯了CentOS或RHEL的用户或许很熟悉/etc/modprobe.conf文件,系统声卡.网卡.SCSI卡的驱动类型都在这里定义,同样部分动态加载的模块的参数也可以在这个文件中定义,但是在Ce ...

  7. Java多线程的五种状态

    新建状态:new Thread(参数)之后,建立了一个线程对象; 就绪状态:线程对象建立之后,调用start()方法,进入就绪状态,此时并不会直接调用run()方法,线程进入运行状态还需要抢占CPU资 ...

  8. C语言实现strlen

    strlen: #ifndef STRLEN_H #define STRLEN_H #include <stdio.h> // 参考微软的写法 int cat_strlen(const c ...

  9. Chapter7:类

    关于this指针 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象.当我们调用一个成员函数时,用请求该函数的对象初始化this. total.isbn(); //等价于编译器重写为 Sa ...

  10. Python 统计文本中单词的个数

    1.读文件,通过正则匹配 def statisticWord(): line_number = 0 words_dict = {} with open (r'D:\test\test.txt',enc ...