2015-05-17 4 views
0

Я пытаюсь выполнить итерацию по всем пикселям в файле dicom. На данный момент я использую демо-версию:Vtk read dicom file

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

- вот способ получить пиксельный массив из объекта-читателя?

ответ

3

vtkImageViewer2 имеет метод GetIntput(), который возвращает экземпляр vtkImageData. Я предполагаю, что этот метод следует использовать после вызова imageViewer->Render().

Из этого ImageData вы можете получить каждый компонент изображения. Вам необходимо настроить тип возвращаемого компонента на imageData->GetScalarPointer(x,y,z); используя imageData->GetScalarType() и imageData->GetNumberOfScalarComponents().

Взгляните на этот exemple

+1

Я не могу найти GetOutput) 'функцию' vtkImageViewer2' –

+0

'(кажется' vtkImageViewer2' не имеет GetOutput() '' метод ... –

+0

Спасибо, я изменил ответ изменить имя метода , – Marcassin

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^