使用vtkImageReslice重新切片三维原始图像



我正试图从三维原始图像中获取二维切片,并在vtkImageViewer2上查看输出,但我得到了一个空白窗口。

恐怕我不能缩短这个代码,因为这个管道中的每一步都是必要的,如下所述:我遵循的榜样。

您还需要一个原始图像及其头文件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;
}

我似乎不完全理解这个管道。那么,有人知道如何正确地做到这一点吗?

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

最新更新