VTK修炼之道20:图像基本操作_图像类型转换
1.vtkImageCast
圖像數(shù)據(jù)類型轉(zhuǎn)換在數(shù)字圖像處理中會被頻繁地用到。一些常用到的圖像算子(例如梯度算子)在計(jì)算時出于精度的考慮,會將結(jié)果存儲為float或者double類型。但是在圖像顯示時,一般需要圖像為unsigned char類型。
VTK中最常用到的是VTKImageCast類型。其使用方法如下:
vtkSmartPointer<vtkImageCast> imgCast = vtkSmartPointer<vtkImageCast>::New(); imgCast->SetInput( (vtkDataObject*)reader->GetOutput() ); imgCast->SetOutputScalarTypeToFloat(); imgCast->Update();當(dāng)我們需要把圖像轉(zhuǎn)換成不同的類型進(jìn)行計(jì)算時,只需要把SetOutputScalarTypeToXXX()設(shè)置成相應(yīng)的輸出類型即可。
需要注意的是,這個類中還有一個變量是ClampQverflow,用來標(biāo)識是否組要截?cái)鄶?shù)據(jù)。默認(rèn)情況下,該變量值為0;當(dāng)設(shè)置為1時,輸出的像素值不能超過輸出類型的最大值。超過時會自動截?cái)嗟阶畲笾怠?/span>
此外還需要知道的就是,這個類進(jìn)行類型轉(zhuǎn)換時,只是將類型進(jìn)行強(qiáng)制轉(zhuǎn)換,而沒有進(jìn)行比例的縮放,因此使用起來會比較受限,因此VTK中時不推薦使用這個類的,例如一副double類型的圖像,圖像值的范圍[-1,1]。如果需要將圖像轉(zhuǎn)化為unsigned char類型,這種方法是不可行的!
2.vtkImageShiftScale
這個類時用起來要比上一類更加的靈活。他可以指定偏移和比例參數(shù)來對輸入圖像數(shù)據(jù)進(jìn)行操作,例如一副double類型的圖像,其數(shù)值范圍為[-1,1],如果將其轉(zhuǎn)換為unsigned char類型,需要設(shè)置shift=+1,Scale=127.5;那么輸入圖像的數(shù)據(jù)-1可以被映射為(-1+1)*127.5=0;+1可以被映射為(1+1)*127.5=255。具體使用方法如下所示:
vtkSmartPointer<vtkImageShiftScale> ShiftScale = vtkSmartPointer<vtkImageShiftScale>::New(); ShiftScale->SetInputConnection(img->GetOProducerPort()); ShiftScale->SetOutputScalarTypeToUnsignedChar(); ShiftScale->SetShift(1); ShiftScale->SetScale(127.5); ShiftScale->Update();
3.實(shí)驗(yàn)源碼
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkImageCast.h> #include <vtkImageShiftScale.h> #include <vtkBMPReader.h> #include <vtkMetaImageReader.h> #include <vtkImageViewer2.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main() {vtkSmartPointer<vtkMetaImageReader> reader =vtkSmartPointer<vtkMetaImageReader>::New(); //讀*.mhd文件reader->SetFileName("brain.mhd");reader->Update();//第一種類型轉(zhuǎn)換方案vtkSmartPointer<vtkImageCast> imgCast =vtkSmartPointer<vtkImageCast>::New();imgCast->SetInputData( (vtkDataObject *) reader->GetOutput() );imgCast->SetOutputScalarTypeToFloat();//第二種類型轉(zhuǎn)換方案vtkSmartPointer<vtkImageShiftScale> imgShiftScale =vtkSmartPointer<vtkImageShiftScale>::New();imgShiftScale->SetInputData((vtkDataObject*)reader->GetOutput());imgShiftScale->SetOutputScalarTypeToFloat();vtkSmartPointer<vtkImageViewer2> imgViewer =vtkSmartPointer<vtkImageViewer2>::New();imgViewer->SetInputConnection(imgCast->GetOutputPort());vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();imgViewer->SetupInteractor(rwi);imgViewer->SetColorLevel(500);imgViewer->SetColorWindow(2000);imgViewer->SetSlice(20);imgViewer->SetSliceOrientationToXY();imgViewer->Render();/*imgViewer->GetRenderer()->ResetCamera();imgViewer->Render();*/imgViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);imgViewer->SetSize(640, 480);imgViewer->GetRenderWindow()->SetWindowName("ImageTypeTrans");rwi->Start();return 0; }
4.參考資料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道20:图像基本操作_图像类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VTK修炼之道19:图像基本操作_图像像
- 下一篇: 飞秋2010下载企业信息化办公