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
00019 #include "mitkMaskImageFilter.h"
00020 #include "mitkImageTimeSelector.h"
00021 #include "mitkTimeHelper.h"
00022 #include "mitkProperties.h"
00023
00024 #include "mitkImageToItk.h"
00025 #include "mitkImageAccessByItk.h"
00026
00027 #include "itkImageRegionConstIterator.h"
00028 #include "itkImageRegionIteratorWithIndex.h"
00029
00030 mitk::MaskImageFilter::MaskImageFilter() : m_Mask(NULL)
00031 {
00032 this->SetNumberOfInputs(2);
00033 this->SetNumberOfRequiredInputs(2);
00034 m_InputTimeSelector = mitk::ImageTimeSelector::New();
00035 m_MaskTimeSelector = mitk::ImageTimeSelector::New();
00036 m_OutputTimeSelector = mitk::ImageTimeSelector::New();
00037 m_OverrideOutsideValue = false;
00038 m_OutsideValue = 0;
00039 }
00040
00041 mitk::MaskImageFilter::~MaskImageFilter()
00042 {
00043
00044 }
00045
00046 void mitk::MaskImageFilter::SetMask( const mitk::Image* mask )
00047 {
00048
00049 m_Mask = const_cast< mitk::Image * >( mask );
00050 this->ProcessObject::SetNthInput(1, m_Mask );
00051 }
00052
00053 const mitk::Image* mitk::MaskImageFilter::GetMask() const
00054 {
00055 return m_Mask;
00056 }
00057
00058 void mitk::MaskImageFilter::GenerateInputRequestedRegion()
00059 {
00060 Superclass::GenerateInputRequestedRegion();
00061
00062 mitk::Image* output = this->GetOutput();
00063 mitk::Image* input = const_cast< mitk::Image * > ( this->GetInput() );
00064 mitk::Image* mask = m_Mask ;
00065 if((output->IsInitialized()==false) || (mask == NULL) || (mask->GetTimeSlicedGeometry()->GetTimeSteps() == 0))
00066 return;
00067
00068 input->SetRequestedRegionToLargestPossibleRegion();
00069 mask->SetRequestedRegionToLargestPossibleRegion();
00070
00071 GenerateTimeInInputRegion(output, input);
00072 GenerateTimeInInputRegion(output, mask);
00073 }
00074
00075 void mitk::MaskImageFilter::GenerateOutputInformation()
00076 {
00077 mitk::Image::ConstPointer input = this->GetInput();
00078 mitk::Image::Pointer output = this->GetOutput();
00079
00080 if ((output->IsInitialized()) && (this->GetMTime() <= m_TimeOfHeaderInitialization.GetMTime()))
00081 return;
00082
00083 itkDebugMacro(<<"GenerateOutputInformation()");
00084
00085 output->Initialize(input->GetPixelType(), *input->GetTimeSlicedGeometry());
00086
00087 output->SetPropertyList(input->GetPropertyList()->Clone());
00088
00089 m_TimeOfHeaderInitialization.Modified();
00090 }
00091
00092 template < typename TPixel, unsigned int VImageDimension >
00093 void mitk::MaskImageFilter::InternalComputeMask(itk::Image<TPixel, VImageDimension>* inputItkImage)
00094 {
00095 typedef itk::Image<TPixel, VImageDimension> ItkInputImageType;
00096 typedef itk::Image<unsigned char, VImageDimension> ItkMaskImageType;
00097 typedef itk::Image<TPixel, VImageDimension> ItkOutputImageType;
00098
00099 typedef itk::ImageRegionConstIterator< ItkInputImageType > ItkInputImageIteratorType;
00100 typedef itk::ImageRegionConstIterator< ItkMaskImageType > ItkMaskImageIteratorType;
00101 typedef itk::ImageRegionIteratorWithIndex< ItkOutputImageType > ItkOutputImageIteratorType;
00102
00103 typename mitk::ImageToItk<ItkMaskImageType>::Pointer maskimagetoitk = mitk::ImageToItk<ItkMaskImageType>::New();
00104 maskimagetoitk->SetInput(m_MaskTimeSelector->GetOutput());
00105 maskimagetoitk->Update();
00106 typename ItkMaskImageType::Pointer maskItkImage = maskimagetoitk->GetOutput();
00107
00108 typename mitk::ImageToItk<ItkOutputImageType>::Pointer outputimagetoitk = mitk::ImageToItk<ItkOutputImageType>::New();
00109 outputimagetoitk->SetInput(m_OutputTimeSelector->GetOutput());
00110 outputimagetoitk->Update();
00111 typename ItkOutputImageType::Pointer outputItkImage = outputimagetoitk->GetOutput();
00112
00113
00114 typename ItkInputImageType::RegionType inputRegionOfInterest = inputItkImage->GetLargestPossibleRegion();
00115 ItkInputImageIteratorType inputIt( inputItkImage, inputRegionOfInterest );
00116 ItkMaskImageIteratorType maskIt ( maskItkImage, inputRegionOfInterest );
00117 ItkOutputImageIteratorType outputIt( outputItkImage, inputRegionOfInterest );
00118
00119 typename ItkOutputImageType::PixelType outsideValue = itk::NumericTraits<typename ItkOutputImageType::PixelType>::min();
00120 if ( m_OverrideOutsideValue )
00121 outsideValue = static_cast<typename ItkOutputImageType::PixelType>( m_OutsideValue );
00122
00123 m_MinValue = (itk::NumericTraits<typename ItkOutputImageType::PixelType>::max());
00124 m_MaxValue = (itk::NumericTraits<typename ItkOutputImageType::PixelType>::min());
00125
00126
00127 for ( inputIt.GoToBegin(), maskIt.GoToBegin(), outputIt.GoToBegin(); !inputIt.IsAtEnd() && !maskIt.IsAtEnd(); ++inputIt, ++maskIt, ++outputIt)
00128 {
00129 if ( maskIt.Get() > itk::NumericTraits<typename ItkMaskImageType::PixelType>::Zero )
00130 {
00131 outputIt.Set(inputIt.Get());
00132 m_MinValue = vnl_math_min((float)inputIt.Get(), (float)m_MinValue);
00133 m_MaxValue = vnl_math_max((float)inputIt.Get(), (float)m_MaxValue);
00134 }
00135 else
00136 {
00137 outputIt.Set(outsideValue);
00138 }
00139 }
00140 }
00141
00142 void mitk::MaskImageFilter::GenerateData()
00143 {
00144 mitk::Image::ConstPointer input = this->GetInput();
00145 mitk::Image::Pointer mask = m_Mask;
00146 mitk::Image::Pointer output = this->GetOutput();
00147
00148 if((output->IsInitialized()==false) || (mask.IsNull()) || (mask->GetTimeSlicedGeometry()->GetTimeSteps() == 0))
00149 return;
00150
00151 m_InputTimeSelector->SetInput(input);
00152 m_MaskTimeSelector->SetInput(mask);
00153 m_OutputTimeSelector->SetInput(this->GetOutput());
00154
00155 mitk::Image::RegionType outputRegion = output->GetRequestedRegion();
00156 const mitk::TimeSlicedGeometry *outputTimeGeometry = output->GetTimeSlicedGeometry();
00157 const mitk::TimeSlicedGeometry *inputTimeGeometry = input->GetTimeSlicedGeometry();
00158 const mitk::TimeSlicedGeometry *maskTimeGeometry = mask->GetTimeSlicedGeometry();
00159 ScalarType timeInMS;
00160
00161 int timestep=0;
00162 int tstart=outputRegion.GetIndex(3);
00163 int tmax=tstart+outputRegion.GetSize(3);
00164
00165 int t;
00166 for(t=tstart;t<tmax;++t)
00167 {
00168 timeInMS = outputTimeGeometry->TimeStepToMS( t );
00169
00170 timestep = inputTimeGeometry->MSToTimeStep( timeInMS );
00171
00172 m_InputTimeSelector->SetTimeNr(timestep);
00173 m_InputTimeSelector->UpdateLargestPossibleRegion();
00174 m_OutputTimeSelector->SetTimeNr(t);
00175 m_OutputTimeSelector->UpdateLargestPossibleRegion();
00176
00177 timestep = maskTimeGeometry->MSToTimeStep( timeInMS );
00178 m_MaskTimeSelector->SetTimeNr(timestep);
00179 m_MaskTimeSelector->UpdateLargestPossibleRegion();
00180
00181 AccessByItk(m_InputTimeSelector->GetOutput(),InternalComputeMask);
00182 }
00183
00184 m_TimeOfHeaderInitialization.Modified();
00185 }