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

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

Writes a 2D slice into a 3D image. More...

#include <mitkOverwriteSliceImageFilter.h>

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

List of all members.

Public Types

typedef OverwriteSliceImageFilter 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 overwrite (first one has index 0).
virtual unsigned int GetSliceIndex () const
virtual void SetSliceDimension (unsigned int _arg)
 The orientation of the slice to overwrite.
virtual unsigned int GetSliceDimension () const
virtual void SetTimeStep (unsigned int _arg)
 Time step of the slice to overwrite.
virtual unsigned int GetTimeStep () const
virtual void SetCreateUndoInformation (bool _arg)
 Whether to create undo operation in the MITK undo stack.
virtual bool GetCreateUndoInformation () const
virtual void SetSliceImage (Image *_arg)
const ImageGetSliceImage ()
const ImageGetLastDifferenceImage ()

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 OverwriteSliceImageFilter ()
virtual ~OverwriteSliceImageFilter ()
virtual void GenerateData ()
 A version of GenerateData() specific for image processing filters.
template<typename TPixel , unsigned int VImageDimension>
void ItkImageSwitch (itk::Image< TPixel, VImageDimension > *image)
template<typename TPixel1 , unsigned int VImageDimension1, typename TPixel2 , unsigned int VImageDimension2>
void ItkImageProcessing (itk::Image< TPixel1, VImageDimension1 > *itkImage1, itk::Image< TPixel2, VImageDimension2 > *itkImage2)
std::string EventDescription (unsigned int sliceDimension, unsigned int sliceIndex, unsigned int timeStep)

Protected Attributes

Image::ConstPointer m_SliceImage
Image::Pointer m_SliceDifferenceImage
unsigned int m_SliceIndex
unsigned int m_SliceDimension
unsigned int m_TimeStep
unsigned int m_Dimension0
unsigned int m_Dimension1
bool m_CreateUndoInformation

Detailed Description

Writes a 2D slice into a 3D image.

See also:
SegTool2D
ContourTool
ExtractImageFilter

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

This class takes a 3D mitk::Image as input and tries to replace one slice in it with the second input image, which is specified by calling SetSliceImage with a 2D mitk::Image.

Two parameters determine which slice is replaced: 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.

This class works with all kind of image types, the only restrictions being that the input is 3D, and the slice image is 2D.

If requested by SetCreateUndoInformation(true), this class will create instances of ApplyDiffImageOperation for the undo stack. These operations will (on user request) be executed by DiffImageApplier to perform undo.

Last contributor: $Author$

Definition at line 55 of file mitkOverwriteSliceImageFilter.h.


Member Typedef Documentation

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

Definition at line 59 of file mitkOverwriteSliceImageFilter.h.

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

Definition at line 59 of file mitkOverwriteSliceImageFilter.h.

Definition at line 59 of file mitkOverwriteSliceImageFilter.h.

Definition at line 59 of file mitkOverwriteSliceImageFilter.h.


Constructor & Destructor Documentation

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

Definition at line 41 of file mitkOverwriteSliceImageFilter.cpp.

{
}

Member Function Documentation

std::string mitk::OverwriteSliceImageFilter::EventDescription ( unsigned int  sliceDimension,
unsigned int  sliceIndex,
unsigned int  timeStep 
) [protected]

Definition at line 223 of file mitkOverwriteSliceImageFilter.cpp.

{
  std::stringstream s;
  
  s << "Changed slice (";

  switch (sliceDimension)
  {
    default:
    case 2:
      s << "T";
      break;
    case 1:
      s << "C";
      break;
    case 0:
      s << "S";
      break;
  }

  s << " " << sliceIndex << " " << timeStep << ")";

  return s.str();
}
void mitk::OverwriteSliceImageFilter::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 45 of file mitkOverwriteSliceImageFilter.cpp.

References AccessFixedDimensionByItk, mitk::SegmentationInterpolationController::BlockModified(), mitk::UndoController::GetCurrentUndoModel(), mitk::ImageToImageFilter::GetInput(), mitk::DiffImageApplier::GetInstanceForUndo(), mitk::SegmentationInterpolationController::InterpolatorForImage(), mitk::Image::New(), mitk::ImageTimeSelector::New(), mitk::OpTEST, mitk::SegmentationInterpolationController::SetChangedSlice(), mitk::ApplyDiffImageOperation::SetFactor(), and mitk::UndoModel::SetOperationEvent().

{
  //
  // this is the place to implement the major part of undo functionality (bug #491)
  // here we have to create undo/do operations
  //
  // WHO is the operation actor? This object may not be destroyed ever (design of undo stack)!
  // -> some singleton method of this filter?
  //
  // neccessary additional objects:
  //  - something that executes the operations
  //  - the operation class (must hold a binary diff or something)
  //  - observer commands to know when the image is deleted (no further action then, perhaps even remove the operations from the undo stack)
  //
  Image::ConstPointer input = ImageToImageFilter::GetInput(0);
  Image::ConstPointer input3D = input;

  Image::ConstPointer slice = m_SliceImage;

  if ( input.IsNull() || slice.IsNull() ) return;

  switch (m_SliceDimension)
  {
    default:
    case 2:
      m_Dimension0 = 0;
      m_Dimension1 = 1;
      break;
    case 1:
      m_Dimension0 = 0;
      m_Dimension1 = 2;
      break;
    case 0:
      m_Dimension0 = 1;
      m_Dimension1 = 2;
      break;
  }

  if ( slice->GetDimension() < 2 || input->GetDimension() > 4 ||
       slice->GetDimension(0) != input->GetDimension(m_Dimension0) ||
       slice->GetDimension(1) != input->GetDimension(m_Dimension1) ||
       m_SliceIndex >= input->GetDimension(m_SliceDimension)
     )
  {
   itkExceptionMacro("Slice and image dimensions differ or slice index is too large. Sorry, cannot work like this.");
   return;
  }
  
  if ( input->GetDimension() == 4 )
  {
    ImageTimeSelector::Pointer timeSelector = ImageTimeSelector::New();
    timeSelector->SetInput( input );
    timeSelector->SetTimeNr( m_TimeStep );
    timeSelector->UpdateLargestPossibleRegion();
    input3D = timeSelector->GetOutput();
  }
 
  if ( m_SliceDifferenceImage.IsNull() || 
       m_SliceDifferenceImage->GetDimension(0) != m_SliceImage->GetDimension(0) ||
       m_SliceDifferenceImage->GetDimension(1) != m_SliceImage->GetDimension(1) )
  {
    m_SliceDifferenceImage = mitk::Image::New();
    mitk::PixelType pixelType( typeid(short signed int) );
    m_SliceDifferenceImage->Initialize( pixelType, 2, m_SliceImage->GetDimensions() );
  }

  //MITK_INFO << "Overwriting slice " << m_SliceIndex << " in dimension " << m_SliceDimension << " at time step " << m_TimeStep << std::endl;
  // this will do a long long if/else to find out both pixel types
  AccessFixedDimensionByItk( input3D, ItkImageSwitch, 3 );

  SegmentationInterpolationController* interpolator = SegmentationInterpolationController::InterpolatorForImage( input );
  if (interpolator)
  {
    interpolator->BlockModified(true);
    interpolator->SetChangedSlice( m_SliceDifferenceImage, m_SliceDimension, m_SliceIndex, m_TimeStep );
  }

  if ( m_CreateUndoInformation )
  {
    // create do/undo operations (we don't execute the doOp here, because it has already been executed during calculation of the diff image
    ApplyDiffImageOperation* doOp = new ApplyDiffImageOperation( OpTEST, const_cast<Image*>(input.GetPointer()), m_SliceDifferenceImage, m_TimeStep, m_SliceDimension, m_SliceIndex );
    ApplyDiffImageOperation* undoOp = new ApplyDiffImageOperation( OpTEST, const_cast<Image*>(input.GetPointer()), m_SliceDifferenceImage, m_TimeStep, m_SliceDimension, m_SliceIndex );
    undoOp->SetFactor( -1.0 );
    OperationEvent* undoStackItem = new OperationEvent( DiffImageApplier::GetInstanceForUndo(), doOp, undoOp, this->EventDescription(m_SliceDimension, m_SliceIndex, m_TimeStep) );
    UndoController::GetCurrentUndoModel()->SetOperationEvent( undoStackItem );
  }

  // this image is modified (good to know for the renderer)
  input->Modified();

  if (interpolator)
  {
    interpolator->BlockModified(false);
  }
}
virtual const char* mitk::OverwriteSliceImageFilter::GetClassName (  ) const [virtual]
virtual bool mitk::OverwriteSliceImageFilter::GetCreateUndoInformation (  ) const [virtual]
const Image* mitk::OverwriteSliceImageFilter::GetLastDifferenceImage (  ) [inline]

Definition at line 91 of file mitkOverwriteSliceImageFilter.h.

{ return m_SliceDifferenceImage.GetPointer(); }
virtual unsigned int mitk::OverwriteSliceImageFilter::GetSliceDimension (  ) const [virtual]
const Image* mitk::OverwriteSliceImageFilter::GetSliceImage (  ) [inline]

Definition at line 89 of file mitkOverwriteSliceImageFilter.h.

{ return m_SliceImage.GetPointer(); }
virtual unsigned int mitk::OverwriteSliceImageFilter::GetSliceIndex (  ) const [virtual]
virtual unsigned int mitk::OverwriteSliceImageFilter::GetTimeStep (  ) const [virtual]
template<typename TPixel1 , unsigned int VImageDimension1, typename TPixel2 , unsigned int VImageDimension2>
void mitk::OverwriteSliceImageFilter::ItkImageProcessing ( itk::Image< TPixel1, VImageDimension1 > *  itkImage1,
itk::Image< TPixel2, VImageDimension2 > *  itkImage2 
) [protected]

Definition at line 175 of file mitkOverwriteSliceImageFilter.cpp.

References mitk::CastToItkImage().

{
  typedef itk::Image<TPixel1, VImageDimension1> SliceImageType;
  typedef itk::Image<short signed int, VImageDimension1> DiffImageType;
  typedef itk::Image<TPixel2, VImageDimension2> VolumeImageType;

  typedef itk::ImageSliceIteratorWithIndex< VolumeImageType > OutputSliceIteratorType;
  typedef itk::ImageRegionConstIterator< SliceImageType >     InputSliceIteratorType;
  typedef itk::ImageRegionIterator< DiffImageType >     DiffSliceIteratorType;

  typename VolumeImageType::RegionType            sliceInVolumeRegion;

  sliceInVolumeRegion = outputImage->GetLargestPossibleRegion();
  sliceInVolumeRegion.SetSize( m_SliceDimension, 1 );             // just one slice
  sliceInVolumeRegion.SetIndex( m_SliceDimension, m_SliceIndex ); // exactly this slice, please
  
  OutputSliceIteratorType outputIterator( outputImage, sliceInVolumeRegion );
  outputIterator.SetFirstDirection(m_Dimension0);
  outputIterator.SetSecondDirection(m_Dimension1);

  InputSliceIteratorType inputIterator( inputImage, inputImage->GetLargestPossibleRegion() );
  
  typename DiffImageType::Pointer diffImage;
  CastToItkImage( m_SliceDifferenceImage, diffImage );
  DiffSliceIteratorType diffIterator( diffImage, diffImage->GetLargestPossibleRegion() );

  // iterate over output slice (and over input slice simultaneously)
  outputIterator.GoToBegin();
  inputIterator.GoToBegin();
  diffIterator.GoToBegin();
  while ( !outputIterator.IsAtEnd() )
  {
    while ( !outputIterator.IsAtEndOfSlice() )
    {
      while ( !outputIterator.IsAtEndOfLine() )
      {
        diffIterator.Set( static_cast<short signed int>(inputIterator.Get() - outputIterator.Get()) ); // oh oh, not good for bigger values
        outputIterator.Set( (TPixel2) inputIterator.Get() );
        ++outputIterator; 
        ++inputIterator; 
        ++diffIterator; 
      }
      outputIterator.NextLine();
    }
    outputIterator.NextSlice();
  }
}
template<typename TPixel , unsigned int VImageDimension>
void mitk::OverwriteSliceImageFilter::ItkImageSwitch ( itk::Image< TPixel, VImageDimension > *  image ) [protected]

Definition at line 167 of file mitkOverwriteSliceImageFilter.cpp.

References ItkImageProcessing(), and myMITKOverwriteSliceImageFilterAccessAllTypesByItk.

{
  const std::type_info& typeId=*(m_SliceImage->GetPixelType().GetTypeId());

  myMITKOverwriteSliceImageFilterAccessAllTypesByItk( m_SliceImage, ItkImageProcessing, 2, itkImage );
}
static Pointer mitk::OverwriteSliceImageFilter::New (  ) [static]
virtual void mitk::OverwriteSliceImageFilter::SetCreateUndoInformation ( bool  _arg ) [virtual]

Whether to create undo operation in the MITK undo stack.

virtual void mitk::OverwriteSliceImageFilter::SetSliceDimension ( unsigned int  _arg ) [virtual]

The orientation of the slice to overwrite.

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

Referenced by mitkOverwriteSliceImageFilterTestClass::Test3D().

virtual void mitk::OverwriteSliceImageFilter::SetSliceImage ( Image _arg ) [virtual]
virtual void mitk::OverwriteSliceImageFilter::SetSliceIndex ( unsigned int  _arg ) [virtual]

Which slice to overwrite (first one has index 0).

Referenced by mitkOverwriteSliceImageFilterTestClass::Test3D().

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

Time step of the slice to overwrite.


Member Data Documentation

Definition at line 117 of file mitkOverwriteSliceImageFilter.h.

Definition at line 114 of file mitkOverwriteSliceImageFilter.h.

Definition at line 115 of file mitkOverwriteSliceImageFilter.h.

Definition at line 109 of file mitkOverwriteSliceImageFilter.h.

Definition at line 112 of file mitkOverwriteSliceImageFilter.h.

Definition at line 108 of file mitkOverwriteSliceImageFilter.h.

Definition at line 111 of file mitkOverwriteSliceImageFilter.h.

Definition at line 113 of file mitkOverwriteSliceImageFilter.h.


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