]> Creatis software - clitk.git/blob - segmentation/clitkExtractLymphStationsFilter.txx
small improvement for S8
[clitk.git] / segmentation / clitkExtractLymphStationsFilter.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 CLITKEXTRACTLYMPHSTATIONSFILTER_TXX
20 #define CLITKEXTRACTLYMPHSTATIONSFILTER_TXX
21
22 // clitk
23 #include "clitkCommon.h"
24 #include "clitkExtractLymphStationsFilter.h"
25 #include "clitkAddRelativePositionConstraintToLabelImageFilter.h"
26 #include "clitkSegmentationUtils.h"
27 #include "clitkAutoCropFilter.h"
28 #include "clitkSegmentationUtils.h"
29 #include "clitkSliceBySliceRelativePositionFilter.h"
30
31 // itk
32 #include <itkStatisticsLabelMapFilter.h>
33 #include <itkLabelImageToStatisticsLabelMapFilter.h>
34 #include <itkRegionOfInterestImageFilter.h>
35 #include <itkBinaryThresholdImageFilter.h>
36 #include <itkImageSliceConstIteratorWithIndex.h>
37 #include <itkImageSliceIteratorWithIndex.h>
38 #include <itkBinaryThinningImageFilter.h>
39
40 // itk ENST
41 #include "RelativePositionPropImageFilter.h"
42
43 //--------------------------------------------------------------------
44 template <class TImageType>
45 clitk::ExtractLymphStationsFilter<TImageType>::
46 ExtractLymphStationsFilter():
47   clitk::FilterBase(),
48   clitk::FilterWithAnatomicalFeatureDatabaseManagement(),
49   itk::ImageToImageFilter<TImageType, MaskImageType>()
50 {
51   this->SetNumberOfRequiredInputs(1);
52   SetBackgroundValue(0);
53   SetForegroundValue(1);
54
55   // Default values
56   ExtractStation_8_SetDefaultValues();
57   ExtractStation_3P_SetDefaultValues();
58
59   // Station 7
60   SetFuzzyThreshold(0.5);
61   SetStation7Filename("station7.mhd");
62 }
63 //--------------------------------------------------------------------
64
65
66 //--------------------------------------------------------------------
67 template <class TImageType>
68 void 
69 clitk::ExtractLymphStationsFilter<TImageType>::
70 GenerateOutputInformation() { 
71   // Get inputs
72   LoadAFDB();
73   m_Input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
74   m_Mediastinum = GetAFDB()->template GetImage <MaskImageType>("Mediastinum");
75
76   // Extract Station8
77   StartNewStep("Station 8");
78   StartSubStep(); 
79   ExtractStation_8();
80   StopSubStep();
81
82   // Extract Station3P
83   StartNewStep("Station 3P");
84   StartSubStep(); 
85   ExtractStation_3P();
86   StopSubStep();
87
88   if (0) { // temporary suppress
89     // Extract Station7
90     StartNewStep("Station 7");
91     StartSubStep();
92     ExtractStation_7();
93     StopSubStep();
94
95     // Extract Station4RL
96     StartNewStep("Station 4RL");
97     StartSubStep();
98     //ExtractStation_4RL();
99     StopSubStep();
100   }
101
102
103   //
104   //  typedef clitk::BooleanOperatorLabelImageFilter<MaskImageType> BFilter;
105   //BFilter::Pointer merge = BFilter::New();  
106   // writeImage<MaskImageType>(m_Output, "ouput.mhd");
107   //writeImage<MaskImageType>(m_Working_Support, "ws.mhd");
108   /*merge->SetInput1(m_Station7);
109     merge->SetInput2(m_Station4RL); // support
110     merge->SetOperationType(BFilter::AndNot); CHANGE OPERATOR
111     merge->SetForegroundValue(4);
112     merge->Update();
113     m_Output = merge->GetOutput();
114   */
115 }
116 //--------------------------------------------------------------------
117
118
119 //--------------------------------------------------------------------
120 template <class TImageType>
121 void 
122 clitk::ExtractLymphStationsFilter<TImageType>::
123 GenerateInputRequestedRegion() {
124   //DD("GenerateInputRequestedRegion (nothing?)");
125 }
126 //--------------------------------------------------------------------
127
128
129 //--------------------------------------------------------------------
130 template <class TImageType>
131 void 
132 clitk::ExtractLymphStationsFilter<TImageType>::
133 GenerateData() {
134   DD("GenerateData, graft output");
135
136   // Final Step -> graft output (if SetNthOutput => redo)
137   this->GraftOutput(m_ListOfStations["8"]);
138 }
139 //--------------------------------------------------------------------
140   
141
142 //--------------------------------------------------------------------
143 template <class TImageType>
144 bool 
145 clitk::ExtractLymphStationsFilter<TImageType>::
146 CheckForStation(std::string station) 
147 {
148   // Compute Station name
149   std::string s = "Station"+station;
150   
151
152   // Check if station already exist in DB
153   bool found = false;
154   if (GetAFDB()->TagExist(s)) {
155     m_ListOfStations[station] = GetAFDB()->template GetImage<MaskImageType>(s);
156     found = true;
157   }
158
159   // Define the starting support 
160   if (found && GetComputeStation(station)) {
161     std::cout << "Station " << station << " already exists, but re-computation forced." << std::endl;
162   }
163   if (!found || GetComputeStation(station)) {
164     m_Working_Support = m_Mediastinum = GetAFDB()->template GetImage<MaskImageType>("Mediastinum", true);
165     return true;
166   }
167   else {
168     std::cout << "Station " << station << " found. I used it" << std::endl;
169     return false;
170   }
171 }
172 //--------------------------------------------------------------------
173
174
175 //--------------------------------------------------------------------
176 template <class TImageType>
177 bool
178 clitk::ExtractLymphStationsFilter<TImageType>::
179 GetComputeStation(std::string station) 
180 {
181   return (m_ComputeStationMap.find(station) != m_ComputeStationMap.end());
182 }
183 //--------------------------------------------------------------------
184
185
186 //--------------------------------------------------------------------
187 template <class TImageType>
188 void
189 clitk::ExtractLymphStationsFilter<TImageType>::
190 AddComputeStation(std::string station) 
191 {
192   m_ComputeStationMap[station] = true;
193 }
194 //--------------------------------------------------------------------
195
196
197 //--------------------------------------------------------------------
198 template <class TImageType>
199 void 
200 clitk::ExtractLymphStationsFilter<TImageType>::
201 ExtractStation_8() 
202 {
203   if (CheckForStation("8")) {
204     ExtractStation_8_SI_Limits();
205     ExtractStation_8_Post_Limits();
206     ExtractStation_8_Ant_Sup_Limits();
207     ExtractStation_8_Ant_Inf_Limits();
208     ExtractStation_8_LR_1_Limits();
209     ExtractStation_8_LR_2_Limits();
210     ExtractStation_8_LR_Limits();
211     ExtractStation_8_Ant_Injected_Limits();
212     ExtractStation_8_Single_CCL_Limits();
213     ExtractStation_8_Remove_Structures();
214     // Store image filenames into AFDB 
215     writeImage<MaskImageType>(m_ListOfStations["8"], "seg/Station8.mhd");
216     GetAFDB()->SetImageFilename("Station8", "seg/Station8.mhd");  
217     WriteAFDB();
218   }
219 }
220 //--------------------------------------------------------------------
221
222
223 //--------------------------------------------------------------------
224 template <class TImageType>
225 void 
226 clitk::ExtractLymphStationsFilter<TImageType>::
227 ExtractStation_3P()
228 {
229   if (CheckForStation("3P")) {
230     ExtractStation_3P_SI_Limits();
231     ExtractStation_3P_Remove_Structures();
232     ExtractStation_3P_Ant_Limits();
233     ExtractStation_3P_Post_Limits();
234     ExtractStation_3P_LR_sup_Limits();
235     ExtractStation_3P_LR_inf_Limits();
236     // Store image filenames into AFDB 
237     writeImage<MaskImageType>(m_ListOfStations["3P"], "seg/Station3P.mhd");
238     GetAFDB()->SetImageFilename("Station3P", "seg/Station3P.mhd"); 
239     WriteAFDB(); 
240   }
241 }
242 //--------------------------------------------------------------------
243
244
245 //--------------------------------------------------------------------
246 template <class TImageType>
247 void 
248 clitk::ExtractLymphStationsFilter<TImageType>::
249 ExtractStation_7() {
250   if (m_ListOfStations["7"]) {
251     DD("Station 7 support already exist -> use it");
252     m_Working_Support = m_ListOfStations["7"];
253   }
254   else m_Working_Support = m_Mediastinum;
255   ExtractStation_7_SI_Limits();
256   ExtractStation_7_RL_Limits();
257   ExtractStation_7_Posterior_Limits();
258 }
259 //--------------------------------------------------------------------
260
261
262 //--------------------------------------------------------------------
263 template <class TImageType>
264 void 
265 clitk::ExtractLymphStationsFilter<TImageType>::
266 ExtractStation_4RL() {
267   /*
268     WARNING ONLY 4R FIRST !!! (not same inf limits)
269   */    
270   ExtractStation_4RL_SI_Limits();
271   ExtractStation_4RL_LR_Limits();
272   ExtractStation_4RL_AP_Limits();
273 }
274 //--------------------------------------------------------------------
275
276
277 //--------------------------------------------------------------------
278
279
280
281 #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX