实例:VTK读数据,转ITK数据,用ITK处理后,转VTK数据,显示!
重要代码:
( 1 )VTK转ITK
//VTK 转ITK
typedef itk::VTKImageToImageFilter< ImageType> vtkToitkFilterType;
vtkToitkFilterType::Pointer vtkToitkImageFilter = vtkToitkFilterType::New();
vtkToitkImageFilter->SetInput(Reader->GetOutput());
vtkToitkImageFilter->Update();
( 2 )ITK转VTK
//ITK 转VTK
typedef itk::ImageToVTKImageFilter< ImageType> itkTovtkFilterType;
itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New();
itkTovtkImageFilter->SetInput(meanFilter->GetOutput());
itkTovtkImageFilter->Update();
看了很多博客,发现都说这两个函数就OK,但是自己不操作就永远不知道咋来的,因为有的前辈写到需要用CastImageFilter函数进行类型转换,但是我这个并不需要什么转换,说不定什么时候也会用呢!!
下面例子亲测可行:
#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
#include "vtkActor.h"
#include "vtkPolyDataMapper.h"
#include "vtkSmoothPolyDataFilter.h"
#include "vtkPolyDataNormals.h"
#include "vtkDecimatePro.h"
#include "vtkProperty.h"
#include <vtkInteractorStyleImage.h>
#include "itkImageToVTKImageFilter.h"
#include "itkVTKImageToImageFilter.h"
#include "itkMeanImageFilter.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
const unsigned char Dim = 3;
typedef float PixelType;
typedef itk::Image<PixelType,Dim> ImageType;
int main()
{
vtkSmartPointer<vtkMetaImageReader> Reader =vtkSmartPointer<vtkMetaImageReader>::New();
Reader->SetFileName("/Users/mac/Desktop/end.mhd");
Reader->Update();
//VTK 转ITK
typedef itk::VTKImageToImageFilter< ImageType> vtkToitkFilterType;
vtkToitkFilterType::Pointer vtkToitkImageFilter = vtkToitkFilterType::New();
vtkToitkImageFilter->SetInput(Reader->GetOutput());
vtkToitkImageFilter->Update();
//均值滤波
typedef itk::MeanImageFilter<ImageType, ImageType > filterType;
filterType::Pointer meanFilter = filterType::New();
meanFilter->SetInput( vtkToitkImageFilter->GetOutput() );
meanFilter->Update();
//ITK 转VTK
typedef itk::ImageToVTKImageFilter< ImageType> itkTovtkFilterType;
itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New();
itkTovtkImageFilter->SetInput(meanFilter->GetOutput());
itkTovtkImageFilter->Update();
//用Marching Cubes 算法
vtkSmartPointer<vtkMarchingCubes> vesselExtractor = vtkMarchingCubes::New();
vesselExtractor->SetInputData(itkTovtkImageFilter->GetOutput());
vesselExtractor->SetNumberOfContours(10);
vesselExtractor->SetValue( 0 , 1); //表示轮廓
vtkSmartPointer<vtkStripper> vesselStripper = vtkStripper::New();
vesselStripper->SetInputConnection(vesselExtractor->GetOutputPort());
vtkSmartPointer<vtkPolyDataMapper> vesselMapper = vtkPolyDataMapper::New();
vesselMapper->SetInputConnection(vesselStripper->GetOutputPort());
vesselMapper->SetScalarRange(0,7);
vesselMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> vessel = vtkActor::New();
vessel->SetMapper(vesselMapper);
vessel->GetProperty()->SetColor(0.4,0,1);
vtkSmartPointer<vtkRenderer> ren = vtkRenderer::New();
ren->SetBackground( 120, 120, 120 );
vtkSmartPointer<vtkRenderWindow> renWindow = vtkRenderWindow::New();
renWindow->SetSize(1000, 1000);
renWindow->AddRenderer(ren);
//交互
cout<<"正在绘制..."<<endl;
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow (renWindow);
ren->AddActor(vessel);
renWindow->Render();
renWindow->SetWindowName("VTK读取ITK处理后显示结果");
iren->Initialize();
renWindow->Render();
// seedWidget->On();
iren->Start();
cout<<"绘制完成!"<<endl;
return 0;
}