]> Creatis software - clitk.git/blob - itk/clitkAutoCropFilter.txx
6ffb6e537786056ef875be14a9f354d430e4445e
[clitk.git] / itk / clitkAutoCropFilter.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://oncora1.lyon.fnclcc.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
19 #ifndef CLITKAUTOCROPFILTER_TXX
20 #define CLITKAUTOCROPFILTER_TXX
21
22 // clitk
23 #include "clitkCommon.h"
24
25 // itk
26 #include "itkAutoCropLabelMapFilter.h"
27 #include "itkStatisticsLabelObject.h"
28 #include "itkLabelImageToLabelMapFilter.h"
29 #include "itkLabelMapToLabelImageFilter.h"
30 #include "itkRegionOfInterestImageFilter.h"
31 #include "itkExtractImageFilter.h"
32
33 namespace clitk {
34
35   //--------------------------------------------------------------------
36   template <class ImageType>
37   AutoCropFilter<ImageType>::
38   AutoCropFilter():itk::ImageToImageFilter<ImageType, ImageType>() {
39     this->SetNumberOfRequiredInputs(1);
40     m_BackgroundValue  = 0;
41     UseBorderOn();
42   }
43   //--------------------------------------------------------------------
44
45
46   //--------------------------------------------------------------------
47   template <class ImageType>
48   void 
49   AutoCropFilter<ImageType>::
50   SetInput(const ImageType * image) {
51     // Process object is not const-correct so the const casting is required.
52     this->SetNthInput(0, const_cast<ImageType *>( image ));
53   }
54   //--------------------------------------------------------------------
55   
56
57   //--------------------------------------------------------------------
58   template <class ImageType>
59   void 
60   AutoCropFilter<ImageType>::  
61   SetBackgroundValue(ImagePixelType p) {
62     m_BackgroundValue = p;
63   }
64   //--------------------------------------------------------------------
65
66
67   //--------------------------------------------------------------------
68   template <class ImageType>
69   void 
70   AutoCropFilter<ImageType>::
71   GenerateOutputInformation() {    
72
73     // Superclass
74     // do not call the superclass' implementation of this method since
75     // this filter allows the input the output to be of different dimensions
76     // Superclass::GenerateOutputInformation();
77
78     // Get input pointers
79     ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
80     
81     // Get output pointer
82     ImagePointer output = this->GetOutput(0);
83   
84     // Convert to LabelMap
85     static const unsigned int Dim = ImageType::ImageDimension;
86     //    typedef unsigned long LabelType; // unsigned long needed (!!??)
87     typedef itk::StatisticsLabelObject< LabelType, Dim > LabelObjectType;
88     typedef itk::LabelMap< LabelObjectType > LabelMapType;
89     typedef itk::LabelImageToLabelMapFilter<ImageType, LabelMapType> ImageToMapFilterType;
90     typename ImageToMapFilterType::Pointer imageToLabelFilter = ImageToMapFilterType::New();  
91     imageToLabelFilter->SetBackgroundValue(m_BackgroundValue);
92     imageToLabelFilter->SetInput(input);
93     
94     // AutoCrop
95     typedef itk::AutoCropLabelMapFilter<LabelMapType> AutoCropFilterType;
96     typename AutoCropFilterType::Pointer autoCropFilter = AutoCropFilterType::New();
97     autoCropFilter->SetInput(imageToLabelFilter->GetOutput());
98     //    autoCropFilter->ReleaseDataFlagOff(); 
99     if (GetUseBorder()) {
100       typename ImageType::SizeType s;
101       for(uint i=0; i<ImageType::ImageDimension; i++) s[i] = 1;
102       autoCropFilter->SetCropBorder(s);
103     }
104     autoCropFilter->ReleaseDataFlagOn(); 
105
106     // Convert to LabelImage
107     typedef itk::LabelMapToLabelImageFilter<LabelMapType, ImageType> MapToImageFilterType;
108     typename MapToImageFilterType::Pointer labelToImageFilter = MapToImageFilterType::New();       
109     labelToImageFilter->SetInput(autoCropFilter->GetOutput());
110
111     // Go ! (needed)
112     labelToImageFilter->Update();
113     m_labeImage = labelToImageFilter->GetOutput();
114
115     // Update the output size
116     m_Region = m_labeImage->GetLargestPossibleRegion();
117     // Sometimes the index is 9223372036854775807 ???
118     if (m_Region.GetIndex()[0] > 99999) {
119       std::cerr << "Warning !! BUG int clitkAutoCropFilter ?" << std::endl;
120       typename ImageType::IndexType index; 
121       index.Fill(0);
122       m_Region.SetIndex(index);
123     }
124
125     // Set the region to output
126     output->SetLargestPossibleRegion(m_Region);
127     output->SetRequestedRegion(m_Region);
128     output->SetBufferedRegion(m_Region);
129     output->SetRegions(m_Region);
130   }
131   //--------------------------------------------------------------------
132    
133   //--------------------------------------------------------------------
134   template <class ImageType>
135   void 
136   AutoCropFilter<ImageType>::
137   GenerateData() {
138     // Get input pointers
139     ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
140   
141     // Extract the region with RegionOfInterestImageFilter or ExtractImageFilter ? 
142     // The second is when reducing the nb of dimension (index always zero)
143     // The first keep index. 
144     // OLD : typedef itk::ExtractImageFilter<ImageType, ImageType> CropFilterType;
145     // OLD : cropFilter->SetExtractionRegion(m_Region);
146
147     typedef itk::RegionOfInterestImageFilter<ImageType, ImageType> CropFilterType;
148     m_labeImage->SetRequestedRegion(m_labeImage->GetLargestPossibleRegion());
149     typename CropFilterType::Pointer cropFilter = CropFilterType::New();
150     cropFilter->SetInput(m_labeImage);
151     cropFilter->SetReleaseDataFlag(this->GetReleaseDataFlag());
152     cropFilter->SetRegionOfInterest(m_Region);
153
154     // Go ! 
155     cropFilter->Update();
156
157     // Get (graft) output (SetNthOutput does not fit here because of Origin).
158     this->GraftOutput(cropFilter->GetOutput());
159   }
160   //--------------------------------------------------------------------
161    
162 }//end clitk
163  
164 #endif //#define CLITKAUTOCROPFILTER