Extracts a 2D slice from a 3D image. More...
#include <mitkExtractImageFilter.h>
Public Types | |
typedef ExtractImageFilter | 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 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 |
Extracts a 2D slice from 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 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.
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.
mitk::ExtractImageFilter::ExtractImageFilter | ( | ) | [protected] |
Definition at line 26 of file mitkExtractImageFilter.cpp.
:m_SliceIndex(0), m_SliceDimension(0), m_TimeStep(0) { }
mitk::ExtractImageFilter::~ExtractImageFilter | ( | ) | [protected, virtual] |
Definition at line 33 of file mitkExtractImageFilter.cpp.
{ }
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.
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.
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] |
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] |
Method for creation through the object factory.
Reimplemented from mitk::ImageToImageFilter.
Referenced by mitk::SegTool2D::GetAffectedImageSliceAs2DImage(), mitk::SegmentationInterpolationController::Interpolate(), mitkExtractImageFilterTest(), and mitkOverwriteSliceImageFilterTestClass::Test3D().
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] |
Which slice to extract (first one has index 0).
Referenced by mitkExtractImageFilterTestClass::Test2D(), mitkExtractImageFilterTestClass::Test3D(), mitkExtractImageFilterTestClass::Test4D(), and mitkExtractImageFilterTestClass::TestOtherD().
virtual void mitk::ExtractImageFilter::SetTimeStep | ( | unsigned int | _arg ) | [virtual] |
Time step of the image to be extracted.
Referenced by mitkExtractImageFilterTestClass::Test4D().
unsigned int mitk::ExtractImageFilter::m_SliceDimension [protected] |
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.