[Insight-users] creating a volume from separate slices

Luis Ibanez luis . ibanez at kitware . com
Mon, 10 Nov 2003 22:08:22 -0500


Hi Lucas,

The DICOMImageIO class will only read
DICOM files, not write them.

About the number of slices.  You could
easily verify the reading by doing:

A) In your code, call Update in the reader
    and print out the details of the image.

    something like:

    reader->Update();
    reader->GetOutput()->Print( std::cout );

or


B) Saving your image as a MetaImage,
    simply provide the writer with a filename
    with extension ".mhd".

    The MetaImage header will show you how
    many pixels your dataset has along each
    dimension.


Please let us know what you find.


Thanks,


   Luis


---------------------
Lucas Lorenzo wrote:
> Thanks a lot Mr. Johnson,
> 
> now I'm able to read all the slices. To  check it I'm writing the  
> volume to a vtk file and there's something I can't understand: I have  
> 136 slices (files I.001 to I.136) but when I read the vtk file header  
> it says that the volume has 137 slabs.
> I'm also trying to write this volume as a dicom file but I'm having  
> this problem:
> 
>     itk::ERROR: ImageFileWriter(0x26a6f0): No ImageIO set, or none 
> could  be created.
> 
> By the way, I'm inserting both types into the IO factory at the  
> beginning of my program:
> 
>       static bool firstTime = true;
>       if(firstTime)
>         {
>            
>     itk::ObjectFactoryBase::RegisterFactory(itk::GE5ImageIOFactory::New()  
> );
>                
> itk::ObjectFactoryBase::RegisterFactory(itk::DICOMImageIO2Factory::New() );
>              firstTime = false;
>         }
> 
> Regards,
> 
> Lucas
> 
> On Thursday, November 6, 2003, at 07:14 PM, Hans Johnson wrote:
> 
>> Lucas,
>>
>> The IO factory mechanism does not have support for the GE4x or GE5x
>> files by default.  This was a decision made since very few people  needed
>> this support.  You will need to call the RegisterOnce() call once at  the
>> beging of your main function to insert this filetype into the IO  factory
>> list of known file types (see the Testing/Code/IO/*GE*.cxx file for the
>> exact syntax).
>>
>> Since ITK has no concept of image orientation
>> (Coronal/Sagittal/Transverse) this information was not originally taken
>> into account.  You're current program will output Analyze images with a
>> transverse coding no matter what the actual orientation was in the GE
>> image.    I am happy to announce that we are currently working very  hard
>> to remedy this situation in a manner that will be useful across most
>> image types that have an orientation specification.
>>
>> In addition, you will not need to use the ImageSeriesFilter as the GE
>> filter implementations reads through all the files in the directory and
>> choose the ones that belong in the volume based on scan
>> characteristics.  For example if you have a scan sequence where PD and
>> T2 images are acquired simultaneously as interleaved slices, then
>> choosing I.001(or any odd numbered slice) will read all the odd images
>> and produce the PD volume, and choosing I.002 (or any even numbered
>> slice) will read all the even images and produce the T2 image volume.
>>
>> Regards,
>> Hans J. Johnson
>>
>> PS:  the pixel type is unsigned short int (16 bits).
>>
>>
>>
>> Lucas Lorenzo wrote:
>>
>>> Thanks Josh,
>>>
>>> I'm using the ImageSeriesReader.
>>> The files are GE 5x (as far as I know the pixel type is unsigned int  
>>> 16 bit) so my understanding is that the IO factory mechanism should  
>>> make it transparent for me the reading process. What I'd like to do  
>>> is to generate the volume in Analyze format. I checked the generated  
>>> list of file names and it's ok.
>>> So, this is the code:
>>>
>>> / #include "itkNumericSeriesFileNames.h"
>>> #include "itkImageSeriesReader.h"
>>> #include "itkImageFileWriter.h"
>>> #include "itkImage.h"
>>> #include "itkAnalyzeImageIO.h"
>>> #include <iostream>
>>>
>>> int main(int argc, char * argv[])
>>> {
>>>
>>> typedef itk::Image<unsigned int,3> Image3DType;
>>>
>>>
>>> typedef itk::AnalyzeImageIO ImageIOType;
>>>
>>> ImageIOType::Pointer analyzeIO = ImageIOType::New();
>>>
>>> //
>>> // Here we generate filenames: I.001 I.002 ------ I.136
>>> itk::NumericSeriesFileNames::Pointer fileIter =  
>>> itk::NumericSeriesFileNames::New();
>>> fileIter->SetStartIndex( 1 );
>>> fileIter->SetEndIndex( 136 );
>>> fileIter->SetIncrementIndex( 1 );
>>> fileIter->SetSeriesFormat("I.%03d");
>>>
>>> itk::ImageSeriesReader<Image3DType>::Pointer reader =  
>>> itk::ImageSeriesReader<Image3DType>::New();
>>> reader->SetFileNames( fileIter->GetFileNames() );
>>>
>>>
>>> try
>>> {
>>> reader->Update();
>>> }
>>> catch( itk::ExceptionObject & err )
>>> {
>>> std::cout << "ExceptionObject caught !" << std::endl;
>>> std::cout << err << std::endl;
>>> return -1;
>>> }
>>>
>>>
>>> itk::ImageFileWriter< Image3DType >::Pointer writer =  
>>> itk::ImageFileWriter< Image3DType >::New();
>>> writer->SetInput( reader->GetOutput() );
>>> writer->SetFileName("test");
>>> writer->SetImageIO(analyzeIO);
>>>
>>> try
>>> {
>>> writer->Update();
>>> }
>>> catch( itk::ExceptionObject & err )
>>> {
>>> std::cout << "ExceptionObject caught !" << std::endl;
>>> std::cout << err << std::endl;
>>> return -1;
>>> }
>>> return 0;
>>> }
>>> /
>>> but when doing the "reader->Update()" I have a run time error:
>>>
>>> / ExceptionObject caught !
>>>
>>> itk::ExceptionObject (0x225c90)
>>> Location: "Unknown"
>>> File: /usr/local/include/InsightToolkit/IO/itkImageFileReader.txx
>>> Line: 101
>>> Description: Could not create IO object for file I.002/
>>>
>>> So, it seems to be that it is reading the first file in the list  
>>> ("I.001") but it can't read the second.
>>> Could anyone help me with this ?
>>> Thanks
>>>
>>> Lucas
>>>
>>>
>>> On Thursday, November 6, 2003, at 11:07 AM, Joshua Cates wrote:
>>>
>>>     Hi Lucas,
>>>
>>>     To read slices into a volume, you can either create a
>>>     MetaImageHeader for
>>>     it with the MetaImageImporter application, or use the
>>>     itk::ImageSeriesReader.
>>>
>>>     (if these are raw files, another trick is to 'cat' them into to a
>>>     single
>>>     file)
>>>
>>>     Josh.
>>>     ______________________________
>>>     Josh Cates
>>>     Scientific Computing and Imaging Institute
>>>     University of Utah
>>>     Email: cates at sci . utah . edu
>>>     Phone: (801) 587-7697
>>>     URL: http://www . sci . utah . edu/~cates
>>>
>>>
>>>     On Thu, 6 Nov 2003, Lucas Lorenzo wrote:
>>>
>>>         Hi,
>>>
>>>         I have many slices (from a volume) stored in separate files.
>>>         How can I create the volume to save it to a file?
>>>         Thanks
>>>
>>>         Lucas Lorenzo
>>>
>>>         University of Utah
>>>         Nora Eccles Harrison CardioVascular Research and Training
>>>         Institute
>>>         Fellows Room
>>>         95 South 2000 East
>>>         Salt Lake City, UT 84112-5000
>>>
>>>         e-mail: lucas at cvrti . utah . edu
>>>         telephone: 801-587-9536
>>>
>>>         _______________________________________________
>>>         Insight-users mailing list
>>>         Insight-users at itk . org
>>>         http://www . itk . org/mailman/listinfo/insight-users
>>>
>>>
>>>
>>> Lucas Lorenzo
>>>
>>> University of Utah
>>> Nora Eccles Harrison CardioVascular Research and Training Institute
>>> Fellows Room
>>> 95 South 2000 East
>>> Salt Lake City, UT 84112-5000
>>>
>>> e-mail: lucas at cvrti . utah . edu
>>> telephone: 801-587-9536
>>>
>>
>>
>>
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users at itk . org
>> http://www . itk . org/mailman/listinfo/insight-users
>>
> Lucas Lorenzo
> 
> University of Utah
> Nora Eccles Harrison CardioVascular Research and Training Institute
> Fellows Room
> 95 South 2000 East
> Salt Lake City, UT 84112-5000
> 
> e-mail:  lucas at cvrti . utah . edu
> telephone: 801-587-9536
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk . org
> http://www . itk . org/mailman/listinfo/insight-users
>