]> Creatis software - clitk.git/blob - segmentation/clitkExtractLymphStationsFilter.txx
small bugs corrections
[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   // Station 8
56   SetDistanceMaxToAnteriorPartOfTheSpine(10);
57   MaskImagePointType p;
58   p[0] = 15; p[1] = 2; p[2] = 1;
59   SetEsophagusDiltationForAnt(p);
60   p[0] = 5; p[1] = 10; p[2] = 1;
61   SetEsophagusDiltationForRight(p);
62   SetFuzzyThresholdForS8(0.5);
63
64   // Station 7
65   SetFuzzyThreshold(0.5);
66   SetStation7Filename("station7.mhd");
67 }
68 //--------------------------------------------------------------------
69
70
71 //--------------------------------------------------------------------
72 template <class TImageType>
73 void 
74 clitk::ExtractLymphStationsFilter<TImageType>::
75 GenerateOutputInformation() { 
76   // Get inputs
77   LoadAFDB();
78   m_Input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
79   m_Mediastinum = GetAFDB()->template GetImage <MaskImageType>("Mediastinum");
80
81   // Extract Station8
82   StartNewStep("Station 8");
83   StartSubStep(); 
84   ExtractStation_8();
85   StopSubStep();
86
87   // Compute some interesting points in trachea
88   // ( ALTERNATIVE -> SKELETON ANALYSIS ? 
89   //    Pb : not sufficient for mostXX points ... ) 
90
91   /* ==> todo (but why ???)
92      ComputeTracheaCentroidsAboveCarina();
93      ComputeBronchusExtremaPointsBelowCarina();
94   */
95
96   if (0) { // temporary suppress
97     // Extract Station7
98     StartNewStep("Station 7");
99     StartSubStep();
100     ExtractStation_7();
101     StopSubStep();
102
103     // Extract Station4RL
104     StartNewStep("Station 4RL");
105     StartSubStep();
106     //ExtractStation_4RL();
107     StopSubStep();
108   }
109
110
111   //
112   //  typedef clitk::BooleanOperatorLabelImageFilter<MaskImageType> BFilter;
113   //BFilter::Pointer merge = BFilter::New();  
114   // writeImage<MaskImageType>(m_Output, "ouput.mhd");
115   //writeImage<MaskImageType>(m_Working_Support, "ws.mhd");
116   /*merge->SetInput1(m_Station7);
117     merge->SetInput2(m_Station4RL); // support
118     merge->SetOperationType(BFilter::AndNot); CHANGE OPERATOR
119     merge->SetForegroundValue(4);
120     merge->Update();
121     m_Output = merge->GetOutput();
122   */
123 }
124 //--------------------------------------------------------------------
125
126
127 //--------------------------------------------------------------------
128 template <class TImageType>
129 void 
130 clitk::ExtractLymphStationsFilter<TImageType>::
131 GenerateInputRequestedRegion() {
132   DD("GenerateInputRequestedRegion (nothing?)");
133 }
134 //--------------------------------------------------------------------
135
136
137 //--------------------------------------------------------------------
138 template <class TImageType>
139 void 
140 clitk::ExtractLymphStationsFilter<TImageType>::
141 GenerateData() {
142   DD("GenerateData, graft output");
143
144   // Final Step -> graft output (if SetNthOutput => redo)
145   this->GraftOutput(m_ListOfStations["8"]);
146 }
147 //--------------------------------------------------------------------
148   
149
150 //--------------------------------------------------------------------
151 template <class TImageType>
152 void 
153 clitk::ExtractLymphStationsFilter<TImageType>::
154 ExtractStation_8() {
155
156   // Check if m_ListOfStations["8"] exist. If yes -> use it as initial
157   // support instead of m_Mediastinum
158   if (m_ListOfStations["8"]) {
159     DD("Station 8 support already exist -> use it");
160     m_Working_Support = m_ListOfStations["8"];
161   }
162   else m_Working_Support = m_Mediastinum;
163
164   ExtractStation_8_SI_Limits();
165   ExtractStation_8_Post_Limits();
166   ExtractStation_8_Ant_Limits();
167   ExtractStation_8_LR_Limits();
168   // ExtractStation_8_LR_Limits();
169 }
170 //--------------------------------------------------------------------
171
172
173 //--------------------------------------------------------------------
174 template <class TImageType>
175 void 
176 clitk::ExtractLymphStationsFilter<TImageType>::
177 ExtractStation_7() {
178   if (m_ListOfStations["7"]) {
179     DD("Station 7 support already exist -> use it");
180     m_Working_Support = m_ListOfStations["7"];
181   }
182   else m_Working_Support = m_Mediastinum;
183   ExtractStation_7_SI_Limits();
184   ExtractStation_7_RL_Limits();
185   ExtractStation_7_Posterior_Limits();
186 }
187 //--------------------------------------------------------------------
188
189
190 //--------------------------------------------------------------------
191 template <class TImageType>
192 void 
193 clitk::ExtractLymphStationsFilter<TImageType>::
194 ExtractStation_4RL() {
195   /*
196     WARNING ONLY 4R FIRST !!! (not same inf limits)
197   */    
198   ExtractStation_4RL_SI_Limits();
199   ExtractStation_4RL_LR_Limits();
200   ExtractStation_4RL_AP_Limits();
201 }
202 //--------------------------------------------------------------------
203
204
205 //--------------------------------------------------------------------
206 template <class TImageType>
207 void 
208 clitk::ExtractLymphStationsFilter<TImageType>::
209 FindExtremaPointsInBronchus(MaskImagePointer input, 
210                             int direction,
211                             double distance_max_from_center_point, 
212                             ListOfPointsType & LR, 
213                             ListOfPointsType & Ant, 
214                             ListOfPointsType & Post)
215 {
216
217   // Other solution ==> with auto bounding box ! (but pb to prevent to
218   // be too distant from the center point
219
220   // Extract slices
221   std::vector<typename MaskSliceType::Pointer> slices;
222   clitk::ExtractSlices<MaskImageType>(input, 2, slices);
223   
224   // Loop on slices
225   bool found;
226   for(uint i=0; i<slices.size(); i++) {
227     /*
228     // Keep main CCL
229     slices[i] = Labelize<MaskSliceType>(slices[i], 0, true, 10);
230     slices[i] = KeepLabels<MaskSliceType>(slices[i], 
231                                           GetBackgroundValue(), 
232                                           GetForegroundValue(), 1, 1, true);
233     */
234
235     // ------- Find rightmost or leftmost point  ------- 
236     MaskSliceType::PointType LRMost;
237     found = 
238       clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i], 
239                                                               GetBackgroundValue(), 
240                                                               0, // axis XY
241                                                               (direction==0?false:true),  // right or left according to direction
242                                                               LRMost);
243     // ------- Find postmost point  ------- 
244     MaskSliceType::PointType postMost;
245     found = 
246       clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i], 
247                                                               GetBackgroundValue(), 
248                                                               1, false, LRMost, 
249                                                               distance_max_from_center_point, 
250                                                               postMost);
251     // ------- Find antmost point  ------- 
252     MaskSliceType::PointType antMost;
253     found = 
254       clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i], 
255                                                               GetBackgroundValue(), 
256                                                               1, true, LRMost, 
257                                                               distance_max_from_center_point, 
258                                                               antMost);
259     // Only add point if found
260     if (found)  {
261       // ------- Convert 2D to 3D points --------
262       MaskImageType::PointType p;
263       clitk::PointsUtils<MaskImageType>::Convert2DTo3D(LRMost, input, i, p);
264       LR.push_back(p); 
265       clitk::PointsUtils<MaskImageType>::Convert2DTo3D(antMost, input, i, p);
266       Ant.push_back(p);
267       clitk::PointsUtils<MaskImageType>::Convert2DTo3D(postMost, input, i, p);
268       Post.push_back(p);
269     }
270   }
271
272 //--------------------------------------------------------------------
273
274 #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX