[Insight-users] Slice order comes wrong when reading a DICOM files (one slice per file) to form a volume
Desikachari Nadadur
dnadadur at intio.us
Mon Jun 21 19:22:55 EDT 2010
Hi again,
Just to clarify: On FreeBSD, I could make the file ordering on the disk
to be same as the slice ordering, by copying the files one by one in
order to a different directory. However, that does not work on Debian
Linux because the ext2 file system maintain a hash for filename
ordering. This issue therefore is not really OS dependent but file
system dependent (UFS vs. ext2). I just want to use the DICOM tags for
getting correct slice ordering so that this file system dependency is
eliminated.
Thanks in advance for any suggestions you may have.
Desika
--
Desikachari Nadadur, PhD
INTIO, Inc.
Desikachari Nadadur wrote:
> Hi All,
>
> I searched the forum but I could not find any answer to my question.
> So, I am posting here.
>
> When reading a set of CT DICOM files (with one file per slice) to form
> a volume, the slice ordering comes out wrong for some datasets. This
> also seems system dependent. For example the same dataset works on
> FreeBSD 8.0 and fails on Debian (Stable) Linux. Here "fails" means
> wrong order of slices. Also, the ordering seems to coincide with the
> filename ordering on the disk in these failed cases. When I do "ls -f"
> on these systems, FreeBSD 8.0 shows all the files with disk ordering
> coinciding with volume's slice ordering. However, on Debian Linux, it
> is not the case. 99% of the time I am able to successfully read the
> datasets even if the file ordering on the disk is not the volume slice
> ordering. Looks like I am not using a much needed DICOM tag in getting
> the slice ordering correct. Here is the code segment where I call
> AddSeriesRestriction () to set the tags to base sorting upon while
> reading the series of files. There is no sorting based on
> InstanceNumber and I did not know how to implement it here. I am using
> ITK 3.14.0 with GDCM 2.0.12. Any suggestions to fix this problem
> would be appreciated.
>
> <CODE>
> ITKNamesGeneratorType :: Pointer nameGenerator =
> ITKNamesGeneratorType ::
> New();
>
> nameGenerator->SetUseSeriesDetails( true );
>
>
> // We want to add two more criteria for sorting
> filenames // *
> 0008|0021 Series
> Date
> // * 0020|0012 Acquisition
> Number
> // using the call to
> AddSeriesRestriction()
>
> //
>
> nameGenerator->AddSeriesRestriction( "0008|0021" ); // DA 1
> Series Date
> nameGenerator->AddSeriesRestriction( "0020|0012" ); // Acquisition
> Number
>
>
> nameGenerator->SetDirectory( filename
> );
>
>
> typedef std :: vector< std :: string >
> SeriesIdContainer; const
> SeriesIdContainer & seriesUID =
> nameGenerator->GetSeriesUIDs();
>
>
>
> std :: string
> seriesIdentifier;
>
> seriesIdentifier = seriesUID.begin()->c_str();
>
> typedef std :: vector< std :: string >
> FileNamesContainer;
> FileNamesContainer
> fileNames;
> fileNames = nameGenerator->GetFileNames( seriesIdentifier
> );
>
>
> class ITKSeriesReaderType :: Pointer itkReader =
> ITKSeriesReaderType :: New();
>
>
> itkReader->SetImageIO( itkGdcmImageIO
> );
>
>
> itkReader->SetFileNames( fileNames
> );
>
>
>
> itkReader->Update();
>
> </CODE>
>
> Thanks in advance,
> Desika
>
> --
> Desikachari Nadadur, PhD
> INTIO, Inc.
>
>
More information about the Insight-users
mailing list