[Insight-users] problem with orientation of dicom output from segmentation

Bill Lorensen bill.lorensen at gmail.com
Fri Nov 27 16:48:39 EST 2009


John,

Actually, Mathieu reported in response that updating to 3.16 may help.
Can you try this first?

Bill

On Fri, Nov 27, 2009 at 12:42 PM, John Drozd <john.drozd at gmail.com> wrote:
> Hi again,
>
> I was at home and I just figured out how to provide you this link to my data
> remotely,
> so I provide it now instead of on the weekend:
>
> Here is a link to my data (3D dicom volume):
>
> input volume for my ConnectedThresholdFilter code:
> http://www.apmaths.uwo.ca/~jdrozd/correctedsubject5.dcm
>
> output volume from my ConnectedThresholdFilter code:
> http://www.apmaths.uwo.ca/~jdrozd/outsubject5.dcm
>
> If you need my CMakeLists.txt file, just let me know.
>
> to run the code type:
> ./ConnectedThresholdImageFilter correctedsubject5.dcm outsubject5.dcm 103
> 142 95 17100 17300
> and here is my code below:
>
>
>
> Below is my uncommented code:
> /*
> to run type:
> ./ConnectedThresholdImageFilter correctedsubject5.dcm outsubject5.dcm 103
> 142 95 17100 17300
> */
> #if defined(_MSC_VER)
> #pragma warning ( disable : 4786 )
> #endif
> #ifdef __BORLANDC__
> #define ITK_LEAN_AND_MEAN
> #endif
> #include "itkConnectedThresholdImageFilter.h"
> #include "itkImage.h"
> #include "itkCastImageFilter.h"
> #include "itkCurvatureFlowImageFilter.h"
> #include "itkImageFileReader.h"
> #include "itkImageFileWriter.h"
> #include "itkGDCMImageIO.h"
> #include "itkVersion.h"
> #include "itkOrientedImage.h"
> #include "itkMinimumMaximumImageFilter.h"
> #include "itkGDCMImageIO.h"
> #include "itkGDCMSeriesFileNames.h"
> #include "itkNumericSeriesFileNames.h"
> #include "itkImageSeriesReader.h"
> #include "itkImageSeriesWriter.h"
> #include "itkResampleImageFilter.h"
> #include "itkShiftScaleImageFilter.h"
> #include "itkIdentityTransform.h"
> #include "itkLinearInterpolateImageFunction.h"
> #include <itksys/SystemTools.hxx>
> #include "gdcm/src/gdcmFile.h"
> #include "gdcm/src/gdcmUtil.h"
> #include <string>
> int main( int argc, char *argv[])
> {
>   if( argc < 7 )
>     {
>     std::cerr << "Missing Parameters " << std::endl;
>     std::cerr << "Usage: " << argv[0];
>     std::cerr << " inputImage  outputImage seedX seedY seedZ lowerThreshold
> upperThreshold" << std::endl;
>     return 1;
>     }
>   typedef   float           InternalPixelType;
>
>   const     unsigned int    Dimension = 3;
>   typedef itk::Image< InternalPixelType, Dimension >  InternalImageType;
>   typedef signed short OutputPixelType;
>   typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
>   typedef itk::Image< float, Dimension > OutputImageType2;
>   typedef itk::CastImageFilter< InternalImageType, OutputImageType >
>     CastingFilterType;
>   CastingFilterType::Pointer caster = CastingFilterType::New();
>
>   const    unsigned int    ImageDimension = 3;
>   typedef  signed short    PixelType;
>   typedef itk::Image< PixelType, ImageDimension >  FixedImageType;
>   typedef itk::Image< float, ImageDimension >  FloatImageType;
>   typedef  itk::ImageFileReader< FixedImageType > ReaderType;
>   typedef  itk::ImageFileWriter<  OutputImageType  > WriterType;
>   typedef  itk::ImageFileWriter<  FloatImageType  > WriterType2;
>   ReaderType::Pointer reader = ReaderType::New();
>   WriterType::Pointer writer = WriterType::New();
>   WriterType2::Pointer writer2 = WriterType2::New();
>   typedef itk::GDCMImageIO           ImageIOTypefixed;
>   ImageIOTypefixed::Pointer gdcmImageIOfixed = ImageIOTypefixed::New();
>   reader->SetImageIO( gdcmImageIOfixed );
>   typedef itk::GDCMImageIO           ImageIOTypefixed2;
>   ImageIOTypefixed2::Pointer gdcmImageIOfixed2 = ImageIOTypefixed2::New();
>   reader->SetFileName( argv[1] );
>   reader->Update();
>   typedef itk::CurvatureFlowImageFilter< InternalImageType,
> InternalImageType >
>     CurvatureFlowImageFilterType;
>
>   CurvatureFlowImageFilterType::Pointer smoothing =
>                          CurvatureFlowImageFilterType::New();
>   typedef itk::ConnectedThresholdImageFilter< InternalImageType,
>                                     InternalImageType > ConnectedFilterType;
>   ConnectedFilterType::Pointer connectedThreshold =
> ConnectedFilterType::New();
>   typedef signed short InputAPixelType;
>   typedef float OutputBPixelType;
>   typedef itk::Image< InputAPixelType, 3 > InputAImageType;
>   typedef itk::Image< OutputBPixelType, 3 > OutputBImageType;
>   typedef itk::CastImageFilter< InputAImageType, OutputBImageType >
> CastFilterType;
>   CastFilterType::Pointer castFilter = CastFilterType::New();
>   castFilter->SetInput( reader->GetOutput() );
>
>   connectedThreshold->SetInput( castFilter->GetOutput() );
>   caster->SetInput( connectedThreshold->GetOutput() );
>   smoothing->SetNumberOfIterations( 20 ); //was 5
>   smoothing->SetTimeStep( 0.125 );
>
>   const InternalPixelType lowerThreshold = atof( argv[6] );
>   const InternalPixelType upperThreshold = atof( argv[7] );
>
>   connectedThreshold->SetLower(  lowerThreshold  );
>   connectedThreshold->SetUpper(  upperThreshold  );
>
>   connectedThreshold->SetReplaceValue( 255 );
>   InternalImageType::IndexType  index;
>
>   index[0] = atoi( argv[3] );
>   index[1] = atoi( argv[4] );
>
>   //added
>   index[2] = atoi( argv[5] );
>   std::cout << index << std::endl;
>   // Software Guide : BeginCodeSnippet
>   connectedThreshold->SetSeed( index );
>
>   //obtain a 5 x 5 bounding region of seeds
>   int ii, jj, kk;
>   ii = index[0];
>   jj = index[1];
>   kk = index[2];
>   for (int i = ii; i < ii + 5; i++)
>     for (int j = jj; j < jj + 5; j++)
>       for (int k = kk; k < kk + 5; k++)
>     {
>
>       index[0] = i;
>       index[1] = j;
>       index[2] = k;
>       connectedThreshold->AddSeed( index );
>     }
>   for (int i = ii; i > ii - 5; i--)
>     for (int j = jj; j > jj - 5; j--)
>       for (int k = kk; k > kk - 5; k--)
>     {
>
>       index[0] = i;
>       index[1] = j;
>       index[2] = k;
>       connectedThreshold->AddSeed( index );
>     }
>   connectedThreshold->Print(std::cout,17100);
>
>   typedef itk::MetaDataDictionary DictionaryType;
>
>   DictionaryType inputdict = reader->GetMetaDataDictionary();
>
>   writer->SetMetaDataDictionary( inputdict );
>
>   writer->SetFileName( argv[2] );
>
>   writer->SetInput( caster->GetOutput() );
>   try
>     {
>     writer->Update();
>     }
>   catch( itk::ExceptionObject & excep )
>     {
>     std::cerr << "Exception caught !" << std::endl;
>     std::cerr << excep << std::endl;
>     }
>   return 0;
> On Fri, Nov 27, 2009 at 12:31 PM, John Drozd <john.drozd at gmail.com> wrote:
>>
>> Hi all,
>>
>> I originally have a dicom series of 2d slices which I had converted to a
>> 3D dicom volume for processing.
>> I'll try processing the dicom series and then write the output to a dicom
>> series of 2d slices, to see if I can circumvent this problem.
>> I'll let you know if this works?
>>
>> I'll provide a link to my data as well, but it probably won't be until the
>> weekend.
>>
>> Thanks,
>> john
>>
>> On Fri, Nov 27, 2009 at 12:23 PM, Mathieu Malaterre
>> <mathieu.malaterre at gmail.com> wrote:
>>>
>>> This is a post ITK 3.16 feature I am afraid:
>>>
>>> http://www.cmake.org/Bug/view.php?id=7748
>>>
>>> (0017626)
>>> Mathieu.Malaterre (developer)
>>> 2009-09-19 06:51
>>>
>>>        This will be post ITK 3.16.
>>>
>>> Thanks for the patch ! Sorry for being so long to fix it.
>>>
>>> On Fri, Nov 27, 2009 at 6:11 PM, Bill Lorensen <bill.lorensen at gmail.com>
>>> wrote:
>>> > John,
>>> >
>>> > 3.16 will not help. This looks like a bug for sure.
>>> >
>>> > Can you provide a link to a dataset that we can use to reproduce the
>>> > problem? We don't have much experience with 3D dicom files I'm afraid.
>>> >
>>> > Bill
>>> >
>>> > On Fri, Nov 27, 2009 at 11:59 AM, John Drozd <john.drozd at gmail.com>
>>> > wrote:
>>> >> Hi Bill,
>>> >>
>>> >> I am currently using the ITK 3.14 that is in the 3D Slicer 3.4
>>> >> directory Slicer3-lib/Insight
>>> >>
>>> >> If I upgrade to ITK 3.16, will this solve my problem?
>>> >>
>>> >> I downloaded ITK 3.16 and noticed using the diff command that
>>> >> itkGDCMIO.h has been modified from what it was in ITK 3.14.
>>> >>
>>> >> But when I ran diff on gdcmOrientation.cxx in both versions of ITK,
>>> >> diff showed no difference.
>>> >>
>>> >> John
>>> >>
>>> >> On Friday, November 27, 2009, Bill Lorensen <bill.lorensen at gmail.com>
>>> >> wrote:
>>> >>> John,
>>> >>>
>>> >>> What version of itk are you using? Are you using the gdcm 1.x that is
>>> >>> in the itk source tree or an external gdcm 2.x version?
>>> >>>
>>> >>> Bill
>>> >>>
>>> >>> On Thu, Nov 26, 2009 at 3:22 PM, John Drozd <john.drozd at gmail.com>
>>> >>> wrote:
>>> >>>> Hi Luis,
>>> >>>>
>>> >>>> I was getting a segmentation fault because I had forgotten to change
>>> >>>> the
>>> >>>> Dimension from 2 to 3 in DicomReadPrintTag.cxx.
>>> >>>>
>>> >>>> For the input image, I have:
>>> >>>> (0020|0037) Image Orientation (Patient) = 0.0\0.0\-1.0\0.0\1.0\0.0
>>> >>>>
>>> >>>> For the output image, I have:
>>> >>>> (0020|0037) Image Orientation (Patient) =
>>> >>>> 0.000000\0.000000\1.000000\0.000000\1.000000\0.000000
>>> >>>>
>>> >>>> There is a difference.  Since the program is changing the
>>> >>>> orientation when
>>> >>>> processed through the pipeline, is the best approach to manually
>>> >>>> change the
>>> >>>> orientation tag of the dictionary and then copy the revised
>>> >>>> dictionary to
>>> >>>> the output file?
>>> >>>>
>>> >>>> john
>>> >>>>
>>> >>>> Below are the full tags:
>>> >>>>
>>> >>>> [jdrozd at trumpet DicomImageReadPrintTags]$ ./DicomImageReadPrintTags
>>> >>>> correctedsubject5.dcm
>>> >>>> (0002|0000) Group Length =
>>> >>>> 214
>>> >>>> (0002|0001) File Meta Information Version =
>>> >>>> AAE=
>>> >>>> (0002|0002) Media Storage SOP Class UID =
>>> >>>> 1.2.840.10008.5.1.4.1.1.2
>>> >>>> (0002|0003) Media Storage SOP Instance UID =
>>> >>>> 1.2.826.0.1.3680043.2.1125.1.10607669833050788267094246636093811
>>> >>>> (0002|0010) Transfer Syntax UID =
>>> >>>> 1.2.840.10008.1.2.1
>>> >>>> (0002|0012) Implementation Class UID =
>>> >>>> 147.144.143.155
>>> >>>> (0002|0013) Implementation Version Name = ITK/GDCM
>>> >>>> 1.2.4
>>> >>>> (0002|0016) Source Application Entity Title =
>>> >>>> NOTSPECIFIED
>>> >>>> (0008|0008) Image Type =
>>> >>>> DERIVED\PRIMARY
>>> >>>> (0008|0012) Instance Creation Date =
>>> >>>> 20091029
>>> >>>> (0008|0013) Instance Creation Time =
>>> >>>> 135224
>>> >>>> (0008|0016) SOP Class UID =
>>> >>>> 1.2.840.10008.5.1.4.1.1.2
>>> >>>> (0008|0018) SOP Instance UID =
>>> >>>> 1.2.826.0.1.3680043.2.1125.1.10607669833050788267094246636093811
>>> >>>> (0008|0020) Study Date =
>>> >>>> 20081030
>>> >>>> (0008|0030) Study Time =
>>> >>>> 164348.940
>>> >>>> (0008|0050) Accession Number
>>> >>>> =
>>> >>>> (0008|0060) Modality =
>>> >>>> CT
>>> >>>> (0008|0064) Conversion Type =
>>> >>>> WSD
>>> >>>> (0008|0070) Manufacturer =
>>> >>>> Manifacturer
>>> >>>> (0008|0080) Institution Name = GDCM
>>> >>>> Hospital
>>> >>>> (0008|0090) Referring Physician's Name = Refering
>>> >>>> Phisician
>>> >>>> (0010|0010) Patient's Name = Patient
>>> >>>> 188858520
>>> >>>> (0010|0020) Patient ID =
>>> >>>> 1747233212
>>> >>>> (0010|0030) Patient's Birth Date =
>>> >>>> 19500101
>>> >>>> (0010|0040) Patient's Sex =
>>> >>>> M
>>> >>>> (0018|0088) Spacing Between Slices =
>>> >>>> 1.207500
>>> >>>> (0018|1164) Imager Pixel Spacing =
>>> >>>> 0.945750\0.945750
>>> >>>> (0020|000d) Study Instance UID =
>>> >>>> 1.2.826.0.1.3680043.2.1125.1.53653479342656887425609263146205769
>>> >>>> (0020|000e) Series Instance UID =
>>> >>>> 1.2.826.0.1.3680043.2.1125.1.47155241092896696198844159625679986
>>> >>>> (0020|0010) Study ID =
>>> >>>> 1533117581
>>> >>>> (0020|0011) Series Number =
>>> >>>> 2135500125
>>> >>>> (0020|0013) Instance Number =
>>> >>>> 165
>>> >>>> (0020|0020) Patient Orientation =
>>> >>>> L\P
>>> >>>> (0020|0032) Image Position (Patient) =
>>> >>>> 199.237496852874\0.0\0.0
>>> >>>> (0020|0037) Image Orientation (Patient) =
>>> >>>> 0.0\0.0\-1.0\0.0\1.0\0.0
>>> >>>> (0020|4000) Image Comments = NOT FOR CLINICAL
>>> >>>> USE
>>> >>>> (0028|0002) Samples per Pixel =
>>> >>>> 1
>>> >>>> (0028|0004) Photometric Interpretation =
>>> >>>> MONOCHROME2
>>> >>>> (0028|0008) Number of Frames =
>>> >>>> 166
>>> >>>> (0028|0010) Rows =
>>> >>>> 256
>>> >>>> (0028|0011) Columns =
>>> >>>> 256
>>> >>>> (0028|0030) Pixel Spacing =
>>> >>>> 0.945750\0.945750
>>> >>>> (0028|0034) Pixel Aspect Ratio =
>>> >>>> 1\1
>>> >>>> (0028|0100) Bits Allocated =
>>> >>>> 16
>>> >>>> (0028|0101) Bits Stored =
>>> >>>> 16
>>> >>>> (0028|0102) High Bit =
>>> >>>> 15
>>> >>>> (0028|0103) Pixel Representation =
>>> >>>> 0
>>> >>>> (0028|1052) Rescale Intercept =
>>> >>>> 0.0
>>> >>>> (0028|1053) Rescale Slope =
>>> >>>> 1.0
>>> >>>> (0028|1054) Rescale Type =
>>> >>>> US
>>> >>>> (7fe0|0000) Group Length =
>>> >>>> 21757964
>>> >>>> Patient's Name (0010|0010)  is: Patient
>>> >>>> 188858520
>>> >>>> Performing Physician's Name (0008|1050): (No Value Found in
>>> >>>> File)
>>> >>>> PixelType:
>>> >>>> scalar
>>> >>>> Component Type: unsigned_short
>>> >>>>
>>> >>>> [jdrozd at trumpet DicomImageReadPrintTags]$ ./DicomImageReadPrintTags
>>> >>>> outsubject5.dcm
>>> >>>> (0002|0000) Group Length =
>>> >>>> 194
>>> >>>> (0002|00
>>> >>
>>> > _____________________________________
>>> > 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