[Insight-developers] ImageBase->CopyInformation: Number
of components per pixel copied
Stephen R. Aylward
Stephen.Aylward at Kitware.com
Sun Sep 30 20:49:13 EDT 2007
Argh!
Thanks for your patience!
Stephen-the-I-cannot-get-hello-world-to-compile-guy :)
Luis Ibanez wrote:
>
> 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
>>>>
>>>
>>
>
--
=============================================================
Stephen R. Aylward, Ph.D.
Chief Medical Scientist
Kitware, Inc. - Chapel Hill Office
http://www.kitware.com
Phone: (518)371-3971 x300
More information about the Insight-developers
mailing list