ITK读取裸数据方法

 关键词:ITK、裸数据、MRIcro、itk::RawImageIO

 
         ITK多用于医学图像的配置和分割,所以其对DICOM文件读写操作的支持是很好的(ITK内部使用GDCM对DICOM文件进行操作,有关GDCM的信息可直接访问其主页: 点击打开链接获取更多信息),但很多时候,特别是做研究的,往往会把处理后的数据以裸数据的形成临时保存,以便进行其它后续操作,而在ITK关于IO的例子中没有关于读取裸数据的信息。使用GOOGLE检索后,得到一条很有用的信息,自己测试了下,把自己翻译和测试的代码记录下来。

        1、裸数据的获得

         将DICOM文件转化为裸数据的方法很多,使用现成的软件---MRIcro进行转化是最简单的方法,MRIcro的主页: http://www.mccauslandcenter.sc.edu/mricro/mricro/mricro.html,在其主页的 Installation部分可以下载到安装文件,具体讲DICOM文件转化为裸数据的方法可以查看MRIcro的使用说明,如果还不会,可以联系我。另外建议使用DCMTK软件包来读取和保存DICOM文件中的数据信息,很简单,也很方便,可以作很多的中间处理,代码量也很少,可以参考DCMTK的说明文档。如果你使用MRIcro来转化,那么转化之后会产生两个文件,一个后缀名称是*.hdr,另外一个是*.img,后缀为hdr的文件内是数据的相关信息,如果你感兴趣可以在网上找到关于hdr文件格式的说明和详细的读写hdr文件c代码,而后缀为img的文件就是数据文件,里面保存的是纯粹的数据。
 

         2、使用ITK对裸数据进行读取并保存为裸数据

          使用ITK读取裸数据要在ImageFileReader中使用 itk:RawImageIO对象,直接调用ImageFileReader类的SetImageIO函数即可,和读取DICOM文件相似。在这里先贴出itk:RawImageIO的具体使用方法,然后再对其进行简单说明:
[cpp]  view plain copy
  1.        typedef itk::RawImageIO<DicomPixelType, InputDimension> ImageIOType;  
  2. ImageIOType::Pointer gdcmImageIO = ImageIOType::New();  
  3. gdcmImageIO->SetHeaderSize(0);  // 可选  
  4. // The number of dimensions stored in a file. Defaults to two.   
  5. gdcmImageIO->SetFileDimensionality(2);  // 可选  
  6. gdcmImageIO->SetNumberOfComponents(1);  
  7. gdcmImageIO->SetDimensions( 0, 512 );  
  8. gdcmImageIO->SetDimensions( 1, 512 );  
  9. gdcmImageIO->SetSpacing( 0, 0.414 );  
  10. gdcmImageIO->SetSpacing( 1, 0.414 );  
  11. gdcmImageIO->SetHeaderSize(0);  
  12.   
  13. reader->SetImageIO( gdcmImageIO );  
  14. reader->SetFileName( "..\\test_img\\IM-0001-0009.img" );  
  15. reader->Update();  
          学习itk:RawImageIO的方法可以从  Insight/Testing/Code/IO/itkRawImageIOTest.cxx开始,由于裸数据没有固定的文件扩展名或格式,所以很难说一个文件是否为裸数据,同样在使用itk::RawImageIO读取裸数据的时候要设置相关的数据信息。
[cpp]  view plain copy
  1. void itk::RawImageIO::SetHeaderSize(unsigned long size);  
该函数用来指定头文件的长度,以字节为单位,如果要读取的文件内全部是数据则设置为0;
[cpp]  view plain copy
  1. void itk::RawImageIO::SetFileDimensionality(unsigned long dim);  
指定数据的维数,二维或三维等等,默认为2;
[cpp]  view plain copy
  1. void itk::ImageIOBase::SetDimensions(unsigned int i, int dim);  
设置数据的长、宽和高;
[cpp]  view plain copy
  1. void itk::ImageIOBase::SetNumberOfComponents(unsigned int num_componen=ts);  
设置数据中每个像素点用多少位表示,如果是RGB数据,则设置为3;如果是灰度图像则为1.
 
//*******************************************************************************************************
附录完整的测试代码:
[cpp]  view plain copy
  1. // TODO: Add your control notification handler code here  
  2.   
  3. typedef unsigned short      RawPixelType;  
  4. typedef   float             SmoothPixelType;  
  5. const unsigned int          InputDimension = 2;  
  6.   
  7. typedef itk::Image< RawPixelType,     2 > RawImageType;  
  8. typedef itk::Image< SmoothPixelType,  2 > SmoothImageType;  
  9.   
  10. typedef itk::ImageFileReader< RawImageType > ReaderType;  
  11. ReaderType::Pointer reader = ReaderType::New();  
  12.   
  13. typedef itk::RawImageIO<RawPixelType, InputDimension> ImageIOType;  
  14. ImageIOType::Pointer rawImageIO = ImageIOType::New();  
  15.   
  16. rawImageIO->SetFileTypeToBinary();       // 二进制方式打开  
  17. rawImageIO->SetFileDimensionality(2);    // 读取二维数据  
  18. rawImageIO->SetByteOrderToLittleEndian();// 小端方式  
  19. rawImageIO->SetPixelType(itk::ImageIOBase::SCALAR); // 像素类型  
  20. rawImageIO->SetHeaderSize(0);           // 头文件大小  
  21. rawImageIO->SetNumberOfComponents(1);   // 单个像素的位数  
  22. rawImageIO->SetDimensions( 0, 512 );    // 图像宽  
  23. rawImageIO->SetDimensions( 1, 512 );    // 图像高  
  24. rawImageIO->SetSpacing( 0, 0.414 );     // X 方向像素间距  
  25. rawImageIO->SetSpacing( 1, 0.414 );     // Y 方向像素间距  
  26. rawImageIO->SetOrigin(0,0.0);           // 图像原点  
  27. rawImageIO->SetOrigin(1,0.0);           // 图像原点  
  28.   
  29. reader->SetFileName( "..\\test_img\\IM-0001-0009.img" );  
  30. reader->SetImageIO( rawImageIO );  
  31. reader->Update();  
  32.   
  33. typedef itk::CastImageFilter< RawImageType, SmoothImageType >        CastingFilterType;  
  34. CastingFilterType::Pointer casterIn = CastingFilterType::New();  
  35.   
  36. typedef itk::CastImageFilter< SmoothImageType, RawImageType >        CastingFilterType1;  
  37. CastingFilterType1::Pointer casterOut = CastingFilterType1::New();  
  38.   
  39.   
  40. typedef itk::CurvatureFlowImageFilter< SmoothImageType, SmoothImageType >  CurvatureFlowImageFilterType;  
  41. CurvatureFlowImageFilterType::Pointer smoothing = CurvatureFlowImageFilterType::New();  
  42.   
  43. smoothing->SetNumberOfIterations( 5 );  
  44. smoothing->SetTimeStep( 0.125 );  
  45.   
  46. casterIn->SetInput( reader->GetOutput() );  
  47.   
  48. smoothing->SetInput( casterIn->GetOutput() );  
  49.   
  50. casterOut->SetInput( smoothing->GetOutput() );  
  51.   
  52. typedef itk::ImageFileWriter< RawImageType >  Writer1Type;  
  53. Writer1Type::Pointer writer = Writer1Type::New();  
  54.   
  55. writer->SetFileName( "..\\test_img\\smooth.img" );  
  56. writer->SetImageIO( rawImageIO );  
  57. writer->SetInput( casterOut->GetOutput() );  
  58.   
  59. try  
  60. {  
  61.     writer->Update();  
  62. }  
  63. catch( itk::ExceptionObject & excep )  
  64. {  
  65.     std::cerr << "Exception caught !" << std::endl;  
  66.     std::cerr << excep << std::endl;  
  67. }  

本文来源:http://blog.csdn.net/yunzhaoqiang/article/details/7905113

 

你可能感兴趣的:(读取,ITK,裸数据)