VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)
1.vtkImageViewer2用于圖像顯示實(shí)例分析
在VTK早期版本中,提供了vtkImageViewer類來(lái)顯示圖像。隨著版本的發(fā)展,目前vtkImageViewer2代替了vtkImageViewer進(jìn)行圖像顯示。vtkImageViewer2中封裝了VTK圖像顯示的管線,包括vtkActor,vtkRender,vtkRenderWindow,vtkInteractorStypeImage等對(duì)象,可以方便的完成圖像顯示和交互。該類提供的主要交互操作有:圖像放縮,窗寬窗位調(diào)節(jié),并提供切片選擇,切片方向設(shè)置接口,尤其適合三維圖像的顯示。
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkMetaImageReader.h> #include <vtkImageViewer2.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main(int argc, char* argv[]) {vtkSmartPointer<vtkMetaImageReader> reader =vtkSmartPointer<vtkMetaImageReader>::New();reader->SetFileName("data/brain.mhd");reader->Update();vtkSmartPointer<vtkImageViewer2> viewer =vtkSmartPointer<vtkImageViewer2>::New();viewer->SetInputConnection(reader->GetOutputPort());//設(shè)置基本屬性viewer->SetSize(640,480);viewer->SetColorLevel(500);viewer->SetColorWindow(2000);viewer->SetSlice(40);viewer->SetSliceOrientationToXY();viewer->Render();viewer->GetRenderer()->SetBackground(1,1,1);viewer->GetRenderWindow()->SetWindowName("ImageViewer2D");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();//設(shè)置交互屬性viewer->SetupInteractor(rwi);rwi->Start();return 0; }為了更好的說(shuō)明vtkImageViewer2功能,使用一副三維醫(yī)學(xué)圖像為例進(jìn)行說(shuō)明。首先使用vtkMetaImageReader讀入一個(gè)mhd圖像,然后定義vtkImageViewer2對(duì)象顯示圖像。最后定義了一個(gè)vtkRenderWindowInteractor對(duì)象,并傳遞給vtkImageViewer2對(duì)象,用于完成鼠標(biāo)、鍵盤(pán)等消息響應(yīng),便于進(jìn)行圖像的交互操作。
其中也設(shè)置了四個(gè)參數(shù),窗位(ColorLevel)、窗寬(ColorWindow)、切片(Slice)和切片方向(Orientation)。按下鼠標(biāo)左鍵拖動(dòng)鼠標(biāo),可以調(diào)節(jié)圖像的窗寬窗位,從而顯示不同灰度范圍內(nèi)容;按下鼠標(biāo)右鍵拖動(dòng)鼠標(biāo)可以放縮圖像。當(dāng)然這些交互操作可以由用戶根據(jù)需要自己定義vtkInteractorStyle子類,并響應(yīng)相應(yīng)的操作。
而顯示三維圖像時(shí),需要確定當(dāng)前顯示切片和方向。vtkImageViewer2提供了SetSlice()函數(shù)設(shè)置切片號(hào),SetSliceOrientationToXY()則將切片的方向設(shè)置為垂直XY平面方向。此外還可以設(shè)置為垂直YZ或者XZ平面方向,其對(duì)應(yīng)函數(shù)分別為SetSliceOrientationToYZ()和SetSliceOrientationToXZ()。默認(rèn)情況下切片方向?yàn)榇怪庇赬Y平面即沿著Z軸方向,根據(jù)設(shè)置的切片號(hào)獲取Z軸方向的具體切片進(jìn)行顯示。
2.vtkImageActor用于圖像顯示
vtkImageActor是一個(gè)三維圖像渲染Actor,通過(guò)紋理映射將圖像映射到一個(gè)多邊形上進(jìn)行顯示。使用vtkImageActor較vtkImageViewer2要復(fù)雜一些,需要建立完整的渲染管線:包括vtkImageActor,vtkRender,vtkRenderWindow,vtkRenderWindowInteractor管線。另外,作為圖像二維瀏覽器,不需要在三維空間中進(jìn)行旋轉(zhuǎn)操作,因此還需要為vtkRenderWindow定義一個(gè)vtkInteractorStyleImage對(duì)象。
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkBMPReader.h> #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h>int main() {vtkSmartPointer<vtkBMPReader> reader =vtkSmartPointer<vtkBMPReader>::New();reader->SetFileName("data/lena.bmp");reader->Update();vtkSmartPointer<vtkImageActor> actor =vtkSmartPointer<vtkImageActor>::New();actor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkRenderer> render =vtkSmartPointer<vtkRenderer>::New();render->AddActor(actor);render->ResetCamera();render->SetBackground(1,1,1);vtkSmartPointer<vtkRenderWindow> window =vtkSmartPointer<vtkRenderWindow>::New();window->AddRenderer(render);window->SetSize(640,480);window->SetWindowName("ImageViewer3D");window->Render();vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(window);rwi->Initialize();rwi->Start();return 0; }在讀入圖像后,依次建立vtkImageActor,vtkRender,vtkRenderWindow,vtkRenderWindowInteractor,并組裝為管線。為了屏蔽旋轉(zhuǎn)操作,建立vtkInteractorStyleImage對(duì)象,并通過(guò)rwi->SetInteractorStyle(style)設(shè)置交互對(duì)象。需要注意的是,vtkImageActor接收的圖像vtkImageData數(shù)據(jù)類型必須為unsigned char類型,因此在顯示之前,必要的時(shí)候需要利用vtkImageCast將圖像數(shù)據(jù)類型轉(zhuǎn)換為unsigned char。
顯示結(jié)果:
3.參考資料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. ?張曉東, 羅火靈. VTK圖形圖像開(kāi)發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VTK修炼之道14:图像处理_创建
- 下一篇: 【飞秋】在SPItemEventRece