Writes a 2D slice into a 3D image. More...
#include <mitkOverwriteSliceImageFilter.h>
Public Types | |
typedef OverwriteSliceImageFilter | Self |
typedef ImageToImageFilter | Superclass |
typedef itk::SmartPointer< Self > | Pointer |
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 Image * | GetSliceImage () |
const Image * | GetLastDifferenceImage () |
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 |
Writes a 2D slice into a 3D image.
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.
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.
mitk::OverwriteSliceImageFilter::OverwriteSliceImageFilter | ( | ) | [protected] |
Definition at line 31 of file mitkOverwriteSliceImageFilter.cpp.
:m_SliceIndex(0), m_SliceDimension(0), m_TimeStep(0), m_Dimension0(0), m_Dimension1(1), m_CreateUndoInformation(false) { }
mitk::OverwriteSliceImageFilter::~OverwriteSliceImageFilter | ( | ) | [protected, virtual] |
Definition at line 41 of file mitkOverwriteSliceImageFilter.cpp.
{ }
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.
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] |
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(); } }
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] |
Method for creation through the object factory.
Reimplemented from mitk::ImageToImageFilter.
Referenced by QmitkSlicesInterpolator::AcceptAllInterpolations(), mitkOverwriteSliceImageFilterTest(), QmitkSlicesInterpolator::OnAcceptInterpolationClicked(), mitk::PaintbrushTool::OnMouseMoved(), mitk::SetRegionTool::OnMouseReleased(), mitk::RegionGrowingTool::OnMouseReleased(), mitk::CorrectorTool2D::OnMouseReleased(), and mitk::ContourTool::OnMouseReleased().
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.
bool mitk::OverwriteSliceImageFilter::m_CreateUndoInformation [protected] |
Definition at line 117 of file mitkOverwriteSliceImageFilter.h.
unsigned int mitk::OverwriteSliceImageFilter::m_Dimension0 [protected] |
Definition at line 114 of file mitkOverwriteSliceImageFilter.h.
unsigned int mitk::OverwriteSliceImageFilter::m_Dimension1 [protected] |
Definition at line 115 of file mitkOverwriteSliceImageFilter.h.
Definition at line 109 of file mitkOverwriteSliceImageFilter.h.
unsigned int mitk::OverwriteSliceImageFilter::m_SliceDimension [protected] |
Definition at line 112 of file mitkOverwriteSliceImageFilter.h.
Definition at line 108 of file mitkOverwriteSliceImageFilter.h.
unsigned int mitk::OverwriteSliceImageFilter::m_SliceIndex [protected] |
Definition at line 111 of file mitkOverwriteSliceImageFilter.h.
unsigned int mitk::OverwriteSliceImageFilter::m_TimeStep [protected] |
Definition at line 113 of file mitkOverwriteSliceImageFilter.h.