23 #include "itkNaryAddImageFilter.h" 25 #include "itkImageIOBase.h" 26 #include "itkBinaryFunctorImageFilter.h" 27 #include "itkTernaryFunctorImageFilter.h" 28 #include <itkExtractImageFilter.h> 29 #include "itkMeanProjectionImageFilter.h" 32 m_AbsoluteSignalEnhancement(false), m_RelativeSignalEnhancement(0.0), m_UsingT1Map(false), m_Factor(0.0), m_RecoveryTime(0.0), m_RelaxationTime(0.0),
33 m_Relaxivity(0.0), m_FlipAngle(0.0), m_T2Factor(0.0), m_T2EchoTime(0.0)
44 if(this->m_DynamicImage.IsNull())
46 itkExceptionMacro( <<
"Dynamic Image not set!");
51 return m_ConvertedImage;
61 tempImage->Initialize(pixeltype,*this->m_DynamicImage->GetTimeGeometry());
64 tempImage->SetTimeGeometry(timeGeometry);
68 imageTimeSelector->SetInput(this->m_DynamicImage);
70 for(
unsigned int i = 0; i< this->m_DynamicImage->GetTimeSteps(); ++i)
72 imageTimeSelector->SetTimeNr(i);
73 imageTimeSelector->UpdateLargestPossibleRegion();
81 tempImage->SetVolume(accessor.
GetData(), i);
84 this->m_ConvertedImage = tempImage;
92 imageTimeSelector->SetInput(this->m_DynamicImage);
93 imageTimeSelector->SetTimeNr(0);
94 imageTimeSelector->UpdateLargestPossibleRegion();
96 baselineImage = imageTimeSelector->GetOutput();
98 if (m_BaselineStartTimeStep == m_BaselineEndTimeStep)
100 this->m_BaselineImage = imageTimeSelector->GetOutput();
108 catch (itk::ExceptionObject & err)
110 std::cerr <<
"ExceptionObject in ConcentrationCurveGenerator::CalculateAverageBaselineImage caught!" << std::endl;
111 std::cerr << err << std::endl;
116 template<
class TPixel>
119 if (itkBaselineImage == NULL)
121 mitkThrow() <<
"Error in ConcentrationCurveGenerator::CalculateAverageBaselineImage. Input image is NULL.";
123 if (m_BaselineStartTimeStep > m_BaselineEndTimeStep)
125 mitkThrow() <<
"Error in ConcentrationCurveGenerator::CalculateAverageBaselineImage. End time point is before start time point.";
128 typedef itk::Image<TPixel, 4> TPixel4DImageType;
129 typedef itk::Image<double, 3> Double3DImageType;
130 typedef itk::Image<double, 4> Double4DImageType;
131 typedef itk::ExtractImageFilter<TPixel4DImageType, TPixel4DImageType> ExtractImageFilterType;
132 typedef itk::ExtractImageFilter<Double4DImageType, Double3DImageType> Extract3DImageFilterType;
133 typedef itk::MeanProjectionImageFilter<TPixel4DImageType,Double4DImageType> MeanProjectionImageFilterType;
135 typename MeanProjectionImageFilterType::Pointer MeanProjectionImageFilter = MeanProjectionImageFilterType::New();
136 typename Extract3DImageFilterType::Pointer Extract3DImageFilter = Extract3DImageFilterType::New();
137 typename TPixel4DImageType::RegionType region_input = itkBaselineImage->GetLargestPossibleRegion();
139 if (m_BaselineEndTimeStep > region_input.GetSize()[3])
141 mitkThrow() <<
"Error in ConcentrationCurveGenerator::CalculateAverageBaselineImage. End time point is larger than total number of time points.";
144 typename ExtractImageFilterType::Pointer ExtractFilter = ExtractImageFilterType::New();
145 typename TPixel4DImageType::Pointer baselineTimeFrameImage = TPixel4DImageType::New();
146 typename TPixel4DImageType::RegionType extractionRegion;
147 typename TPixel4DImageType::SizeType size_input_aux = region_input.GetSize();
148 size_input_aux[3] = m_BaselineEndTimeStep - m_BaselineStartTimeStep + 1;
149 typename TPixel4DImageType::IndexType start_input_aux = region_input.GetIndex();
150 start_input_aux[3] = m_BaselineStartTimeStep;
151 extractionRegion.SetSize(size_input_aux);
152 extractionRegion.SetIndex(start_input_aux);
153 ExtractFilter->SetExtractionRegion(extractionRegion);
154 ExtractFilter->SetInput(itkBaselineImage);
155 ExtractFilter->SetDirectionCollapseToSubmatrix();
158 ExtractFilter->Update();
160 catch (itk::ExceptionObject & err)
162 std::cerr <<
"ExceptionObject caught!" << std::endl;
163 std::cerr << err << std::endl;
165 baselineTimeFrameImage = ExtractFilter->GetOutput();
166 MeanProjectionImageFilter->SetProjectionDimension(3);
167 MeanProjectionImageFilter->SetInput(baselineTimeFrameImage);
170 MeanProjectionImageFilter->Update();
172 catch (itk::ExceptionObject & err)
174 std::cerr <<
"ExceptionObject caught!" << std::endl;
175 std::cerr << err << std::endl;
177 Extract3DImageFilter->SetInput(MeanProjectionImageFilter->GetOutput());
178 size_input_aux[3] = 0;
179 start_input_aux[3] = 0;
180 extractionRegion.SetSize(size_input_aux);
181 extractionRegion.SetIndex(start_input_aux);
182 Extract3DImageFilter->SetExtractionRegion(extractionRegion);
183 Extract3DImageFilter->SetDirectionCollapseToSubmatrix();
186 Extract3DImageFilter->Update();
188 catch (itk::ExceptionObject & err)
190 std::cerr <<
"ExceptionObject caught!" << std::endl;
191 std::cerr << err << std::endl;
196 this->m_BaselineImage = mitkBaselineImage;
204 return m_ConvertSignalToConcentrationCurve_OutputImage;
209 template<
class TPixel_input,
class TPixel_baseline>
213 typedef itk::Image<TPixel_baseline, 3> BaselineImageType;
216 if (this->m_isT2weightedImage)
219 typedef itk::BinaryFunctorImageFilter<InputImageType, BaselineImageType, ConvertedImageType, ConversionFunctorT2Type> FilterT2Type;
222 ConversionFunctorT2Type ConversionT2Functor;
223 ConversionT2Functor.
initialize(this->m_T2Factor, this->m_T2EchoTime);
225 typename FilterT2Type::Pointer ConversionT2Filter = FilterT2Type::New();
227 ConversionT2Filter->SetFunctor(ConversionT2Functor);
228 ConversionT2Filter->SetInput1(itkInputImage);
229 ConversionT2Filter->SetInput2(itkBaselineImage);
231 ConversionT2Filter->Update();
238 if(this->m_isTurboFlashSequence)
241 typedef itk::BinaryFunctorImageFilter<InputImageType, BaselineImageType, ConvertedImageType, ConversionFunctorTurboFlashType> FilterTurboFlashType;
243 ConversionFunctorTurboFlashType ConversionTurboFlashFunctor;
244 ConversionTurboFlashFunctor.
initialize(this->m_RelaxationTime, this->m_Relaxivity, this->m_RecoveryTime);
246 typename FilterTurboFlashType::Pointer ConversionTurboFlashFilter = FilterTurboFlashType::New();
248 ConversionTurboFlashFilter->SetFunctor(ConversionTurboFlashFunctor);
249 ConversionTurboFlashFilter->SetInput1(itkInputImage);
250 ConversionTurboFlashFilter->SetInput2(itkBaselineImage);
252 ConversionTurboFlashFilter->Update();
253 m_ConvertSignalToConcentrationCurve_OutputImage =
mitk::ImportItkImage(ConversionTurboFlashFilter->GetOutput())->
Clone();
257 else if(this->m_UsingT1Map)
259 typename ConvertedImageType::Pointer itkT10Image = ConvertedImageType::New();
263 typedef itk::TernaryFunctorImageFilter<InputImageType, BaselineImageType, ConvertedImageType, ConvertedImageType, ConvertToConcentrationViaT1CalcFunctorType> FilterT1MapType;
265 ConvertToConcentrationViaT1CalcFunctorType ConversionT1MapFunctor;
266 ConversionT1MapFunctor.
initialize(this->m_Relaxivity, this->m_RecoveryTime, this->m_FlipAngle);
268 typename FilterT1MapType::Pointer ConversionT1MapFilter = FilterT1MapType::New();
270 ConversionT1MapFilter->SetFunctor(ConversionT1MapFunctor);
271 ConversionT1MapFilter->SetInput1(itkInputImage);
272 ConversionT1MapFilter->SetInput2(itkBaselineImage);
273 ConversionT1MapFilter->SetInput3(itkT10Image);
275 ConversionT1MapFilter->Update();
281 else if(this->m_AbsoluteSignalEnhancement)
284 typedef itk::BinaryFunctorImageFilter<InputImageType, BaselineImageType, ConvertedImageType, ConversionFunctorAbsoluteType> FilterAbsoluteType;
286 ConversionFunctorAbsoluteType ConversionAbsoluteFunctor;
287 ConversionAbsoluteFunctor.
initialize(this->m_Factor);
289 typename FilterAbsoluteType::Pointer ConversionAbsoluteFilter = FilterAbsoluteType::New();
291 ConversionAbsoluteFilter->SetFunctor(ConversionAbsoluteFunctor);
292 ConversionAbsoluteFilter->SetInput1(itkInputImage);
293 ConversionAbsoluteFilter->SetInput2(itkBaselineImage);
295 ConversionAbsoluteFilter->Update();
300 else if(this->m_RelativeSignalEnhancement)
303 typedef itk::BinaryFunctorImageFilter<InputImageType, BaselineImageType, ConvertedImageType, ConversionFunctorRelativeType> FilterRelativeType;
305 ConversionFunctorRelativeType ConversionRelativeFunctor;
306 ConversionRelativeFunctor.
initialize(this->m_Factor);
308 typename FilterRelativeType::Pointer ConversionRelativeFilter = FilterRelativeType::New();
310 ConversionRelativeFilter->SetFunctor(ConversionRelativeFunctor);
311 ConversionRelativeFilter->SetInput1(itkInputImage);
312 ConversionRelativeFilter->SetInput2(itkBaselineImage);
314 ConversionRelativeFilter->Update();
320 return m_ConvertSignalToConcentrationCurve_OutputImage;
void initialize(double factor)
#define AccessFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension)
Access a mitk-image with known dimension by an itk-image.
void initialize(double factor)
mitk::Image::Pointer convertToConcentration(const itk::Image< TPixel_input, 3 > *itkInputImage, const itk::Image< TPixel_baseline, 3 > *itkBaselineImage)
const mitk::PixelType GetPixelType(int n=0) const
Returns the PixelType of channel n.
~ConcentrationCurveGenerator() override
void PrepareBaselineImage()
Takes the 3D image of the first timepoint to set as baseline image.
::mitk::Image InputImageType
virtual void Convert()
loops over all timepoints, casts the current timepoint 3D mitk::image to itk and passes it to Convert...
Image::Pointer ImportItkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, const BaseGeometry *geometry=nullptr, bool update=true)
Imports an itk::Image (with a specific type) as an mitk::Image.Instantiates instance of ITKImageImpor...
void CalculateAverageBaselineImage(const itk::Image< TPixel, 4 > *itkBaselineImage)
Image::Pointer GetConvertedImage()
Image class for storing images.
void initialize(double relaxationtime, double relaxivity, double recoverytime)
mitk::Image::Pointer ConvertSignalToConcentrationCurve(const mitk::Image *inputImage, const mitk::Image *baselineImage)
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
#define AccessTwoImagesFixedDimensionByItk(mitkImage1, mitkImage2, itkImageTypeFunction, dimension)
Access two mitk-images with known dimension by itk-images.
ConcentrationCurveGenerator()
void initialize(double relaxivity, double TR, double flipangle)
ImageReadAccessor class to get locked read access for a particular image part.
const void * GetData() const
Gives const access to the data.
Class for defining the data type of pixels.
void initialize(double factor, double TE)