1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #ifndef clitkImageGradientMagnitudeGenericFilter_txx
19 #define clitkImageGradientMagnitudeGenericFilter_txx
21 /* =================================================
22 * @file clitkImageGradientMagnitudeGenericFilter.txx
23 * @author Jef Vandemeulebroucke <jef@creatis.insa-lyon.fr>
28 ===================================================*/
31 #include "itkGradientMagnitudeImageFilter.h"
32 #include "itkLabelStatisticsImageFilter.h""
33 #include "itkMaskImageFilter.h"
34 #include "itkMaskNegatedImageFilter.h"
35 #include <clitkCommon.h>
40 //--------------------------------------------------------------------
41 template<class args_info_type>
42 ImageGradientMagnitudeGenericFilter<args_info_type>::ImageGradientMagnitudeGenericFilter():
43 ImageToImageGenericFilter<Self>("ImageGradientMagnitude")
45 InitializeImageType<2>();
46 InitializeImageType<3>();
48 //--------------------------------------------------------------------
51 //--------------------------------------------------------------------
52 template<class args_info_type>
53 template<unsigned int Dim>
54 void ImageGradientMagnitudeGenericFilter<args_info_type>::InitializeImageType()
56 ADD_DEFAULT_IMAGE_TYPES(Dim);
58 //--------------------------------------------------------------------
61 //--------------------------------------------------------------------
62 template<class args_info_type>
63 void ImageGradientMagnitudeGenericFilter<args_info_type>::SetArgsInfo(const args_info_type & a)
66 this->SetIOVerbose(mArgsInfo.verbose_flag);
67 if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes();
69 if (mArgsInfo.input_given) {
70 this->SetInputFilename(mArgsInfo.input_arg);
72 if (mArgsInfo.output_given) {
73 this->SetOutputFilename(mArgsInfo.output_arg);
76 if (mArgsInfo.normalize_flag) {
77 this->m_NormalizeOutput = 1;
80 this->m_NormalizeOutput = 0;
82 if (mArgsInfo.mask_given) {
83 this->AddInputFilename(mArgsInfo.mask_arg);
86 //--------------------------------------------------------------------
88 //--------------------------------------------------------------------
89 // Update with the number of dimensions and the pixeltype
90 //--------------------------------------------------------------------
91 template<class args_info_type>
92 template<class InputImageType>
94 ImageGradientMagnitudeGenericFilter<args_info_type>::UpdateWithInputImageType()
97 typedef typename InputImageType::PixelType InputPixelType;
98 typedef itk::Image<float, InputImageType::ImageDimension> OutputImageType;
99 typedef itk::Image<unsigned char, OutputImageType::ImageDimension> MaskImageType;
102 typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
104 typename MaskImageType::Pointer mask = NULL;
105 if(mArgsInfo.mask_given) {
106 mask = this->template GetInput<MaskImageType>(1);
109 mask = MaskImageType::New();
110 mask->SetRegions(input->GetLargestPossibleRegion());
111 mask->SetOrigin(input->GetOrigin());
112 mask->SetSpacing(input->GetSpacing());
118 // Create output image
119 typename OutputImageType::Pointer outputImage = OutputImageType::New();
120 outputImage->SetRegions(input->GetLargestPossibleRegion());
121 outputImage->SetOrigin(input->GetOrigin());
122 outputImage->SetSpacing(input->GetSpacing());
123 outputImage->Allocate();
124 outputImage->FillBuffer(0.0);
125 // Set output iterator
126 typedef itk::ImageRegionIterator<OutputImageType> IteratorOutputType;
127 IteratorOutputType ito = IteratorOutputType(outputImage, outputImage->GetLargestPossibleRegion());
130 typedef itk::GradientMagnitudeImageFilter<InputImageType, OutputImageType> GradientMagnitudeImageFilterType;
131 typename GradientMagnitudeImageFilterType::Pointer gradientFilter=GradientMagnitudeImageFilterType::New();
132 gradientFilter->SetInput(input);
133 gradientFilter->Update();
135 typedef itk::ImageRegionIterator<OutputImageType> IteratorType;
136 IteratorType it(gradientFilter->GetOutput(), gradientFilter->GetOutput()->GetLargestPossibleRegion());
139 typedef itk::ImageRegionIterator<MaskImageType> IteratorMaskType;
140 IteratorMaskType itm(mask, mask->GetLargestPossibleRegion());
142 //typedef itk::MinimumMaximumImageCalculator <OutputImageType> ImageCalculatorFilterType;
143 //typename ImageCalculatorFilterType::Pointer imageCalculatorFilter = ImageCalculatorFilterType::New();
144 //imageCalculatorFilter->SetImage(gradientFilter->GetOutput());
145 //imageCalculatorFilter->Compute();
146 typedef itk::LabelStatisticsImageFilter< OutputImageType, MaskImageType > LabelStatisticsImageFilterType;
147 typename LabelStatisticsImageFilterType::Pointer labelStatisticsImageFilter = LabelStatisticsImageFilterType::New();
148 labelStatisticsImageFilter->SetLabelInput( mask );
149 labelStatisticsImageFilter->SetInput(gradientFilter->GetOutput());
150 labelStatisticsImageFilter->Update();
152 //std::cout << "Number of labels: " << labelStatisticsImageFilter->GetNumberOfLabels() << std::endl;
154 float minImg = labelStatisticsImageFilter->GetMinimum(1);
155 //std::cout << "minImg: " << minImg << std::endl;
156 float maxImg = labelStatisticsImageFilter->GetMaximum(1);
157 //std::cout << "maxImg: " << maxImg << std::endl;
163 while (!ito.IsAtEnd()) {
164 if(m_NormalizeOutput && itm.Get() == 1) {
165 ito.Set(((float) it.Get() - minImg)/(maxImg-minImg));
167 if (m_NormalizeOutput == 0 && itm.Get() == 1) {
168 ito.Set((float) it.Get());
175 //typename OutputImageType::Pointer outputImage = gradientFilter->GetOutput();
176 this->template SetNextOutput<OutputImageType>(outputImage);
178 //--------------------------------------------------------------------
183 #endif //#define clitkImageGradientMagnitudeGenericFilter_txx