VTK序列圖像的讀取[轉][改]


醫學圖像處理的應用程序中,經常會碰到讀取一個序列圖像的操作。比如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[128];  
 6 for(inti = 1; i < 20; 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 (0,511,0,511,1,20);//圖像大小是512*512
6 reader->Update();

至於為什么這么寫,你們感受一下就知道了,特別是SetFilePrefix()、SetFilePattern()、SetDataExtent()這幾個函數的參數。

 

方法三:一張一張地讀入,然后合並成一個三維的數據體。

 1 vtkSmartPointer<vtkImageAppend > append =
 2        vtkSmartPointer<vtkImageAppend >::New();
 3 append->SetAppendAxis(2);
 4  
 5 vtkSmartPointer<vtkJPEGReader>reader =
 6        vtkSmartPointer<vtkJPEGReader>::New();
 7 char fileName[128];
 8 for(int i = 1; i < 21; 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文件的方法:

vtkVolume16Reader *v16 = vtkVolume16Reader::New();
v16->SetFilePrefix( "E:/MedImage Data/Simon/SIMON_" );
v16->SetFilePattern("%s%02d.dcm");
v16->SetDataDimensions (512,512);
v16->SetImageRange (0,54);
v16->SetDataByteOrderToLittleEndian();
v16->SetDataSpacing (0.25, 0.25, 1.0);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM