]> Creatis software - clitk.git/blob - tools/clitkImageGradientMagnitudeGenericFilter.txx
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
[clitk.git] / tools / clitkImageGradientMagnitudeGenericFilter.txx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
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
8
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.
12
13   It is distributed under dual licence
14
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
20
21 /* =================================================
22  * @file   clitkImageGradientMagnitudeGenericFilter.txx
23  * @author Jef Vandemeulebroucke <jef@creatis.insa-lyon.fr>
24  * @date   29 june 2009
25  *
26  * @brief
27  *
28  ===================================================*/
29
30 // itk include
31 #include "itkGradientMagnitudeImageFilter.h"
32 #include "itkLabelStatisticsImageFilter.h"
33 #include "itkMaskImageFilter.h"
34 #include "itkMaskNegatedImageFilter.h"
35 #include <clitkCommon.h>
36
37 namespace clitk
38 {
39
40     //--------------------------------------------------------------------
41     template<class args_info_type>
42     ImageGradientMagnitudeGenericFilter<args_info_type>::ImageGradientMagnitudeGenericFilter():
43         ImageToImageGenericFilter<Self>("ImageGradientMagnitude")
44     {
45         InitializeImageType<2>();
46         InitializeImageType<3>();
47     }
48     //--------------------------------------------------------------------
49
50
51     //--------------------------------------------------------------------
52     template<class args_info_type>
53     template<unsigned int Dim>
54     void ImageGradientMagnitudeGenericFilter<args_info_type>::InitializeImageType()
55     {
56         ADD_DEFAULT_IMAGE_TYPES(Dim);
57     }
58     //--------------------------------------------------------------------
59
60
61     //--------------------------------------------------------------------
62     template<class args_info_type>
63     void ImageGradientMagnitudeGenericFilter<args_info_type>::SetArgsInfo(const args_info_type & a)
64     {
65         mArgsInfo=a;
66         this->SetIOVerbose(mArgsInfo.verbose_flag);
67         if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes();
68
69         if (mArgsInfo.input_given) {
70             this->SetInputFilename(mArgsInfo.input_arg);
71         }
72         if (mArgsInfo.output_given) {
73             this->SetOutputFilename(mArgsInfo.output_arg);
74         }
75         //
76         if (mArgsInfo.normalize_flag) {
77             this->m_NormalizeOutput = 1;
78         }
79         else {
80             this->m_NormalizeOutput = 0;
81         }
82         if (mArgsInfo.mask_given) {
83           this->AddInputFilename(mArgsInfo.mask_arg);
84         }
85     }
86     //--------------------------------------------------------------------
87
88     //--------------------------------------------------------------------
89     // Update with the number of dimensions and the pixeltype
90     //--------------------------------------------------------------------
91     template<class args_info_type>
92     template<class InputImageType>
93     void
94     ImageGradientMagnitudeGenericFilter<args_info_type>::UpdateWithInputImageType()
95     {
96         // Main filter
97         typedef typename InputImageType::PixelType InputPixelType;
98         typedef itk::Image<float, InputImageType::ImageDimension> OutputImageType;
99         typedef itk::Image<unsigned char, OutputImageType::ImageDimension> MaskImageType;
100
101         // Reading input
102         typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
103
104         typename MaskImageType::Pointer mask = NULL;
105         if(mArgsInfo.mask_given) {
106             mask = this->template GetInput<MaskImageType>(1);
107         }
108         else {
109             mask = MaskImageType::New();
110             mask->SetRegions(input->GetLargestPossibleRegion());
111             mask->SetOrigin(input->GetOrigin());
112             mask->SetSpacing(input->GetSpacing());
113             mask->Allocate();
114             mask->FillBuffer(1);
115         }
116
117
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());
128
129         // Filter
130         typedef itk::GradientMagnitudeImageFilter<InputImageType, OutputImageType> GradientMagnitudeImageFilterType;
131         typename GradientMagnitudeImageFilterType::Pointer gradientFilter=GradientMagnitudeImageFilterType::New();
132         gradientFilter->SetInput(input);
133         gradientFilter->Update();
134         // Set iterator
135         typedef itk::ImageRegionIterator<OutputImageType> IteratorType;
136         IteratorType it(gradientFilter->GetOutput(), gradientFilter->GetOutput()->GetLargestPossibleRegion());
137
138         // Set mask iterator
139         typedef itk::ImageRegionIterator<MaskImageType> IteratorMaskType;
140         IteratorMaskType itm(mask, mask->GetLargestPossibleRegion());
141
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();
151
152         //std::cout << "Number of labels: " << labelStatisticsImageFilter->GetNumberOfLabels() << std::endl;
153
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;
158
159         it.GoToBegin();
160         ito.GoToBegin();
161         itm.GoToBegin();
162
163         while (!ito.IsAtEnd()) {
164             if(m_NormalizeOutput && itm.Get() == 1) {
165                 ito.Set(((float) it.Get() - minImg)/(maxImg-minImg));
166             }
167             if (m_NormalizeOutput == 0 && itm.Get() == 1) {
168                 ito.Set((float) it.Get());
169             }
170             ++it;
171             ++ito;
172             ++itm;
173         }
174
175         //typename OutputImageType::Pointer outputImage = gradientFilter->GetOutput();
176         this->template SetNextOutput<OutputImageType>(outputImage);
177     }
178     //--------------------------------------------------------------------
179
180
181 }//end clitk
182
183 #endif //#define clitkImageGradientMagnitudeGenericFilter_txx