[Insight-users] Filtering a tensor component accessed withNthElementImageAdaptor

Miller, James V (GE, Research) millerjv at crd.ge.com
Mon May 8 10:40:54 EDT 2006


That is what I feared.  ImageAdaptor::SetSpacing() merely delegates down to the adapted image. So somewhere in the base class, the ivar m_Spacing is being accessed directly.
 
Can you run another experiment for me?
 
Edit Insight/Code/Common/itkImageBase.txx.  On line 239, could you change the line from
 
   m_Spacing = imgData->m_Spacing;
 
to
 
  m_Spacing = imgData->GetSpacing();
 
and see if this fixes the issue with the output spacing of the component filter? (This will not affect the Print of the Adaptor).
 
If this works, then we'll need to patch ImageAdaptor so that spacing ivars in ImageAdaptor are kept up to date.  We'll also consider changing the itkImageBase::CopyInformation() to call GetSpacing()/GetOrigin() instead of accessing them directly.
 
Jim

-----Original Message-----
From: insight-users-bounces+millerjv=crd.ge.com at itk.org [mailto:insight-users-bounces+millerjv=crd.ge.com at itk.org]On Behalf Of Vicente Grau
Sent: Monday, May 08, 2006 5:39 AM
To: Jim Miller; insight-users at itk.org
Subject: Re: [Insight-users] Filtering a tensor component accessed withNthElementImageAdaptor


Jim,

thanks for your reply. I have attached the output of the Print() statement below. As you thought, the spacing stored by the adaptor seems to be [1,1,1].
I have also tried m_ImageAdaptor->SetSpacing( reader->GetOutput()->GetSpacing() ) as a workaround, but it doesn't seem to affect the stored spacing.

NthElementImageAdaptor (016AA350)
  RTTI typeinfo:   class itk::NthElementImageAdaptor<class itk::Image<class itk::SymmetricSecondRankTensor<double,3>,3>,double>
  Reference Count: 2
  Modified Time: 147
  Debug: Off
  Observers:
    none
  Source: (none)
  Source output index:  0
  Release Data: Off
  Data Released: False
  Global Release Data: Off
  PipelineMTime: 0
  UpdateMTime: 0
  LargestPossibleRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [0, 0, 0]
  BufferedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [20, 20, 20]
  RequestedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [20, 20, 20]
  Spacing: [1, 1, 1]
  Origin: [0, 0, 0]
  Direction:
1 0 0
0 1 0
0 0 1


On 05/05/06, Jim Miller < millerjv at gmail.com> wrote: 

Vicente, 

In your set of print statements, can you do a 

m_ImageAdaptor->Print(std::cout);

I'd like to see what the spacing is that gets printed here.  Perhaps the adaptor has a different spacing stored than the image it is adapting.  The call to GetSpacing() delegates to the adapted image.  But the call to Print() will print the ivar of the adaptor not the adapted image. 


Jim





On 5/5/06, Vicente Grau < vgrauc at googlemail.com> wrote:


Dear all,

I am writing a filter to calculate the gradient structure tensor. This involves calculating an NxN matrix for each voxel of the image, and then applying a gaussian filter to each one of the components of the matrix (i.e., taking one component of the matrix at every voxel to create a new image, and applying a gaussian filter on this new image). Based on HessianRecursiveGausianImageFilter, I am using NthElementImageAdaptor and three instances of RecursiveGaussianImageFilter to filter in the x, y and z directions. As I saw in previous submissions to the list, I defined the first of the gaussian filters to accept the adaptor as an input.
I have been getting errors in the results (basically, the filters behave as if the pixel spacing were always [1 1 1], though it's not), so I wrote this very simple piece of code to check that image spacing has the expected values. I have attached the code below. It works by reading a tensor image from a file, and applying a gaussian filter to the first component of the tensor (of course, I would have to define things as filter direction, sigma, etc., but here I just wanted to check the spacing). The input image is all zeros, though I don't think this matters in this case. With an input image with spacing [2 2 2], the program output is:

m_ImageAdaptor->GetSpacing(): [2, 2, 2]
m_ComponentFilter->GetOutput()->GetSpacing(): [1, 1, 1]

which is exactly the same error I got in my structure tensor calculation program. It seems that the output of the filter has a different spacing from the input, so when I attach a second filter to the output of the first one, the result is wrong. Could anybody tell me what I am doing wrong here? Thanks a lot,

Vicente

/**************************** Code follows ***********************/

#include "itkSymmetricSecondRankTensor.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkRecursiveGaussianImageFilter.h"
#include "itkNthElementImageAdaptor.h"



int main( int argc, char *argv[] )
{
    const     unsigned int        Dimension       = 3;
    typedef   double              InputPixelType;

    typedef itk::Image< itk::SymmetricSecondRankTensor< InputPixelType, Dimension > , Dimension > InputImageType;
    typedef itk::Image< InputPixelType, Dimension >   OutputImageType;
  
    typedef   itk::ImageFileReader< InputImageType >  ReaderType;
    ReaderType::Pointer   reader = ReaderType::New();  
   reader->SetFileName( argv[1] );

    typedef itk::NthElementImageAdaptor< InputImageType, InputPixelType >  OutputImageAdaptorType;
    OutputImageAdaptorType::Pointer  m_ImageAdaptor = OutputImageAdaptorType::New();  
    m_ImageAdaptor->SetImage( reader->GetOutput() );
    m_ImageAdaptor->Allocate();
    m_ImageAdaptor->SelectNthElement( 0 );

    typedef itk::RecursiveGaussianImageFilter< OutputImageAdaptorType, OutputImageType >    ComponentFilterType;
    ComponentFilterType::Pointer m_ComponentFilter  = ComponentFilterType::New();
    m_ComponentFilter->SetInput( m_ImageAdaptor );

    m_ComponentFilter->Update();

    std::cout << "m_ImageAdaptor->GetSpacing(): " << m_ImageAdaptor->GetSpacing() << std::endl;
    std::cout << "m_ComponentFilter->GetOutput()->GetSpacing(): " << 
                                        m_ComponentFilter->GetOutput()->GetSpacing() << std::endl;

  return EXIT_SUCCESS;
}






_______________________________________________
Insight-users mailing list
Insight-users@ <mailto:Insight-users at itk.org> itk.org
http://www. <http://www.itk.org/mailman/listinfo/insight-users> itk.org/mailman/listinfo/insight-users








-- 
Vicente Grau
Wolfson Medical Vision Laboratory
Department of Engineering Science
University of Oxford 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20060508/d1916eee/attachment.html


More information about the Insight-users mailing list