VTK读取序列化图像
vtk獲取內存中圖像數據
原文鏈接: http://blog.csdn.net/zmy3376365/article/details/7717721內存中有段圖片數據??,使用VTK來讀入,然后就可以通過getoutputport()?/getoutput()來獲取了
vtkImageImport *importer = vtkImageImport::New();importer->SetWholeExtent( 0, m_image->width-1, 0, m_image->height-1, 0, 0 );importer->SetDataExtentToWholeExtent();importer->SetDataScalarTypeToUnsignedChar();importer->SetNumberOfScalarComponents(m_image->depth);importer->SetImportVoidPointer(m_image->data);// importer->Update();
vtk讀取dat 、raw等文件,不過文件后綴必須加上.1什么的
vtkVolume16Reader *v16 = vtkVolume16Reader::New();v16->SetDataDimensions(640, 480); //圖像大小v16->SetDataByteOrderToLittleEndian();v16->SetFilePrefix("./0.dat");v16->SetImageRange(1, 1);v16->SetDataSpacing(1.0, 1.0, 1.0);vtkImageResample *sample = vtkImageResample::New();sample->SetInput((vtkDataObject*)v16->GetOutput());sample->SetAxisMagnificationFactor(0, 1.2);sample->SetAxisMagnificationFactor(1, 1.2);vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();vtkImageViewer *viewer = vtkImageViewer::New();viewer->SetupInteractor(iren);viewer->SetInput(sample->GetOutput());VTKRenderer顯示圖片進行更新切換:
先removeActor
然后addActor
最后Render()
VTK讀取序列化圖像
原文鏈接:http://blog.csdn.net/www_doling_net/article/details/8896598
這個更給力了!!
醫學圖像處理的應用程序中,經常會碰到讀取一個序列圖像的操作。比如CT、MR等所成的圖像都是一個切面一個切面地存儲的,醫學圖像處理程序要處理這些數據,第一步當然是把這些數據從磁盤等外部存儲介質中導入內存。
? ? ? ? 利用VTK可以讀取多種格式的圖像文件,支持讀取單個的二維圖像(比如*.BMP、*.JPEG、*.PNG等)或者三維圖像文件(*.VTK、*.mhd、*.mha等),也支持序列圖像文件的導入。下面我們詳細地講解如何在VTK里實現序列圖像文件的讀取(我們以美國可視人的數據做為測試數據,數據可以從這里下載到)。
在講解VTK序列圖像讀取之前,有一個問題需要注意的:就是待讀取的序列圖像的文件名必須是規則的,比如像下圖所示的。
Tips:涉及到指改文件名的,如果熟悉Dos命令的,直接用rename命令就可以完成;或者是使用一個小軟件Renamer來修改。
?
圖1序列圖像的命名示例
?
方法一:使用SetFileNames()方法讀取序列圖像。
//生成圖像序列的文件名數組 vtkSmartPointer<vtkStringArray > fileArray = vtkSmartPointer<vtkStringArray >::New(); charfileName[128]; for(inti = 1; i < 20; i++) //幾個圖像就循環幾次 { sprintf(fileName,"../VisibleWomanHead/VisibleWomanHead_%02d.jpg", i); vtkstd::stringfileStr(fileName); fileArray->InsertNextValue(fileStr); } //讀取JPG序列圖像 vtkSmartPointer<vtkJPEGReader>reader = vtkSmartPointer<vtkJPEGReader>::New(); reader->SetFileNames(fileArray); reader->Update();說明:要讀取的序列文件是存放在文件夾VisibleWomanHead里的,而且每個圖像的命名規則是:VisibleWomanHead_01.jpg,VisibleWomanHead_02.jpg……如圖1所示。方法一我們使用了vtkStringArray先構建一個包含要讀取的序列圖像文件的文件名數組,然后調用vtkJPEGReader里的SetFileNames()方法。方法SetFileNames()是在類vtkImageReader2里實現的,所以大部分VTK圖像的讀取類都可以用這種方法來讀取序列圖像文件。
?
方法二:使用SetFilePrefix()/SetFilePattern()方法讀取序列圖像。
前面我們已經提過,在讀取序列圖像文件時,要求序列里的文件名有規律地命名(如圖1),既然這些文件名有規律,我們可以采用vtkImageReader2里的方法SetFilePrefix()/SetFilePattern()來讀取序列圖像。
[cpp] view plaincopy vtkSmartPointer<vtkJPEGReader>reader = vtkSmartPointer<vtkJPEGReader>::New(); reader->SetFilePrefix ("D:/Data/VisibleWomanHead/VisibleWomanHead_"); reader->SetFilePattern("%s%02d.jpg"); reader ->SetDataExtent (0,511,0,511,1,20);//圖像大小是512*512 reader->Update();至于為什么這么寫,你們感受一下就知道了,特別是SetFilePrefix()、SetFilePattern()、SetDataExtent()這幾個函數的參數。
方法二:一張一張地讀入,然后合并成一個三維的數據體。
[cpp] view plaincopy vtkSmartPointer<vtkImageAppend > append = vtkSmartPointer<vtkImageAppend >::New(); append->SetAppendAxis(2); vtkSmartPointer<vtkJPEGReader>reader = vtkSmartPointer<vtkJPEGReader>::New(); char fileName[128]; for(int i = 1; i < 21; i++) { sprintf(fileName,"D:/Data/VisibleWomanHead/VisibleWomanHead_%02d.jpg", i); reader->SetFileName(fileName); append->AddInputConnection(reader->GetOutputPort()); }我們使用類vtkImageAppend做合并的操作,其中方法SetAppendAxis(2)是指定Z軸為讀入的每層圖像數據的堆疊方向。其他的代碼你們繼續感受一下,就不再敘述了。
版權歸@東靈工作室所有,更多信息請訪問東靈工作室
教程系列導航:http://blog.csdn.net/www_doling_net/article/details/8763686
總結
以上是生活随笔為你收集整理的VTK读取序列化图像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gartner:6个容器和Kuberne
- 下一篇: 嵌入式19051开班典礼 | 有梦可依,