[Insight-developers] Patch for some filters that don't propagate
direction cosines
Peter Cech
pcech at vision.ee.ethz.ch
Tue Sep 12 13:10:30 EDT 2006
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
-------------- next part --------------
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