使用vtkImageReslice重新切片3d原始图像

时间:2018-07-26 23:26:08

标签: c++ vtk rawimage

我正在尝试从3d原始图像中获取2d切片,并且正在vtkImageViewer2上查看输出,但是我得到的是空白窗口。

恐怕我不能使这段代码更短,因为此管道中的每个步骤都是必需的,如下所述: example that i followed

您还需要一个原始图像及其使用FullHead.raw.gz作为头文件的头文件FullHead.mhd

这是我的代码:

#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkImageReslice.h>
#include <vtkImageData.h>
#include <vtkLookupTable.h>
#include <vtkImageMapToColors.h>
#include <vtkImageViewer2.h>
#include <vtkMatrix4x4.h>
int main(){
vtkSmartPointer<vtkImageData> imagedata =
 vtkSmartPointer<vtkImageData>::New();
 vtkSmartPointer<vtkRenderWindow> m_renderWindow = 
 vtkSmartPointer<vtkRenderWindow>::New();
  std:string file_path = "FullHead.mhd";
   vtkSmartPointer<vtkMetaImageReader> m_rawImageReader = 
   vtkSmartPointer<vtkMetaImageReader>::New();
   m_rawImageReader->SetFileName(file_path.c_str());
 imagedata = m_rawImageReader->GetOutput();

 double * center = imagedata->GetCenter();

 static double axialElements[16] = {
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1 };
vtkMatrix4x4 *resliceAxes = vtkMatrix4x4::New();
resliceAxes->DeepCopy(axialElements);

resliceAxes->SetElement(0, 3, center[0]);
resliceAxes->SetElement(1, 3, center[1]);
resliceAxes->SetElement(2, 3, center[2]);

vtkSmartPointer<vtkImageReslice> imageReslice =
    vtkSmartPointer<vtkImageReslice>::New();
imageReslice->SetInputConnection(m_rawImageReader- 
>GetOutputPort());
 imageReslice->SetOutputDimensionality(2);
 imageReslice->SetResliceAxes(resliceAxes);
 imageReslice->SetInterpolationModeToLinear();
 // Create a greyscale lookup table
 vtkSmartPointer<vtkLookupTable> table = 
 vtkSmartPointer<vtkLookupTable>::New();
 table->SetRange(0, 2000); // image intensity range
 table->SetValueRange(0.0, 1.0); // from black to 
 white
 table->SetSaturationRange(0.0, 0.0); // no color 
 saturation
 table->SetRampToLinear();
  table->Build();

 // Map the image through the lookup table
 vtkSmartPointer<vtkImageMapToColors> color = 
  vtkSmartPointer<vtkImageMapToColors>::New();
  color->SetLookupTable(table);
  color->SetInputConnection(imageReslice- 
 >GetOutputPort());

 vtkSmartPointer<vtkImageViewer2> viewier = 
 vtkSmartPointer<vtkImageViewer2>::New();
 viewier->SetInputData(color->GetOutput()); 
 viewier->SetRenderWindow(m_renderWindow); 
 viewier->SetupInteractor(m_renderWindow- 
 >GetInteractor());
 viewier->Render();
  return 0;
 }

看来我不太了解这个管道。 那么,有没有人知道如何正确地做到这一点?

1 个答案:

答案 0 :(得分:0)

在使用color->GetOutput()之前,您必须至少更新一次管道。 VTk使用需求驱动的管道,并且只会更新必要的零件。 因此,在创建视图之前,请尝试color->update()。如果不更新,则ImageMapToColors过滤器的输出为空。