[Insight-developers] Patch for some filters that don't propagate
direction cosines
Kent Williams
kent at psychiatry.uiowa.edu
Tue Sep 12 13:36:30 EDT 2006
Thanks Peter. Will you eventually be checking this change into Insight
when the repository opens up, or should I?
Peter Cech wrote:
>On Tue, Sep 12, 2006 at 09:41:03 -0500, Kent Williams wrote:
>
>
>>Hans ran into an issue with itk::JoinSeriesImageFilter and
>>itk::ExtractImageFilter -- they did not propagate the direction cosines
>>from the input to the output.
>>
>>I have a feeling that this is also the case for a number of the other
>>filters -- we only notice that they don't set the output Directions when
>>we try to use them and they're always identity.
>>
>>I can write a simple template function that does the Direction Cosine
>>assignment between the input and output images, taking into account the
>>dimensionality of both -- that's what I do in-line with this patch.
>>Then it can be called from any filter.
>>
>>My question is where I would put this function:
>>
>>1. As a member function of itkImageBase?
>>2. As a free-standing template function in itkImageBase?
>>3. As a member function of itkImageToImageFilter.h
>>4. As a free-standing ""
>>
>>
>
>I would say 4 as it is unlikely to be used outside image filters and
>does not depend on any member of itkImageToImageFilter.
>
>
>
>>5. Something else?
>>
>>
>
>Namespace itk::ImageToImageFilterDetail
>http://www.itk.org/Doxygen/html/namespaceitk_1_1ImageToImageFilterDetail.html
>
>
>The following patch does not work:
>
>
>
>>Index: itkExtractImageFilter.txx
>>===================================================================
>>RCS file: /cvsroot/Insight/Insight/Code/BasicFilters/itkExtractImageFilter.txx,v
>>retrieving revision 1.21
>>diff -c -r1.21 itkExtractImageFilter.txx
>>*** itkExtractImageFilter.txx 27 Jan 2006 17:07:07 -0000 1.21
>>--- itkExtractImageFilter.txx 12 Sep 2006 14:40:32 -0000
>>***************
>>*** 200,205 ****
>>--- 200,228 ----
>> }
>> }
>>
>>+ //
>>+ // Copy the direction cosines from the input to the output.
>>+ // On extract the output is always smaller or equal dimension
>>+ // as the input
>>+ typedef typename InputImageType::DirectionType InputDirectionType;
>>+ typedef typename OutputImageType::DirectionType OutputDirectionType;
>>+ InputDirectionType inputDir = inputPtr->GetDirection();
>>+ OutputDirectionType outputDir = outputPtr->GetDirection();
>>+ unsigned inputdim = InputImageType::GetImageDimension();
>>+ unsigned outputdim = OutputImageType::GetImageDimension();
>>+
>>+ for(unsigned i = 0; i < inputdim; i++)
>>+ {
>>+ for(unsigned j = 0; j < inputdim; j++)
>>+ {
>>+ if(j < outputdim && i < outputdim)
>>+ {
>>+ outputDir[i][j] = inputDir[i][j];
>>+ }
>>+ }
>>+ }
>>+ outputPtr->SetDirection(outputDir);
>>
>>
>
>Call to outputPtr->SetDirection(...)
>
>
>
>>+
>> // set the spacing and origin
>> outputPtr->SetSpacing( outputSpacing );
>> outputPtr->SetDirection( outputDirection );
>>
>>
>
>Another call to outputPtr->SetDirection(...). It overwrites direction
>with stuff prepared in an if-else block just preceding the first lines
>of the patch.
>
>Anyway, this patch is computing output direction incorrectly - it
>ignores collapsed dimensions (or assumes the are always the last ones).
>The current code in CVS is buggy, but I think the attached patch fixes
>it.
>
>Regards,
>Peter Cech
>
>
>------------------------------------------------------------------------
>
>Index: itkExtractImageFilter.txx
>===================================================================
>RCS file: /cvsroot/Insight/Insight/Code/BasicFilters/itkExtractImageFilter.txx,v
>retrieving revision 1.21
>diff -u -3 -d -r1.21 itkExtractImageFilter.txx
>--- itkExtractImageFilter.txx 27 Jan 2006 17:07:07 -0000 1.21
>+++ itkExtractImageFilter.txx 12 Sep 2006 17:00:03 -0000
>@@ -190,10 +190,15 @@
> {
> outputSpacing[nonZeroCount] = inputSpacing[i];
> outputOrigin[nonZeroCount] = inputOrigin[i];
>+ int nonZeroCount2 = 0;
> for (unsigned int dim = 0; dim < OutputImageDimension; ++dim)
> {
>- outputDirection[nonZeroCount][dim] =
>- inputDirection[nonZeroCount][dim];
>+ if (m_ExtractionRegion.GetSize()[dim])
>+ {
>+ outputDirection[nonZeroCount][nonZeroCount2] =
>+ inputDirection[nonZeroCount][dim];
>+ ++nonZeroCount2;
>+ }
> }
> nonZeroCount++;
> }
>
>
More information about the Insight-developers
mailing list