[Insight-users] Trouble reading and writing vector images

Luis Ibanez luis.ibanez at kitware.com
Tue Feb 23 17:48:10 EST 2010


Hi Alberto,

Thanks for the clarifications.

I would suggest that you use one of the following two
image file format:

         A) MetaImage (extension .mhd)

         B) VTK (extension .vtk)


Both of them will be easy to read in many applications,
both based on ITK and VTK.

Both of these file formats support multiple components
per pixel.

Note however, that if the image orientation is important
for your application, then you should find safer to use
MetaImage.


         Regards,


                Luis


--------------------------------------------------------------------
On Tue, Feb 23, 2010 at 4:39 AM, Gomez Herrero, Alberto
<alberto.gomez at kcl.ac.uk> wrote:
> Hello,
>
> Thanks for your reply.  I'll try to answer point by point:
>
> 1) What file format are you using for saving the vector image ?
>
> I am saving the images into gipl files. Actually I just do writer->SetFileName("myFile.gipl"); this is probably not the best for vector images... is there any particular format which is more suitable for this?
> 2) You email asks about itk::VectorImage, but the typedef
>    that you show actually uses:
>
>                   pixeltype = itk::Vector
>
>     are you actually using the itk::VectorImage in your code ?
>
> Indeed, I am not using the itk::VectorImage. I am using PixelType = itk::Vector, as adviced in the User Guide. I mentiones the itk::VectorImage because I thought that my problem might be solved if I used that class instead... but I am not using it at all.
>
> 3) That is great, the behaviour B) Is what I want.
>
> Thank you,
>
> Alberto
>
>
>
> Alberto Gomez
>
> Division of Imaging Sciences
> The Rayne Institute
> 4th Floor, Lambeth Wing
> St Thomas' Hospital
> London SE1 7EH
>
> email: alberto.gomez at kcl.ac.uk
> ________________________________________
> From: Luis Ibanez [luis.ibanez at kitware.com]
> Sent: 22 February 2010 23:32
> To: Gomez Herrero, Alberto
> Cc: Insight Users Mailing List
> Subject: Re: [Insight-users] Trouble reading and writing vector images
>
> Hi Alberto,
>
>
> 1) What file format are you using for saving the vector image ?
>
>
> 2) You email asks about itk::VectorImage, but the typedef
>    that you show actually uses:
>
>                   pixeltype = itk::Vector
>
>     are you actually using the itk::VectorImage in your code ?
>
> 3) The memory organization of
>
>               itk::VectorImage< float, N >                         (A)
>
>     will be different from the memory organization of
>
>               itk::Image<  itk::Vector< float, N > ,  N >     (B)
>
> In the case of (A) you will have first all the values of the
> first vector component of all the pixels, followed by the
> values of all the second components of all the pixels,
> followed by the third component of all the pixels... etc.
>
> In the case of (B), you have first the N components of
> the first pixel, followed by the N components of the second
> pixel, followed by the N components of the third pixel...etc.
>
>
> Please clarify what code you are using, and what file format.
>
>
>        Thanks
>
>
>                Luis
>
>
>
> -----------------------------------
> On Mon, Feb 22, 2010 at 12:16 PM, Gomez, Alberto
> <alberto.gomez at kcl.ac.uk> wrote:
>> Hi all,
>>
>> I am having some unexpected results when reading and writing vector images.
>> The example would be the following. I have a vector image called
>> "fullVectors_resampled". I give a value to every pixel and then write it to
>> a file. Then I load it and the values have changed!!!
>>
>>
>>       VectorImageType::IndexType index;
>>       VectorImageType::PixelType vector;
>>       vector[0] = 1;
>>       vector[1] = 2;
>>       vector[2]= 3;
>>
>>       for (int i = 0;
>> i<fullVectors_resampled->GetLargestPossibleRegion().GetSize()[0]; i++ ){
>>           index[0] = i;
>>           for (int j = 0;
>> j<fullVectors_resampled->GetLargestPossibleRegion().GetSize()[1]; j++ ){
>>               index[1]=j;
>>               for (int k = 0;
>> k<fullVectors_resampled->GetLargestPossibleRegion().GetSize()[2]; k++ ){
>>                   index[2]=k;
>>
>>                   fullVectors_resampled->SetPixel(index, vector);
>>
>>               }
>>
>>           }
>>      }
>>
>>
>>       WriterVectorType::Pointer writer = WriterVectorType::New();
>>       writer->SetFileName(filename);
>>       writer->SetInput(fullVectors_resampled);
>>       writer->Write();
>>
>>
>>       ReaderVectorType::Pointer reader2 = ReaderVectorType::New();
>>       reader2->SetFileName(filename);
>>       reader2->Update();
>>       VectorImageType::Pointer image1g2 = reader2->GetOutput();
>>
>>
>>       for (int i = 0;
>> i<fullVectors_resampled->GetLargestPossibleRegion().GetSize()[0]; i++ ){
>>                   index[0] = i;
>>                   for (int j = 0;
>> j<fullVectors_resampled->GetLargestPossibleRegion().GetSize()[1]; j++ ){
>>                       index[1]=j;
>>                       for (int k = 0;
>> k<fullVectors_resampled->GetLargestPossibleRegion().GetSize()[2]; k++ ){
>>                           index[2]=k;
>>
>>                           std::cout <<
>> fullVectors_resampled->GetPixel(index) << "    "
>>                                << image1g2->GetPixel(index) << std::endl;
>>
>>                           fullVectors_resampled->SetPixel(index, vector);
>>
>>                       }
>>
>>                   }
>>           }
>>
>> As I am reading the image that I just wrote, I would expect that the vectors
>> are the same... but the output I get is:
>>
>> [1, 2, 3]    [1, 1, 1]
>> [1, 2, 3]    [2, 2, 2]
>> [1, 2, 3]    [3, 3, 3]
>> [1, 2, 3]    [1, 1, 1]
>> [1, 2, 3]    [2, 2, 2]
>> [1, 2, 3]    [3, 3, 3]
>> ...
>> ...
>> ...
>> ...
>> [1, 2, 3]    [1, 1, 1]
>> [1, 2, 3]    [2, 2, 2]
>> [1, 2, 3]    [3, 3, 3]
>>
>> I think this has to do with how memory is organised in these images. I am
>> using the following definition for my VectorImageType:
>>
>> typedef itk::Vector<float, 3> VectorPixelType;
>> typedef itk::Image<VectorPixelType, 3> VectorImageType;
>>
>> And from the itkVectorImage documentation,
>>
>> "This class differs from Image
>> <http://www.itk.org/Doxygen316/html/classitk_1_1Image.html> in that it is
>> intended to represent multiple images. Each pixel represents /k/
>> measurements, each of datatype /TPixel/. The memory organization of the
>> resulting image is as follows: ... Pi0 Pi1 Pi2 Pi3 P(i+1)0 P(i+1)1 P(i+1)2
>> P(i+1)3 P(i+2)0 ... where Pi0 represents the 0th measurement of the pixel at
>> index i."
>>
>> Does this mean that my VectorImageType is organised Pi0 P(i+1)0 ... P(i)1
>> P(i+1)1...P(i)2 P(i+1)2... etc? Anyone has already experienced this? Is this
>> supposed to work this way?
>>
>>
>>
>>
>> --
>>
>> Alberto Gómez
>>
>> /Division of Imaging Sciences
>> The Rayne Institute
>> 4th Floor, Lambeth Wing
>> St Thomas' Hospital
>> London SE1 7EH /
>>
>> phone: +44 (0) 20 718 88364
>> email: alberto.gomez at kcl.ac.uk <mailto:alberto.gomez at kcl.ac.uk>
>>
>> _____________________________________
>> 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
>>
>


More information about the Insight-users mailing list