Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkExtractImageFilter.h"
00019 #include "mitkImageCast.h"
00020 #include "mitkPlaneGeometry.h"
00021 #include "mitkITKImageImport.h"
00022 #include "mitkImageTimeSelector.h"
00023
00024 #include <itkExtractImageFilter.h>
00025
00026 mitk::ExtractImageFilter::ExtractImageFilter()
00027 :m_SliceIndex(0),
00028 m_SliceDimension(0),
00029 m_TimeStep(0)
00030 {
00031 }
00032
00033 mitk::ExtractImageFilter::~ExtractImageFilter()
00034 {
00035 }
00036
00037 void mitk::ExtractImageFilter::GenerateData()
00038 {
00039 Image::ConstPointer input = ImageToImageFilter::GetInput(0);
00040
00041 if ( (input->GetDimension() > 4) || (input->GetDimension() < 2) )
00042 {
00043 MITK_ERROR << "mitk::ExtractImageFilter:GenerateData works only with 3D and 3D+t images, sorry." << std::endl;
00044 itkExceptionMacro("mitk::ExtractImageFilter works only with 3D and 3D+t images, sorry.");
00045 return;
00046 }
00047 else if (input->GetDimension() == 4)
00048 {
00049 ImageTimeSelector::Pointer timeSelector = ImageTimeSelector::New();
00050 timeSelector->SetInput( input );
00051 timeSelector->SetTimeNr( m_TimeStep );
00052 timeSelector->UpdateLargestPossibleRegion();
00053 input = timeSelector->GetOutput();
00054 }
00055 else if (input->GetDimension() == 2)
00056 {
00057 Image::Pointer resultImage = ImageToImageFilter::GetOutput();
00058 resultImage = const_cast<Image*>(input.GetPointer());
00059 ImageToImageFilter::SetNthOutput( 0, resultImage );
00060 return;
00061 }
00062
00063 if ( m_SliceDimension >= input->GetDimension() )
00064 {
00065 MITK_ERROR << "mitk::ExtractImageFilter:GenerateData m_SliceDimension == " << m_SliceDimension << " makes no sense with an " << input->GetDimension() << "D image." << std::endl;
00066 itkExceptionMacro("This is not a sensible value for m_SliceDimension.");
00067 return;
00068 }
00069
00070 AccessFixedDimensionByItk( input, ItkImageProcessing, 3 );
00071
00072
00073 Geometry3D* inputImageGeometry = ImageToImageFilter::GetInput(0)->GetGeometry();
00074 if (!inputImageGeometry)
00075 {
00076 MITK_ERROR << "In ExtractImageFilter::ItkImageProcessing: Input image has no geometry!" << std::endl;
00077 return;
00078 }
00079
00080 PlaneGeometry::PlaneOrientation orientation = PlaneGeometry::Transversal;
00081
00082 switch ( m_SliceDimension )
00083 {
00084 default:
00085 case 2:
00086 orientation = PlaneGeometry::Transversal;
00087 break;
00088 case 1:
00089 orientation = PlaneGeometry::Frontal;
00090 break;
00091 case 0:
00092 orientation = PlaneGeometry::Sagittal;
00093 break;
00094 }
00095
00096 PlaneGeometry::Pointer planeGeometry = PlaneGeometry::New();
00097 planeGeometry->InitializeStandardPlane( inputImageGeometry, orientation, (ScalarType)m_SliceIndex + 0.5 , true, false );
00098 Image::Pointer resultImage = ImageToImageFilter::GetOutput();
00099 resultImage->SetGeometry( planeGeometry );
00100 }
00101
00102 template<typename TPixel, unsigned int VImageDimension>
00103 void mitk::ExtractImageFilter::ItkImageProcessing( itk::Image<TPixel,VImageDimension>* itkImage )
00104 {
00105
00106 typedef itk::Image< TPixel, VImageDimension > ImageType3D;
00107 typedef itk::Image< TPixel, VImageDimension-1 > ImageType2D;
00108
00109 typename ImageType3D::RegionType inSliceRegion = itkImage->GetLargestPossibleRegion();
00110
00111 inSliceRegion.SetSize( m_SliceDimension, 0 );
00112
00113 typedef itk::ExtractImageFilter<ImageType3D, ImageType2D> ExtractImageFilterType;
00114
00115 typename ExtractImageFilterType::Pointer sliceExtractor = ExtractImageFilterType::New();
00116 sliceExtractor->SetInput( itkImage );
00117
00118 inSliceRegion.SetIndex( m_SliceDimension, m_SliceIndex );
00119
00120 sliceExtractor->SetExtractionRegion( inSliceRegion );
00121
00122
00123 sliceExtractor->UpdateLargestPossibleRegion();
00124
00125 typename ImageType2D::Pointer slice = sliceExtractor->GetOutput();
00126
00127
00128
00129
00130 #if (ITK_VERSION_MAJOR == 3 && ITK_VERSION_MINOR < 10) || ITK_VERSION_MAJOR < 3
00131 typename ImageType2D::DirectionType imageDirection;
00132 imageDirection.SetIdentity();
00133 slice->SetDirection(imageDirection);
00134 #endif
00135
00136
00137 Image::Pointer resultImage = ImageToImageFilter::GetOutput();
00138 GrabItkImageMemory(slice, resultImage, NULL, false);
00139 }
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 void mitk::ExtractImageFilter::GenerateInputRequestedRegion()
00157 {
00158 Superclass::GenerateInputRequestedRegion();
00159
00160 ImageToImageFilter::InputImagePointer input = const_cast< ImageToImageFilter::InputImageType* > ( this->GetInput() );
00161 Image::Pointer output = this->GetOutput();
00162
00163 if (input->GetDimension() == 2)
00164 {
00165 input->SetRequestedRegionToLargestPossibleRegion();
00166 return;
00167 }
00168
00169 Image::RegionType requestedRegion;
00170 requestedRegion = output->GetRequestedRegion();
00171 requestedRegion.SetIndex(0, 0);
00172 requestedRegion.SetIndex(1, 0);
00173 requestedRegion.SetIndex(2, 0);
00174 requestedRegion.SetSize(0, input->GetDimension(0));
00175 requestedRegion.SetSize(1, input->GetDimension(1));
00176 requestedRegion.SetSize(2, input->GetDimension(2));
00177
00178 requestedRegion.SetIndex( m_SliceDimension, m_SliceIndex );
00179 requestedRegion.SetSize( m_SliceDimension, 1 );
00180
00181 input->SetRequestedRegion( &requestedRegion );
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 void mitk::ExtractImageFilter::GenerateOutputInformation()
00196 {
00197 Image::Pointer output = this->GetOutput();
00198 Image::ConstPointer input = this->GetInput();
00199 if (input.IsNull()) return;
00200
00201 if ( m_SliceDimension >= input->GetDimension() && input->GetDimension() != 2 )
00202 {
00203 MITK_ERROR << "mitk::ExtractImageFilter:GenerateOutputInformation m_SliceDimension == " << m_SliceDimension << " makes no sense with an " << input->GetDimension() << "D image." << std::endl;
00204 itkExceptionMacro("This is not a sensible value for m_SliceDimension.");
00205 return;
00206 }
00207
00208 unsigned int sliceDimension( m_SliceDimension );
00209 if ( input->GetDimension() == 2)
00210 {
00211 sliceDimension = 2;
00212 }
00213
00214 unsigned int tmpDimensions[2];
00215
00216 switch ( sliceDimension )
00217 {
00218 default:
00219 case 2:
00220
00221 tmpDimensions[0] = input->GetDimension(0);
00222 tmpDimensions[1] = input->GetDimension(1);
00223 break;
00224 case 1:
00225
00226 tmpDimensions[0] = input->GetDimension(0);
00227 tmpDimensions[1] = input->GetDimension(2);
00228 break;
00229 case 0:
00230
00231 tmpDimensions[0] = input->GetDimension(1);
00232 tmpDimensions[1] = input->GetDimension(2);
00233 break;
00234 }
00235
00236 output->Initialize(input->GetPixelType(), 2, tmpDimensions, 1 );
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248 output->SetPropertyList(input->GetPropertyList()->Clone());
00249 }
00250
00251