[Insight-developers] ImageBase->CopyInformation: Number
of components per pixel copied
Luis Ibanez
luis.ibanez at kitware.com
Sun Sep 30 19:12:16 EDT 2007
Hi Stephen,
There seem to be a bug in your code.
Both print outs are from the VectorImage.
Your second print out:
> std::cout << "Char # of comp = "
> << myVectorImage->GetNumberOfComponentsPerPixel( )
> << std::endl;
should probably be:
> std::cout << "Char # of comp = "
> << myCharImage->GetNumberOfComponentsPerPixel( )
> << std::endl;
Luis
-----------------------------
Stephen R. Aylward wrote:
> Hi,
>
> The code below illustrates the problem.
>
> That code does the following:
> 1) Creates a vector image, sets the number of components per pixel, and
> prints the number of components per pixel.
> 2) Creates a "normal" (non-vector) image, calls CopyInfo passing the
> vector image, and prints the number of components per pixel.
>
> The result is that the number of components per pixel of the
> itk::Image<char, 3> image is reported as 3.
>
> Should we document, only call SetNumberOfComponents in CopyInfo if the
> image is a vectorimage, or other?
>
> Thanks,
> Stephen
>
>
> #include "itkImage.h"
> #include "itkVectorImage.h"
>
> int main(int argc, char **argv)
> {
> // Create a vector image
> typedef itk::VectorImage< char, 3 > VectorImageType;
> VectorImageType::Pointer myVectorImage = VectorImageType::New();
> myVectorImage->SetNumberOfComponentsPerPixel( 3 );
>
> VectorImageType::SizeType size;
> size[0] = 25;
> size[1] = 25;
> size[2] = 25;
> myVectorImage->SetRegions( size );
>
> VectorImageType::SpacingType spacing;
> spacing[0] = 1;
> spacing[1] = 2;
> spacing[2] = 3;
> myVectorImage->SetSpacing(spacing);
>
> myVectorImage->Allocate();
>
> std::cout << "Vector # of comp = "
> << myVectorImage->GetNumberOfComponentsPerPixel( )
> << std::endl;
>
> // Create a char image and copy vector images's info
> typedef itk::Image< char, 3 > CharImageType;
> CharImageType::Pointer myCharImage = CharImageType::New();
> myCharImage->SetRegions( myVectorImage->GetLargestPossibleRegion() );
> myCharImage->CopyInformation( myVectorImage );
> myCharImage->Allocate();
>
> std::cout << "Char # of comp = "
> << myVectorImage->GetNumberOfComponentsPerPixel( )
> << std::endl;
> }
>
>
> Luis Ibanez wrote:
>
>>
>> Hi Stephen,
>>
>> That's a good point.
>>
>> Notice that yet nothing prevents you from changing the number of
>> components of the recipient image in the GenerateData() method
>> of your filter, before you fill in the content of the output
>> image.
>>
>> Note also, that in practice, the SetNumberOfComponentsPerPixel()
>> method only performs a real action when it is invoked in an
>> itkVectorImage. In any other case, ITK images have compile-time
>> defined number of components per pixel and the call is simply
>> ignored.
>>
>> Are you dealing with a filter that produces an itkVectorImage
>> as output ?
>>
>>
>> Luis
>>
>>
>>
>> --------------------------
>> Stephen R. Aylward wrote:
>>
>>> Hi,
>>>
>>> The CopyInformation function of ImageBase sets largestPossibleRegion,
>>> Spacing, Origin, Directions...all good.
>>>
>>> However, it also sets NumberOfComponentsPerPixel. Perhaps this is
>>> inappropriate since it is not necessary for the images to have the
>>> same pixel type for CopyInformation to work. Perhaps
>>> NumberOfComponentsPerPixel is conceptually a pixel-type-specific
>>> piece of information. Admittedly this is arguable, but consider a
>>> filter that has a vector image as input and outputs a scalar
>>> image...we cannot use the CopyInformation command.
>>>
>>> Of course, the point is perhaps moot given the need for backward
>>> compatibility...I cannot think of a backward-compatible solution
>>> beyond better documentation.
>>>
>>> Stephen
>>>
>>
>
More information about the Insight-developers
mailing list