Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

mitk::ExtractImageFilter Class Reference
[Process ClassesClasses related to InteractiveSegmentation]

Extracts a 2D slice from a 3D image. More...

#include <mitkExtractImageFilter.h>

Inheritance diagram for mitk::ExtractImageFilter:
Inheritance graph
[legend]
Collaboration diagram for mitk::ExtractImageFilter:
Collaboration graph
[legend]

List of all members.

Public Types

typedef ExtractImageFilter Self
typedef ImageToImageFilter Superclass
typedef itk::SmartPointer< SelfPointer
typedef itk::SmartPointer
< const Self
ConstPointer

Public Member Functions

virtual const char * GetClassName () const
virtual void SetSliceIndex (unsigned int _arg)
 Which slice to extract (first one has index 0).
virtual unsigned int GetSliceIndex () const
virtual void SetSliceDimension (unsigned int _arg)
 The orientation of the slice to be extracted.
virtual unsigned int GetSliceDimension () const
virtual void SetTimeStep (unsigned int _arg)
 Time step of the image to be extracted.
virtual unsigned int GetTimeStep () const

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 ExtractImageFilter ()
virtual ~ExtractImageFilter ()
virtual void GenerateOutputInformation ()
virtual void GenerateInputRequestedRegion ()
virtual void GenerateData ()
 A version of GenerateData() specific for image processing filters.
template<typename TPixel , unsigned int VImageDimension>
void ItkImageProcessing (itk::Image< TPixel, VImageDimension > *image)

Protected Attributes

unsigned int m_SliceIndex
unsigned int m_SliceDimension
unsigned int m_TimeStep

Detailed Description

Extracts a 2D slice from a 3D image.

See also:
SegTool2D
OverwriteSliceImageFilter

There is a separate page describing the general design of QmitkInteractiveSegmentation: QmitkInteractiveSegmentationTechnicalPage

This class takes a 3D mitk::Image as input and tries to extract one slice from it.

Two parameters determine which slice is extracted: the "slice dimension" is that one, which is constant for all points in the plane, e.g. transversal would mean 2. The "slice index" is the slice index in the image direction you specified with "affected dimension". Indices count from zero.

Output will not be set if there was a problem extracting the desired slice.

Last contributor: $Author$

Definition at line 50 of file mitkExtractImageFilter.h.


Member Typedef Documentation

typedef itk::SmartPointer<const Self> mitk::ExtractImageFilter::ConstPointer

Definition at line 54 of file mitkExtractImageFilter.h.

typedef itk::SmartPointer<Self> mitk::ExtractImageFilter::Pointer

Definition at line 54 of file mitkExtractImageFilter.h.

Definition at line 54 of file mitkExtractImageFilter.h.

Definition at line 54 of file mitkExtractImageFilter.h.


Constructor & Destructor Documentation

mitk::ExtractImageFilter::ExtractImageFilter (  ) [protected]

Definition at line 26 of file mitkExtractImageFilter.cpp.

mitk::ExtractImageFilter::~ExtractImageFilter (  ) [protected, virtual]

Definition at line 33 of file mitkExtractImageFilter.cpp.

{
}

Member Function Documentation

void mitk::ExtractImageFilter::GenerateData (  ) [protected, virtual]

A version of GenerateData() specific for image processing filters.

This implementation will split the processing across multiple threads. The buffer is allocated by this method. Then the BeforeThreadedGenerateData() method is called (if provided). Then, a series of threads are spawned each calling ThreadedGenerateData(). After all the threads have completed processing, the AfterThreadedGenerateData() method is called (if provided). If an image processing filter cannot be threaded, the filter should provide an implementation of GenerateData(). That implementation is responsible for allocating the output buffer. If a filter an be threaded, it should NOT provide a GenerateData() method but should provide a ThreadedGenerateData() instead.

See also:
ThreadedGenerateData()

Reimplemented from mitk::ImageSource.

Definition at line 37 of file mitkExtractImageFilter.cpp.

References AccessFixedDimensionByItk, mitk::PlaneGeometry::Frontal, mitk::BaseData::GetGeometry(), mitk::ImageToImageFilter::GetInput(), mitk::ImageSource::GetOutput(), ItkImageProcessing(), MITK_ERROR, mitk::PlaneGeometry::New(), mitk::ImageTimeSelector::New(), mitk::PlaneGeometry::Sagittal, mitk::BaseProcess::SetNthOutput(), and mitk::PlaneGeometry::Transversal.

{
   Image::ConstPointer input = ImageToImageFilter::GetInput(0);

   if ( (input->GetDimension() > 4) || (input->GetDimension() < 2) )
   {
     MITK_ERROR << "mitk::ExtractImageFilter:GenerateData works only with 3D and 3D+t images, sorry." << std::endl;
     itkExceptionMacro("mitk::ExtractImageFilter works only with 3D and 3D+t images, sorry.");
     return;
   }
   else if (input->GetDimension() == 4)
   {
     ImageTimeSelector::Pointer timeSelector = ImageTimeSelector::New();
     timeSelector->SetInput( input );
     timeSelector->SetTimeNr( m_TimeStep );
     timeSelector->UpdateLargestPossibleRegion();
     input = timeSelector->GetOutput();
   }
   else if (input->GetDimension() == 2)
   {
     Image::Pointer resultImage = ImageToImageFilter::GetOutput();
     resultImage = const_cast<Image*>(input.GetPointer());
     ImageToImageFilter::SetNthOutput( 0, resultImage );
     return;
   }

  if ( m_SliceDimension >= input->GetDimension() )
  {
    MITK_ERROR << "mitk::ExtractImageFilter:GenerateData  m_SliceDimension == " << m_SliceDimension << " makes no sense with an " << input->GetDimension() << "D image." << std::endl;
    itkExceptionMacro("This is not a sensible value for m_SliceDimension.");
    return;
  }

   AccessFixedDimensionByItk( input, ItkImageProcessing, 3 );

  // set a nice geometry for display and point transformations
  Geometry3D* inputImageGeometry = ImageToImageFilter::GetInput(0)->GetGeometry();
  if (!inputImageGeometry)
  {
    MITK_ERROR << "In ExtractImageFilter::ItkImageProcessing: Input image has no geometry!" << std::endl;
    return;
  }

  PlaneGeometry::PlaneOrientation orientation = PlaneGeometry::Transversal;

  switch ( m_SliceDimension )
  {
    default:
    case 2: 
      orientation = PlaneGeometry::Transversal;
      break;
    case 1: 
      orientation = PlaneGeometry::Frontal;
      break;
    case 0: 
      orientation = PlaneGeometry::Sagittal;
      break;
   }
 
  PlaneGeometry::Pointer planeGeometry = PlaneGeometry::New();
  planeGeometry->InitializeStandardPlane( inputImageGeometry, orientation, (ScalarType)m_SliceIndex + 0.5 , true, false );
  Image::Pointer resultImage = ImageToImageFilter::GetOutput();
  resultImage->SetGeometry( planeGeometry );
}
void mitk::ExtractImageFilter::GenerateInputRequestedRegion (  ) [protected, virtual]

What is the input requested region that is required to produce the output requested region? The base assumption for image processing filters is that the input requested region can be set to match the output requested region. If a filter requires more input (for instance a filter that uses neighborhoods needs more input than output to avoid introducing artificial boundary conditions) or less input (for instance a magnify filter) will have to override this method. In doing so, it should call its superclass' implementation as its first step. Note that this imaging filters operate differently than the classes to this point in the class hierachy. Up till now, the base assumption has been that the largest possible region will be requested of the input.

See also:
ProcessObject::GenerateInputRequestedRegion(), ImageSource::GenerateInputRequestedRegion()

Reimplemented from mitk::ImageToImageFilter.

Definition at line 156 of file mitkExtractImageFilter.cpp.

{
  Superclass::GenerateInputRequestedRegion();

  ImageToImageFilter::InputImagePointer input = const_cast< ImageToImageFilter::InputImageType* > ( this->GetInput() );
  Image::Pointer output = this->GetOutput();

  if (input->GetDimension() == 2)
  {
    input->SetRequestedRegionToLargestPossibleRegion();
    return;
  }

  Image::RegionType requestedRegion;
  requestedRegion = output->GetRequestedRegion();
  requestedRegion.SetIndex(0, 0);
  requestedRegion.SetIndex(1, 0);
  requestedRegion.SetIndex(2, 0);
  requestedRegion.SetSize(0, input->GetDimension(0));
  requestedRegion.SetSize(1, input->GetDimension(1));
  requestedRegion.SetSize(2, input->GetDimension(2));

  requestedRegion.SetIndex( m_SliceDimension, m_SliceIndex ); // only one slice needed
  requestedRegion.SetSize( m_SliceDimension, 1 );

  input->SetRequestedRegion( &requestedRegion );
}
void mitk::ExtractImageFilter::GenerateOutputInformation ( void   ) [protected, virtual]

Definition at line 195 of file mitkExtractImageFilter.cpp.

References MITK_ERROR.

{
 Image::Pointer output = this->GetOutput();
 Image::ConstPointer input = this->GetInput();
 if (input.IsNull()) return;

 if ( m_SliceDimension >= input->GetDimension() && input->GetDimension() != 2 )
 {
   MITK_ERROR << "mitk::ExtractImageFilter:GenerateOutputInformation  m_SliceDimension == " << m_SliceDimension << " makes no sense with an " << input->GetDimension() << "D image." << std::endl;
   itkExceptionMacro("This is not a sensible value for m_SliceDimension.");
   return;
 }

 unsigned int sliceDimension( m_SliceDimension );
 if ( input->GetDimension() == 2)
 {
   sliceDimension = 2;
 }

  unsigned int tmpDimensions[2];

  switch ( sliceDimension )
  {
    default:
    case 2: 
      // orientation = PlaneGeometry::Transversal;
      tmpDimensions[0] = input->GetDimension(0);
      tmpDimensions[1] = input->GetDimension(1);
      break;
    case 1: 
      // orientation = PlaneGeometry::Frontal;
      tmpDimensions[0] = input->GetDimension(0);
      tmpDimensions[1] = input->GetDimension(2);
      break;
    case 0: 
      // orientation = PlaneGeometry::Sagittal;
      tmpDimensions[0] = input->GetDimension(1);
      tmpDimensions[1] = input->GetDimension(2);
      break;
  }

  output->Initialize(input->GetPixelType(), 2, tmpDimensions, 1 /*input->GetNumberOfChannels()*/);

  // initialize the spacing of the output
/*
  Vector3D spacing = input->GetSlicedGeometry()->GetSpacing();
  if(input->GetDimension()>=2)
    spacing[2]=spacing[1];
  else
    spacing[2] = 1.0;
  output->GetSlicedGeometry()->SetSpacing(spacing);
*/

  output->SetPropertyList(input->GetPropertyList()->Clone());
}
virtual const char* mitk::ExtractImageFilter::GetClassName (  ) const [virtual]
virtual unsigned int mitk::ExtractImageFilter::GetSliceDimension (  ) const [virtual]
virtual unsigned int mitk::ExtractImageFilter::GetSliceIndex (  ) const [virtual]
virtual unsigned int mitk::ExtractImageFilter::GetTimeStep (  ) const [virtual]
template<typename TPixel , unsigned int VImageDimension>
void mitk::ExtractImageFilter::ItkImageProcessing ( itk::Image< TPixel, VImageDimension > *  image ) [protected]

Definition at line 103 of file mitkExtractImageFilter.cpp.

References mitk::ImageSource::GetOutput(), mitk::GrabItkImageMemory(), and itk::Image.

{
  // use the itk::ExtractImageFilter to get a 2D image
  typedef itk::Image< TPixel, VImageDimension >   ImageType3D;
  typedef itk::Image< TPixel, VImageDimension-1 > ImageType2D;

  typename ImageType3D::RegionType inSliceRegion = itkImage->GetLargestPossibleRegion();
  
  inSliceRegion.SetSize( m_SliceDimension, 0 );

  typedef itk::ExtractImageFilter<ImageType3D, ImageType2D> ExtractImageFilterType;

  typename ExtractImageFilterType::Pointer sliceExtractor = ExtractImageFilterType::New();
  sliceExtractor->SetInput( itkImage );
    
  inSliceRegion.SetIndex( m_SliceDimension, m_SliceIndex );

  sliceExtractor->SetExtractionRegion( inSliceRegion );

  // calculate the output
  sliceExtractor->UpdateLargestPossibleRegion();

  typename ImageType2D::Pointer slice = sliceExtractor->GetOutput();
  // possible bug in itk::ExtractImageFilter: or in CastToItkImage ?
  // direction maxtrix is wrong/broken/not working with mitk::Image::InitializeByItkImage
  // solution here: we overwrite it with an unity matrix
  // correct image direction only if ITK version < 3.10
#if (ITK_VERSION_MAJOR == 3 && ITK_VERSION_MINOR < 10) || ITK_VERSION_MAJOR < 3
  typename ImageType2D::DirectionType imageDirection;
  imageDirection.SetIdentity();
  slice->SetDirection(imageDirection);
#endif

  // re-import to MITK
  Image::Pointer resultImage = ImageToImageFilter::GetOutput();
  GrabItkImageMemory(slice, resultImage, NULL, false);
}
static Pointer mitk::ExtractImageFilter::New (  ) [static]
virtual void mitk::ExtractImageFilter::SetSliceDimension ( unsigned int  _arg ) [virtual]

The orientation of the slice to be extracted.

Parameter SliceDimension Number of the dimension which is constant for all pixels of the desired slice (e.g. 2 for transversal)

Referenced by mitkExtractImageFilterTestClass::Test2D(), mitkExtractImageFilterTestClass::Test3D(), mitkExtractImageFilterTestClass::Test4D(), and mitkExtractImageFilterTestClass::TestOtherD().

virtual void mitk::ExtractImageFilter::SetSliceIndex ( unsigned int  _arg ) [virtual]
virtual void mitk::ExtractImageFilter::SetTimeStep ( unsigned int  _arg ) [virtual]

Time step of the image to be extracted.

Referenced by mitkExtractImageFilterTestClass::Test4D().


Member Data Documentation

Definition at line 91 of file mitkExtractImageFilter.h.

unsigned int mitk::ExtractImageFilter::m_SliceIndex [protected]

Definition at line 90 of file mitkExtractImageFilter.h.

unsigned int mitk::ExtractImageFilter::m_TimeStep [protected]

Definition at line 92 of file mitkExtractImageFilter.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines