可靠的读写图像的类位于数据处理通道的开始和结束。这些类被认为是数据源(readers)和数据槽(writers)。一般来说,它们作为滤波器被涉及了,虽然readers没有输入通道,writers也没有输出通道。
        itk::ImageFileReader类管理图像的读入,而itk::ImageFileWriter管理图像的写操作。两个类对于任何文件格式都是独立的。实际上低水平的读、写特殊文件格式的任务由一组itk::ImageIO类在后台执行。
        执行读、写的第一步是要包含以下头文件:
        #include "itkImageFileReader.h"#include "itkImageFileWriter.h"

        这时,就像前面一样,必须决定被数据通道处理的表现图像的像素类型。注意:当读、写图像时,图像的像素类型不必与存储在文件中的像素类型一样。你对像素类型的选择主要有以下两个考虑:
        • 应该能够将在文件中的像素类型转换为你选择的像素类型。这需要用标准的C语言规则执行,所以必须保证变换没有导致信息丢失。
        • 内存中的像素类型应该适合你打算应用于图像的处理类型。
        医学图像处理一个典型的选择在下面的代码中介绍:

        typedef unsigned short PixelType;//无符号短型const unsigned int Dimension = 2;//二维图片typedef itk::Image< PixelType, Dimension > ImageType;//定义图像类型

       注意:在内存中图像的维数应该与文件中的图像的维数相匹配。有一对特别的状态,这种情况也许不是很严格,但一般能够确保两个维数匹配。
        我们现在以reader 和writer的类型为例,这两个类通过图像类型被参数化:

        typedef itk::ImageFileReader< ImageType > ReaderType;typedef itk::ImageFileWriter< ImageType > WriterType;

        这时,我们用New( )函数并把结果赋值给一个itk::SmartPointer来创建每个类型的对象:

        ReaderType::Pointer reader = ReaderType::New( );WriterType::Pointer writer = WriterType::New( );//智能指针(详见),现在可以暂时把它看做是对一个对象的实例的操作

        被读或写的文件名用SetFileName( )函数传递:
        reader->SetFileName( inputFilename );//读取的文件名(路径)writer->SetFileName( outputFilename );//写入的文件名(路径)

        我们把这些readers和writers连接到滤波器上来创建一个数据通道。例如,我们直接传递reader的输出给writer的输入来创建一个短数据通道:
        writer->SetInput( reader->GetOutput( ) );

        这也许是一个很没有用的程序,实际上是一个强大的文件格式转换工具。数据通道的执行被最后对象的Update( )触发。在这个情况下,最终的数据通道对象是writer。在通道被执行时,最明智的自我保护程序的做法是在一个try/catch模块中插入Update( )以抛出异常。

        try{writer->Update( );}catch( itk::ExceptionObject & err ){std::cerr << "ExceptionObject caught !" << std::endl;std::cerr << err << std::endl;return EXIT_FAILURE;}

        注意:异常只能被知道用它们去做什么的代码捕捉到。Catch 模块的典型应用应该是存在于GUI代码里。Catch 模块的活动是通知用户IO操作的失败。
        工具箱的IO体系结构使得避免外在地用于读、写图像的文件格式的说明是可能的。对象factory机构使ImageFileReader和ImageFileWriter能够决定(在运行时间)它将用哪种文件格式工作。典型地,文件格式基于文件扩展名选择,但是体系结构支持决定一个文件是否能被读或写的任意复杂的程序。作为选择,用户可以通过外在实例化和设置适当的itk::ImageIO子类来指定数据文件格式。
//ITK官网完整代码(英文注释删减版,源代码见Examples/IO/ImageReadWrite.cxx)#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImage.h"int main(int argc, char** argv)
{typedef short         PixelType;const   unsigned int  Dimension = 2;typedef itk::Image< PixelType, Dimension >    ImageType;typedef itk::ImageFileReader< ImageType >  ReaderType;typedef itk::ImageFileWriter< ImageType >  WriterType;ReaderType::Pointer reader = ReaderType::New();WriterType::Pointer writer = WriterType::New();const char* inputFilename = argv[1];const char* outputFilename = argv[2];reader->SetFileName(inputFilename);writer->SetFileName(outputFilename);writer->SetInput(reader->GetOutput());try{writer->Update();}catch (itk::ExceptionObject& err){std::cerr << "ExceptionObject caught !" << std::endl;std::cerr << err << std::endl;return EXIT_FAILURE;}return EXIT_SUCCESS;
}

"异常"后续:直接对上述官网源码添加读写文件名,会产生错误"Could not create IO object for writing file. There are no registered IO factories."

程序异常

该错误提示就是由Try/Catch异常处理提供.根据错误类型,我们创建一个GDCMImageIO对象(对应格式的ImageIO对象)并将其与reader和writer相连即可。

ITK 读写基本例子相关推荐

  1. ITK:读写矢量图像

    ITK:读写矢量图像 内容提要 C++实现代码 内容提要 本示例说明了如何读取和写入像素类型为Vector的图像. C++实现代码 #include "itkImageFileReader. ...

  2. 最简单的基于FFmpeg的内存读写的例子:内存转码器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  3. 最简单的基于FFmpeg的内存读写的例子:内存播放器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  4. java txtreader_一个简单的Java读写文件例子

    针对txt文件的读写可以使用java的读写操作.以下是一个简单的例子: import java.io.BufferedReader; import java.io.BufferedWriter; im ...

  5. 使用ITK读写DICOM序列

    版本:ITK 5.1.1 关键类: itk::ImageSeriesReader           用于读取图像序列: itk::ImageSeriesWriter             用于写入 ...

  6. golang 文件操作 创建 读写 复制移动 权限 删除

    目录 介绍 基本操作 创建空文件 Truncate文件 得到文件信息 重命名和移动 删除文件 打开和关闭文件 检查文件是否存在 检查读写权限 改变权限.拥有者.时间戳 硬链接和软链接 读写 复制文件 ...

  7. Android开发笔记(三十四)Excel文件的读写

    Android中操作Excel文件的场合较少见,主要是一些专业领域导入导出报表时使用,所以处理Excel读写的开源代码也很稀缺.目前读写Excel主要采用开源库jxl,这个是韩国人写的excel操作工 ...

  8. Android开发笔记(三十三)文本文件和图片文件的读写

    文本文件读写 简单文件读写一般是借助于FileOutputStream和FileInputStream,其中FileOutputStream用于写文件,而FileInputStream用于读文件. 写 ...

  9. mongodb java驱动_Java的MongoDB驱动及读写策略

    网上看见一篇博文,详细讲了MongoDB读写策略,将来生产会遇到类似的问题,转来备查. 指定新mongo实例: Mongo m = new Mongo(); Mongo m = new Mongo( ...

最新文章

  1. 通过C#实现集合类纵览.NET Collections及相关技术
  2. Debug时如何跳过(不执行)某些代码
  3. 使用SAP CRM中间件从ERP下载Customer的错误消息:Customer classification does not exist
  4. 计算机二级vf上机试题,2016年计算机二级《VF》上机题及答案
  5. 博人眼球的 电子苍蝇
  6. 20180705 考试记录
  7. java 垃圾回收机制_Java的垃圾回收机制
  8. 科研人看过来!中国人工智能学会-华为MindSpore学术奖励基金发布通知
  9. 查看可执行文件的运行架构_在运行查询之前如何查看结果集的架构
  10. Python入门基础教程(儿童版) [分享一本入门级教程]
  11. 方立勋jdbc mysql视频_java视频教程 Java自学视频整理(持续更新中...)
  12. 关于arctanx的麦克劳林展开式推导
  13. 基于VUE的SVG动画处理(一)
  14. 武汉凭什么被列为国家超大城市?
  15. 教你快速删除或/替换每个视频文件名中的空格、特殊符号
  16. 基于微信在线考试小程序系统设计与实现 开题报告
  17. 谷歌 Chrome 浏览器无法翻译网页解决方法
  18. B.FRIENDit壁虎忍者笔记本支架,铝合金电脑支架,便携折叠、可调节桌面电脑架
  19. [Linux转载]Linux 操作常用命令
  20. 关于Axure RP软件的介绍——软件工程实践第二次个人作业

热门文章

  1. 泛微实物档案数字化管理方案,全面优化组织档案管理
  2. 解决cannot do positional indexing on Index with these indexers [x] of type str
  3. CEC2015:动态多目标野狗优化算法求解CEC2015(提供完整MATLAB代码,含GD、IGD、HV和SP评价指标)
  4. 【异常】Session 0x0 for server null, unexpected error, closing socket connection and attempting reconn
  5. 【中国银联】数据挖掘笔试+三面面经
  6. 「图学习推荐系统」最新2022综述
  7. 前端初学之利用html,css,js实现车牌摇号程序(三)
  8. ios 弱网 数据丢失_在不丢失数据的情况下将您的iOS设备与新计算机同步
  9. 支付宝小程序唤起签约并支付(周期扣款)
  10. Halcon学习(1)初识Halcon HDevelop