Hi Matt,

Thanks for your comments on this. 

I agree that there should be no changes to itk::ImageSeriesReader. I am too 
used to VTK thinking.

Your proposal to check the componentType using imageIO for each 2D dicom slice 
should be working. Here is what I think, instead of store all the componentType 
in a vector variable SliceNativeScalarTypes, use min and max to track the 
intensity range, then after go through all the slices, use the min and max to 
determine the suitable OutputScalarType for the volume. Pseudocode:

for( const_iterator fileNamesIt = this->FileNames.begin; fileNamesIt !=
this->FileNames.end(); ++fileNamesIt)
  {
  imageIO->SetFileName( *fileNamesIt );
  imageIO->ReadImageInformation();
  if (imageIO->GetComponentType() == itk::ImageIOBase::UCHAR)
    {
    min = std::numeric_limits<uint8_t>::min() < min ? 
std::numeric_limits<uint8_t>::min() : min;
    max = std::numeric_limits<uint8_t>::min() > max ? 
std::numeric_limits<uint8_t>::max() : max;
    }  
  if (imageIO->GetComponentType() == itk::ImageIOBase:: CHAR) // check all 
other types
    {
    min = ...
    max = ...
    }
        ...
  }

if (this->UserNativeScalarType)
  {  
  if( max <= std::numeric_limits<int8_t>::max() && min >= 
std::numeric_limits<int8_t>::min() )
    {
    this->SetOutputScalarType(VTK_CHAR)
    }
  if ()  // ... do the check for all other types
    {
    this->SetOutputScalarType(VTK_UNSIGNED_CHAR)
        }
        ...
  }

Thanks,

Kevin


-----Original Message-----
From: Matt McCormick [mailto:[email protected]] 
Sent: Friday, September 13, 2013 2:34 PM
To: Wang, Kevin
Cc: Slicer devel ([email protected]); [email protected]
Subject: Re: [slicer-devel] bug in vtkITKArchetypeImageSeriesReader and 
possible improvement in slicer and ITK

Hi Kevin,

Thanks for proposing your patch and mentioning it on the list.  Your patches 
are always welcome.  Instructions for submitting a patch can be found here:

  
http://insightsoftwareconsortium.github.io/ITKBarCamp-doc/CommunitySoftwareProcess/SubmitAPatchToGerrit/index.html

As I understand the problem, (which may be incorrect), a change should not be 
necessary on itk::ImageSeriesReader.  itk::ImageFileReader and 
itk::ImageSeriesReader are template based, and the output pixel type is 
determined by the pixel type of the output image template parameter, so an 
OutputImagePixelScalarType does not apply to itk::ImageSeriesReader.

In vtkITKArchetypeImageSeriesReader.cxx, after determining the correct imageIO 
in ::ExecuteInformation(), around line 720, would gathering an array of 
NativeScalarTypes to expose to the user of vtkITKArchetypeImageSeriesReader 
generate the functionality that is desired?  Pseudocode:

  this->SliceNativeScalarTypes.resize( this->FileNames.size() );
  for( const_iterator fileNamesIt = this->FileNames.begin(), iterator 
scalarTypesIt = this->SliceNativeScalarTypes.begin(); fileNamesIt !=
this->FileNames.end(); ++fileNamesIt, ++scalarTypesIt )
  {
  imageIO->SetFileName( *fileNamesIt );
  imageIO->ReadImageInformation();
  *scalarTypesIt = imageIO->GetComponentType();
  }

Thanks,
Matt

On Fri, Sep 13, 2013 at 3:11 PM, Wang, Kevin <[email protected]> wrote:
> Hi slicer,
>
>
>
> I am developing a module in Slicer and I found a bug in 
> vtkITKArchetypeImageSeriesReader class. Here is the issue.
>
>
>
> Since dicom utilizes the concept of slope and intercept, the scalar 
> range for each 2D slice can be much different. However, in Slicer, the 
> scalar type is determined by checking the ComponentType returned by 
> GDCMImageIO which only tells the last slice ComponentType in 
> vtkITKArchetypeImageSeriesReader.cxx.
>
> I propose to change vtkITKArchetypeImageSeriesReader.cxx as well as 
> the itkImageSeriesReader class in ITK. The idea is that the scalar 
> range will be checked for each 2D slice in itkImageSeriesReader and 
> then a new variable OutputImagePixelScalarType will be set 
> accordingly, then in vtkITKArchetypeImageSeriesReader.cxx it will 
> check the OutputImagePixelScalarType from the itkImageSeriesReader to 
> correctly determine the scalar type.
>
>
>
> If you think this makes sense, I will create an ITK ticket and submit 
> a patch to ITK. The slicer patch has to wait until slicer start to use 
> the newly patched ITK. I have created a ticket for tracking this:
> http://na-mic.org/Mantis/view.php?id=3386
>
>
>
> Thanks,
>
>
>
> Kevin
>
>
> This e-mail may contain confidential and/or privileged information for 
> the sole use of the intended recipient.
> Any review or distribution by anyone other than the person for whom it 
> was originally intended is strictly prohibited.
> If you have received this e-mail in error, please contact the sender 
> and delete all copies.
> Opinions, conclusions or other information contained in this e-mail 
> may not be that of the organization.
>
> _______________________________________________
> slicer-devel mailing list
> [email protected]
> http://massmail.spl.harvard.edu/mailman/listinfo/slicer-devel
> To unsubscribe: send email to 
> [email protected]
> with unsubscribe as the subject
> http://www.slicer.org/slicerWiki/index.php/Documentation/Nightly/Devel
> opers/FAQ

This e-mail may contain confidential and/or privileged information for the sole 
use of the intended recipient. 
Any review or distribution by anyone other than the person for whom it was 
originally intended is strictly prohibited. 
If you have received this e-mail in error, please contact the sender and delete 
all copies. 
Opinions, conclusions or other information contained in this e-mail may not be 
that of the organization.

_______________________________________________
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://kitware.com/products/protraining.php

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-developers

Reply via email to