[Insight-users] how to read images with unknown number of channels at build time ?

Gaetan Lehmann gaetan.lehmann at jouy.inra.fr
Mon Mar 6 14:45:26 EST 2006


Karthik, Kent, 

Thanks for your answer. I think VectorImage is what I need.
However I'm not sure to understand the problem of pixel organization. The 
reader with ImageVector as template argument does not work properly with all 
file types ?
Is there some doc about ImageVector ? There is nothing about it in the user 
guide :-/

Gaetan


On Friday 03 March 2006 23:41, Karthik Krishnan wrote:
> Just to clarify, its the up to you to choose a representation for the
> image (with run time variable number of channels) being read in.
>
> For instance given a diffusion weighted dataset such as (the header):
> ftp://itk.org/pub/namic/DTI/Data/dwi.nhdr, or its meta-image equivalent:
> ftp://itk.org/pub/namic/DTI/Data/xt_dwi.mhd,
>
> You could read such an image as a
> 1. 3D image with 31 channels -  itk::VectorImage< short, 3 >
> 2. 31 3D images   - 31 itk::Image< short, 3 >
> 3. 4D image with dims[3] = 31 - itk::Image< short, 4 >
>
> I assumed you wanted the first, which may not be the case.
>
> Remember that the organization of pixels in the file will affect what
> you read (assuming you were reading naively at one shot..)
>
> 1. Readers instantiated over images of kind 1 assume an order.. R G B R
> G B R G B ...
> 2. Readers instantiated over images of kind 2 and 3 assume ..     R R R
> ...G G G... B B B ..
>
> Of course, you could always do your IO tricks to reorganize memory
> locations..
>
> -karthik
>
> Kent Williams wrote:
> > It is better, on the whole, to know what you're reading and then
> > respond accordingly.
> >
> > Presently there is no itk::FileSniffer, as it were.
> > itk::ImageFileReader does try to load whatever path you ask it to and
> > do something reasonable with the data. But there are a couple of
> > 'gotchas' if you want to keep things completely general:
> >
> > 1. File formats where images of dimension > 3 are stored as
> > two-dimensional slices. Then, itk::ImageSeriesReader is the tool of
> > choice, instead of itk::ImageFileReader.
> > 2. Cases such as yours, where some attribute of the file on disk
> > affects how you will process it.
> >
> > The workaround is to use an itk:ImageFileReader instance to sneak a
> > look at the files attributes, before actually reading the image. Below
> > is a function that illustrates how to snoop around for information
> > about the file you're trying to load.  This feels to me like breaking
> > encapsulation, but there currently isn't any other way.
> > To get even more nefarious, you can call
> > itk::ImageIOBase::GetNameOfClass() to find out which file reader
> > claims to be able to read the file.  We use this in order to handle
> > DICOM images specially. Our application (which didn't originally use
> > ITK Image I/O) had the convention that when you give the name of a
> > slice of a DICOM file, then you want to read all the slices in the
> > containing directory that are members of the same DICOM series.
> >
> > int FileInfo(const std::string &path)
> > {
> >  typedef itk::Image<char,4> TestImageType; // pixel type doesn't
> > matter for current purpose
> >  typedef itk::ImageFileReader<TestImageType> TestFileReaderType; //
> > reader for testing a file
> >  TestFileReaderType::Pointer onefileReader = TestFileReaderType::New();
> >   onefileReader->SetFileName(path.c_str());
> >  try
> >    {
> >    onefileReader->GenerateOutputInformation();
> >    }
> >  catch(itk::ExceptionObject &excp)
> >    {
> >    return -1;
> >    }
> >    // grab the ImageIO instance for the reader
> >  itk::ImageIOBase *imageIO = onefileReader->GetImageIO();
> >    unsigned int NumberOfDimensions =  imageIO->GetNumberOfDimensions()
> > std::endl;
> >    unsigned dims[32];   // almost always no more than 4 dims, but ...
> >    unsigned origin[32];
> >    double spacing[32];
> >    std::vector<double> directions[32];
> >    for(unsigned i = 0; i < NumberOfDimensions && i < 32; i++)
> >      {
> >      dims[i] = imageIO->GetDimensions(i);
> >      origin[i] = imageIO->GetOrigin(i);
> >      spacing[i] = imageIO->GetSpacing(i);
> >      directions[i] = imageIO->GetDirection(i);
> >      }
> >   // PixelType is SCALAR, RGB, RGBA, VECTOR, COVARIANTVECTOR, POINT,
> > INDEX
> >   itk::ImageIOBase::PixelType pixelType = imageIO->GetPixelType();
> >   // IOComponentType is UCHAR, CHAR, USHORT, SHORT, UINT, INT, ULONG,
> > LONG, FLOAT, DOUBLE
> >   itk::ImageIOBase::IOComponentType componentType =
> > imageIO->GetIOComponentType();
> >    const std::type_info &typeinfo typeInfo =
> > imageIO->GetComponentTypeInfo();
> >    // NumberOfComponents is usually one, but for non-scalar pixel
> > types, it can be anything
> >   unsigned int NumberOfComponents = imageIO->GetNumberOfComponents();
> >   return 0;
> > }
> >
> > Gaetan Lehmann wrote:
> >> Hi,
> >>
> >> Is it possible to write code able to read an image with an unknown
> >> number of channels at build time, and to extract each channel in an
> >> individual image ?
> >> If yes, with which classes can it be done ?
> >>
> >> Thanks,
> >>
> >> Gaetan
> >>
> >>
> >> ------------------------------------------------------------------------
> >>
> >> _______________________________________________
> >> Insight-users mailing list
> >> Insight-users at itk.org
> >> http://www.itk.org/mailman/listinfo/insight-users
> >
> > _______________________________________________
> > Insight-users mailing list
> > Insight-users at itk.org
> > http://www.itk.org/mailman/listinfo/insight-users
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 191 bytes
Desc: not available
Url : http://public.kitware.com/pipermail/insight-users/attachments/20060306/65e07979/attachment.pgp


More information about the Insight-users mailing list