ITK讀取裸數據方法

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的具體使用方法,然後再對其進行簡單說明:
        typedef itk::RawImageIO<DicomPixelType, InputDimension> ImageIOType;
	ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
	gdcmImageIO->SetHeaderSize(0);  // 可選
	// The number of dimensions stored in a file. Defaults to two. 
	gdcmImageIO->SetFileDimensionality(2);  // 可選
	gdcmImageIO->SetNumberOfComponents(1);
	gdcmImageIO->SetDimensions( 0, 512 );
	gdcmImageIO->SetDimensions( 1, 512 );
	gdcmImageIO->SetSpacing( 0, 0.414 );
	gdcmImageIO->SetSpacing( 1, 0.414 );
	gdcmImageIO->SetHeaderSize(0);

	reader->SetImageIO( gdcmImageIO );
	reader->SetFileName( "..\\test_img\\IM-0001-0009.img" );
	reader->Update();
          學習itk:RawImageIO的方法可以從 Insight/Testing/Code/IO/itkRawImageIOTest.cxx開始,由於裸數據沒有固定的文件擴展名或格式,所以很難說一個文件是否爲裸數據,同樣在使用itk::RawImageIO讀取裸數據的時候要設置相關的數據信息。
       void itk::RawImageIO::SetHeaderSize(unsigned long size);
該函數用來指定頭文件的長度,以字節爲單位,如果要讀取的文件內全部是數據則設置爲0;
       void itk::RawImageIO::SetFileDimensionality(unsigned long dim);
指定數據的維數,二維或三維等等,默認爲2;
       void itk::ImageIOBase::SetDimensions(unsigned int i, int dim);
設置數據的長、寬和高;
       void itk::ImageIOBase::SetNumberOfComponents(unsigned int num_componen=ts);
設置數據中每個像素點用多少位表示,如果是RGB數據,則設置爲3;如果是灰度圖像則爲1.

//*******************************************************************************************************
附錄完整的測試代碼:
// TODO: Add your control notification handler code here

typedef unsigned short      RawPixelType;
typedef   float             SmoothPixelType;
const unsigned int          InputDimension = 2;

typedef itk::Image< RawPixelType,     2 > RawImageType;
typedef itk::Image< SmoothPixelType,  2 > SmoothImageType;

typedef itk::ImageFileReader< RawImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();

typedef itk::RawImageIO<RawPixelType, InputDimension> ImageIOType;
ImageIOType::Pointer rawImageIO = ImageIOType::New();

rawImageIO->SetFileTypeToBinary();       // 二進制方式打開
rawImageIO->SetFileDimensionality(2);    // 讀取二維數據
rawImageIO->SetByteOrderToLittleEndian();// 小端方式
rawImageIO->SetPixelType(itk::ImageIOBase::SCALAR); // 像素類型
rawImageIO->SetHeaderSize(0);           // 頭文件大小
rawImageIO->SetNumberOfComponents(1);   // 單個像素的位數
rawImageIO->SetDimensions( 0, 512 );    // 圖像寬
rawImageIO->SetDimensions( 1, 512 );    // 圖像高
rawImageIO->SetSpacing( 0, 0.414 );     // X 方向像素間距
rawImageIO->SetSpacing( 1, 0.414 );     // Y 方向像素間距
rawImageIO->SetOrigin(0,0.0);           // 圖像原點
rawImageIO->SetOrigin(1,0.0);           // 圖像原點

reader->SetFileName( "..\\test_img\\IM-0001-0009.img" );
reader->SetImageIO( rawImageIO );
reader->Update();

typedef itk::CastImageFilter< RawImageType, SmoothImageType >        CastingFilterType;
CastingFilterType::Pointer casterIn = CastingFilterType::New();

typedef itk::CastImageFilter< SmoothImageType, RawImageType >        CastingFilterType1;
CastingFilterType1::Pointer casterOut = CastingFilterType1::New();


typedef itk::CurvatureFlowImageFilter< SmoothImageType, SmoothImageType >  CurvatureFlowImageFilterType;
CurvatureFlowImageFilterType::Pointer smoothing = CurvatureFlowImageFilterType::New();

smoothing->SetNumberOfIterations( 5 );
smoothing->SetTimeStep( 0.125 );

casterIn->SetInput( reader->GetOutput() );

smoothing->SetInput( casterIn->GetOutput() );

casterOut->SetInput( smoothing->GetOutput() );

typedef itk::ImageFileWriter< RawImageType >  Writer1Type;
Writer1Type::Pointer writer = Writer1Type::New();

writer->SetFileName( "..\\test_img\\smooth.img" );
writer->SetImageIO( rawImageIO );
writer->SetInput( casterOut->GetOutput() );

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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章