1. 程式人生 > >VTK讀取原始資料(裸資料)和序列影象

VTK讀取原始資料(裸資料)和序列影象

    有時候我們想讀取得影象格式VTK中沒有相應的IO類支援或者影象格式是一些商家自定義的(醫療影象中經常會有這種情況)。這時候VTK為我們提供了一個vtkImageReader 類,該類提供了讀取原始資料的辦法,但需要我們設定待讀去影象的寬度、高度、畫素型別等一系列引數。以我所接觸到的影象格式做說明。hraw格式是160kv工業CT所獲取的切片影象格式型別。該種類型是CT生產商家自定義的影象格式。其影象相關資訊的檔案頭位於影象尾部。檔案頭格式如下:

 typedef struct
{
	unsigned long m_iWidth;			//影象寬度******** ,4位元組
	unsigned long m_iHeight;		//影象高度********,4位元組
	unsigned long m_iLength;		//影象序列長度  ********1,4位元組
	unsigned long m_iDataType;		//影象資料型別******** 4-ushort 7-float,4位元組
	unsigned long m_iDataPixelBytes;//畫素的位元組數 ,4位元組
	INT64 m_iDataTotalSize;			//影象資料總長度(注意,不包括使用者自定義資訊長度),8位元組
	VERSIONINFO m_versionInfo;		//軟體版本號,4位元組
	int m_iFileType;				//檔案型別,4位元組
	float m_iPixelSizeX;			//畫素尺寸,4位元組
	float m_iPixelSizeY;			//畫素尺寸,4位元組
	unsigned long m_iHeadOffset;	//資料從檔案頭的偏移量,4位元組
	unsigned long m_iUserInfoLength;//使用者自定義資訊長度,4位元組
	int m_iUnDefinedArray[51];		//備用位元組,4*51=204位元組
}HRAWHEADINFO; //256位元組

其中對vtkImagereader比較有用的資訊就只有三個:高度 寬度 型別。 所以我們需要編寫檔案操作函式以二進位制檔案形式開啟檔案獲取這三個引數。

下面貼出VTK讀取裸資料相關程式碼:

 //使用vtkImageReader類讀取裸資料
    vtkSmartPointer<vtkImageReader> reader=vtkSmartPointer<vtkImageReader>::New();
     reader->SetHeaderSize(0);   //很重要 因為hraw檔案資訊放在檔案尾 ,所以檔案頭尺寸應該為0
     reader->SetNumberOfScalarComponents(1);
     reader->SetFileDimensionality(2);
     reader->SetFilePrefix("E:/RootImgs/01C/HRAW/01C");
     reader->SetFilePattern("%s%04d.hraw");    //%04d表示:顯示4位數 不足的拿0補齊

    reader->SetDataExtent(0,h-1,0,w-1,1,1);
    reader->SetDataOrigin(0.0, 0.0, 0.0);
    if(type==1)
    { reader->SetDataScalarTypeToUnsignedShort();} //設定資料型別為ushort
    if(type==2)
    {reader->SetDataScalarTypeToFloat();}ushort //設定資料型別為float
   // reader->SetDataByteOrderToBigEndian();
    reader->SetDataByteOrderToLittleEndian();
    reader->UpdateWholeExtent();
注: 比較重要的 幾個點 
                  setHeaderSize(0); 要設定為0, 因為hraw型別檔案頭不再檔案頭部

                  SetDataExtent();  設定資料的尺寸  最後兩個引數作為讀取的影象序列號範圍

關於讀取序列影象有兩種方式;(參考文獻1)

  1  reader 類提供了SetfileNames() 可以設定多個檔名。具體操作可以用vtkStringArray類 通過迴圈語句讀取到檔名列表 然後作為setfilenames的引數

 2 使用reader類提供的setFilePix()和SetFilePattern(),兩個函式獲取序列影象

 reader->SetFilePrefix("E:/RootImgs/01C/HRAW/01C");
     reader->SetFilePattern("%s%04d.hraw");    //%04d表示:顯示4位數 不足的拿0補齊
setfileprefix 是檔名相同的部分

setfilepattern 設定檔名不同的部分

參考文獻: