VTK修炼之道18:图像基本操作_图像信息的访问与修改(vtkImageChangeInformation)
1.類vtkImageChengeInformation用于圖像信息修改
vtkImageData中提供了多個(gè)Set函數(shù)用于設(shè)置圖像的基本信息。當(dāng)對(duì)一個(gè)管線的輸出修改圖像信息后,如果管線重新Update,那么這些修改都會(huì)恢復(fù)回原來的值。而vtkChangeImageInformation可以作為管線中的一個(gè)filter來修改圖像信息。利用這個(gè)filter可以修改圖像的原點(diǎn),像素間隔以及范圍起點(diǎn)(extent),另外還可以對(duì)圖像平移縮放等操作。
2.代碼及仿真
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkBMPReader.h> #include <vtkImageData.h> #include <vtkImageChangeInformation.h> #include <vtkImageViewer2.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main() {vtkSmartPointer<vtkBMPReader> reader =vtkSmartPointer<vtkBMPReader>::New();reader->SetFileName("lena.bmp");reader->Update();int dims[3];double origin[3];double spacing[3];reader->GetOutput()->GetDimensions(dims);std::cout << "圖像維度:" << dims[0] << " " << dims[1] << " " << dims[2] << std::endl;reader->GetOutput()->GetOrigin(origin);std::cout << "圖像中心:" << origin[0] << " " << origin[1] << " " << origin[2] << std::endl;reader->GetOutput()->GetSpacing(spacing);std::cout << "圖像間隔:" << spacing[0] << " " << spacing[1] << " " << spacing[2] << std::endl;vtkSmartPointer<vtkImageChangeInformation> changer =vtkSmartPointer<vtkImageChangeInformation>::New();changer->SetInputData(reader->GetOutput());changer->SetOutputOrigin(100, 100, 0);changer->SetOutputSpacing(10, 10, 1);changer->SetCenterImage(1);changer->Update();changer->GetOutput()->GetDimensions(dims);std::cout << "圖像維度:" << dims[0] << " " << dims[1] << " " << dims[2] << std::endl;changer->GetOutput()->GetOrigin(origin);std::cout << "圖像中心:" << origin[0] << " " << origin[1] << " " << origin[2] << std::endl;changer->GetOutput()->GetSpacing(spacing);std::cout << "圖像間隔:" << spacing[0] << " " << spacing[1] << " " << spacing[2] << std::endl;vtkSmartPointer<vtkImageViewer2> imgViewer =vtkSmartPointer<vtkImageViewer2>::New();imgViewer->SetInputConnection(changer->GetOutputPort());vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();imgViewer->SetupInteractor(rwi);imgViewer->Render();imgViewer->GetRenderer()->ResetCamera();imgViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);imgViewer->Render();imgViewer->GetRenderWindow()->SetWindowName("ChangeImageInfo");imgViewer->SetSize(640, 480);rwi->Start();return 0; }輸出結(jié)果: 首先讀入圖像,由vtkImageData提供函數(shù)接口獲取圖像的維數(shù),原點(diǎn)和像素間隔。然后定義vtkImageChangeInformation指針,并設(shè)置輸出圖像原點(diǎn)為(100, 100, 0),輸出圖像像素間隔為(10, 10, 1),然后調(diào)用CenterImage()函數(shù)將圖像的原點(diǎn)置于圖像的中心。
操作后的結(jié)果使得圖像的原點(diǎn)位于(-2555, -2555, 0),SetOutputOrigin(100, 100, 0)并沒有起作用。
原因在哪里呢?
如果看下CenterImage()函數(shù)的注釋,可以發(fā)現(xiàn)該函數(shù)的作用是將(0, 0, 0)點(diǎn)置于圖像的中心。當(dāng)CenterImage該函數(shù)執(zhí)行時(shí)會(huì)重寫SetOutputOrigin(),所以SetOutputOrigin函數(shù)不會(huì)產(chǎn)生任何作用。那(-2555, -2555, 0)又是如何計(jì)算出來的呢?
這個(gè)原理如下圖所示:
根據(jù)圖像的維數(shù)和像素間隔計(jì)算得到新的圖像的寬度和高度為(512-1)*10,初始圖像的原點(diǎn)位于(0, 0,0),現(xiàn)在將圖像的中心平移至原點(diǎn),平移量為(-(512-1)*10/2,(512-1)*5/2, 0) = (-2555, -2555,0)。
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道18:图像基本操作_图像信息的访问与修改(vtkImageChangeInformation)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (BCB) CComPtrIHTMLDo
- 下一篇: 关于CompleteWithAppPat