[vtkusers] Creating a vtkImageData from scratch reading DICOM files with DCMTK

Mark Wyszomierski markww at gmail.com
Thu Aug 16 10:33:34 EDT 2007


Jesus, I always use DcmFileFormat and haven't had problems with it and
vtkImageData. I've never tried with DicomImage. I thought DicomImage
does window level / rescale slope/intercept transformations
automatically which is why I don't use it.

Anyway I think the DICOM object will give you the image data top to
bottom, but VTK works in cartesian coordinates, bottom to top. So you
probably have to setup a pixel loop to do the work of reading the
DICOM image backwards. I usually do something like:

DcmFileFormat dcm;
dcm.loadFile("C:\\test.dcm");
const unsigned short* p = NULL;
dcm.getDataset()->findAndGetUint16Array(DCM_PixelData, p);

// Then copy over each pixel value from p in a pixel loop but bottom
to top into your vtkImageData object.

Like I said I've been doing that for awhile without any problems, hope
that helps somewhat,

Mark





On 8/16/07, Jesús Spí­nola <jspinola at gmail.com> wrote:
> Hi vtkusers,
>
> I want to read some DICOM files into one vtkImageData. To read the pixel
> data from the DICOM files I want to use the DCMTK libraries. The
> vtkImageData object will contain several DICOM images so I want to load the
> pixel data into vtkImageData file by file.
>
> First I allocate the vtkImageData and then I load the files in a bucle from
> dcmtk (DicomImage class) to the vtkImageData object. The images are loaded
> correctly by dcmtk ( I dumped the images in a png file and they're ok ) but
> when I want to view the images with vtkImageViewer2 they are completely
> dark, so it seems no data is loaded at all. Following there's the code
> snippet I use to do that. I also tried to read the pixel data with
> DcmDataset::findAndGetUint16Array(DCM_PixelData,..) instead
> of DicomImage, but with no success.
>
> Has anyone any suggestions of what I'm probably missing or doing wrong?
>
> // first we allocate the data
> m_imageDataVTK = vtkImageData::New();
> m_imageDataVTK->SetOrigin( origin );
> m_imageDataVTK->SetSpacing( spacing );
> m_imageDataVTK->SetDimensions( rows, columns, slices );
> m_imageDataVTK->SetScalarTypeToUnsignedShort(); // the data
> will be 16 bit
> m_imageDataVTK->SetNumberOfScalarComponents(1);
> m_imageDataVTK->AllocateScalars();
>
> // now we load all the images
> int zSlice = 0;
>
>     foreach( Image *image, m_imageSet )
>     {
>         DicomImage *dicomImage = new DicomImage( qPrintable(
> image->getPath() ) ); // we load a new Image
>         if( dicomImage != NULL )
>         {
>             if( dicomImage->getStatus() == EIS_Normal )
>             {
>                 dicomImage->setMinMaxWindow();
>                 if( dicomImage->getOutputData(16) != NULL )
>                 {
>                     // we copy the data in the dcmtk buffer to the
> vtkImageData one
>                     memcpy((unsigned short
> *)m_imageDataVTK->GetScalarPointer(0,0,zSlice), (unsigned
> short *)dicomImage->getOutputData(16),
> dicomImage->getOutputDataSize() );
>                     dicomImage->deleteOutputData();
>                     m_imageDataVTK->Modified();
>                 }
>         }
>         zSlice++;
>     }
>
> Thanks in advance!
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
>



More information about the vtkusers mailing list