-1

I am trying to iterate through all pixels in dicom file. For now i am using a demo:

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;
}

is here a way to get pixels array from reader object?

rungus2
  • 327
  • 1
  • 5
  • 13

2 Answers2

3

vtkImageViewer2 has a GetIntput() method which returns a vtkImageData instance. I guess this method should be used after the imageViewer->Render() call.

From this ImageData you are able to retrieve each component of the image. You need to adapt the type of the returned component by imageData->GetScalarPointer(x,y,z) ; using imageData->GetScalarType () and imageData->GetNumberOfScalarComponents().

Take a look to this exemple

Marcassin
  • 1,386
  • 1
  • 11
  • 21
1

vtkImageViewer2 is not what you want, vtkDICOMImageReader is better suited:

Here is some source that should help (this goes to pcl points, but in effect its the same):

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);
            }
        }
Sneaky Polar Bear
  • 1,611
  • 2
  • 17
  • 29