Vtk读取dicom文件



我正在尝试遍历dicom文件中的所有像素。现在我正在使用一个演示:

int main(int argc, char* argv[])
{
  std::string inputFilename = "MR000000";
//   Read all the DICOM files in the specified directory.
  vtkSmartPointer<vtkDICOMImageReader> reader =
    vtkSmartPointer<vtkDICOMImageReader>::New();
 reader->SetFileName(inputFilename.c_str());
reader->Update();
// Visualize
vtkSmartPointer<vtkImageViewer2> imageViewer =
vtkSmartPointer<vtkImageViewer2>::New();
imageViewer->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
imageViewer->SetupInteractor(renderWindowInteractor);
imageViewer->Render();
imageViewer->GetRenderer()->ResetCamera();
imageViewer->Render();
 renderWindowInteractor->Start();
return EXIT_SUCCESS;
}

是这里的一种方式来获得像素数组从阅读器对象?

vtkImageViewer2有一个返回vtkImageData实例的GetIntput()方法。我想这个方法应该在imageViewer->Render()调用之后使用。

从这个ImageData中,您可以检索图像的每个组件。您需要通过imageData->GetScalarPointer(x,y,z)调整返回组件的类型;使用imageData->GetScalarType ()imageData->GetNumberOfScalarComponents() .

看一下这个例子

vtkImageViewer2不是你想要的,vtkDICOMImageReader更适合:

这里有一些源代码应该会有所帮助(这是pcl点,但实际上是一样的):

vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
vtkSmartPointer<vtkImageData> sliceData = vtkSmartPointer<vtkImageData>::New();
reader->SetFileName(dicomFile.c_str());
reader->Update();
sliceData = reader->GetOutput();
int numberOfDims = sliceData->GetDataDimension();
int * dims = sliceData->GetDimensions();
double* spacingData = reader->GetDataSpacing();
for (int y = 0; y < dims[1]; y++)
        {
            for (int x = 0; x < dims[0]; x++)
            {
                pcl::PointXYZI tempPt = pcl::PointXYZI();
                tempPt.x = x * spacingData[0];
                tempPt.y = y * spacingData[1];
                tempPt.z = 0;
                double tempIntensity = sliceData->GetScalarComponentAsDouble(x, y, z, 0);
                if (!isinf(tempIntensity))
                {
                    tempPt.intensity = tempIntensity;
                }
                else
                {
                    tempPt.intensity = 0;
                }
                cloud->points.push_back(tempPt);
            }
        }

最新更新