[Insight-users] Bad rescale slope/intercept with gdcm 2.0.15 via itkGDCMImageIO
Mathieu Malaterre
mathieu.malaterre at gmail.com
Fri Jul 23 13:22:27 EDT 2010
[We will be continuing on the GDCM2 mailing list]
Just FYI, I cannot reproduce that issue on linux/gdcm 2.0.15/ITK from CVS.
2cts
On Fri, Jul 23, 2010 at 10:56 AM, Jesús Spínola <jspinola at gmail.com> wrote:
> Hi,
> So far I was using gdcm 2.0.14 and I was able to read any image with no
> problem, but I upgraded recently to gdcm 2.0.15 and I found a problem
> reading some CT and MR DICOM image files.
> The way I'm reading DICOM files is using itkGDCMImageIO with
> itkImageSeriesReader and then filtering the output to vtk for the image
> rendering.
> The problem is that some images are now (gdcm 2.0.15) loaded with a
> different scalar range than before (gdcm 2.0.14), hence they are not
> displayed properly with the default window/level setting (almost completely
> white in most CT cases for instance). I observed that the images with
> trouble were those containing rescale intercept/slope tags with some value.
> The images with no rescale intercept/slope present are displayed as
> expected, so my guess is there is some problem regarding the intercept/slope
> rescale computation.
> I've written a little program which reads a DICOM image and renders it with
> vtk to reproduce the bug. Then I compiled it against gdcm 2.0.14 and 2.0.15
> to see the differences between each other. The source code is at the end of
> this e-mail.
> I've been testing with some DICOM images
> from http://www.creatis.insa-lyon.fr/~jpr/PUBLIC/gdcm/gdcmData.tar.gz. Some
> of these test images are valid to reproduce the problem, in this case I'll
> show you the results with
> MR-MONO2-12-shoulder.dcm, CT-SIEMENS-Icone-With-PaletteColor.dcm
> and 05119865-mr-siemens-avanto-syngo.dcm.
> In the following table I show some of the relevant information of each image
> and the scalar range I get building the program against gdcm 2.0.14 and
> 2.0.15. The right scalar range is the one obtained with gdcm 2.0.14. The
> result is specially bad with the MR-MONO2-12-shoulder.dcm image.
> File WW,WL Bits Allocated/Stored Rescale Slope/Intercept Scalar Range:
> 2.0.14 Build 2.0.15 Build
> MR-MONO2-12-shoulder.dcm 2000,1000 16/12 3.774114, 0.000061 0..2245
> -32065..32556
> CT-SIEMENS-Icone-With-PaletteColor.dcm 350,40 16/12 1, -1024 -1024..981
> 0..2005
> 05119865-mr-siemens-avanto-syngo.dcm 1538,98 16/12 2, -4096 -1186..526
> 1455..2311
>
> I tested with itk 3.18 and vtk 5.6, (the vtk version might not make any
> sense in the results because the problem is just in the reading stage).
> (Look at some screenshots of the results)
> //
> // SOURCE CODE
> //
> //
> // You'll need also itkImageToVTKImageFilter class, available in the
> InsightApplications package under "Auxiliary\vtk" folder
> //
> // Usage: main.exe DICOMFilename [WindowWidth WindowLevel]
> #include <vtkImageviewer2.h>
> #include <vtkRenderWindowInteractor.h>
> #include <vtkRenderWindow.h>
> #include <itkImage.h>
> #include <itkImageSeriesReader.h>
> #include <itkGDCMImageIO.h>
> #include "itkImageToVTKImageFilter.h" //Converts an ITK image into a VTK
> image and plugs a itk data pipeline to a VTK datapipeline.
> int main(int argc, char* argv[])
> {
> // Voxel type and image dimension
> typedef signed short int VoxelType;
> typedef VoxelType ItkPixelType;
> static const unsigned int VDimension = 3;
> // Itk Image type
> typedef itk::Image<ItkPixelType, VDimension> ItkImageType;
> typedef ItkImageType::Pointer ItkImageTypePointer;
>
> // Series reader
> typedef itk::ImageSeriesReader<ItkImageType> SeriesReaderType;
> typedef itk::GDCMImageIO ImageIOType;
> // itk2vtk filter
> typedef itk::ImageToVTKImageFilter<ItkImageType> ItkToVtkFilterType;
> /// DICOM Reader
> SeriesReaderType::Pointer m_seriesReader = SeriesReaderType::New();
> ImageIOType::Pointer m_gdcmIO = ImageIOType::New();
>
> m_seriesReader->SetImageIO(m_gdcmIO);
> ItkToVtkFilterType::Pointer m_itkToVtkFilter =
> ItkToVtkFilterType::New();
> // Check the number of parameters given
> if (argc >= 2)
> {
> // Create the renderer object and configure it
> vtkImageViewer2 *viewer = vtkImageViewer2::New();
> vtkRenderWindowInteractor *interactor =
> vtkRenderWindowInteractor::New();
> viewer->SetupInteractor(interactor);
> // Set the first argument as the input filename to read
> // Atention: We don't check whether the file is valid or not
> m_seriesReader->SetFileName(argv[1]);
> m_itkToVtkFilter->SetInput(m_seriesReader->GetOutput());
> try
> {
> m_itkToVtkFilter->Update();
> }
> catch (itk::ExceptionObject & exception)
> {
> std::cerr << "Exception caught!" << exception.GetDescription()
> << std::endl;
> }
> // Show some information about the image
> m_itkToVtkFilter->GetOutput()->Print(std::cout);
> std::cerr << "** Scalar Range **" << std::endl;
> std::cerr << m_itkToVtkFilter->GetOutput()->GetScalarRange()[0] <<
> ".." << m_itkToVtkFilter->GetOutput()->GetScalarRange()[1] << std::endl;
> // Set the viewer input (DICOM File) and do the rendering stuff
> viewer->SetInput(m_itkToVtkFilter->GetOutput());
>
> // We can optionally set the window/level through the arguments
> if (argc >=4)
> {
> std::cout << "Applying given ww/wl: " << argv[2] << ", " <<
> argv[3] << std::endl;
> viewer->SetColorWindow(atof(argv[2]));
> viewer->SetColorLevel(atof(argv[3]));
> }
> else
> {
> std::cout << "Applying default ww/wl: 256, 128" << std::endl;
> viewer->SetColorWindow(256);
> viewer->SetColorLevel(128);
> }
>
> viewer->Render();
> interactor->Start();
> }
> else
> {
> std::cerr << "Usage: main.exe DICOMFilename [WindowWidth
> WindowLevel]" << std::endl;
> }
> return 0;
> }
> --
> Jesús Spínola
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>
--
Mathieu
More information about the Insight-users
mailing list