]> Creatis software - clitk.git/blob - segmentation/clitkExtractLymphStationsFilter.txx
correct options scheme
[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_AP_Limits();
166   // ExtractStation_8_LR_Limits();
167 }
168 //--------------------------------------------------------------------
169
170
171 //--------------------------------------------------------------------
172 template <class TImageType>
173 void 
174 clitk::ExtractLymphStationsFilter<TImageType>::
175 ExtractStation_7() {
176   if (m_ListOfStations["7"]) {
177     DD("Station 7 support already exist -> use it");
178     m_Working_Support = m_ListOfStations["7"];
179   }
180   else m_Working_Support = m_Mediastinum;
181   ExtractStation_7_SI_Limits();
182   ExtractStation_7_RL_Limits();
183   ExtractStation_7_Posterior_Limits();
184 }
185 //--------------------------------------------------------------------
186
187
188 //--------------------------------------------------------------------
189 template <class TImageType>
190 void 
191 clitk::ExtractLymphStationsFilter<TImageType>::
192 ExtractStation_4RL() {
193   /*
194     WARNING ONLY 4R FIRST !!! (not same inf limits)
195   */    
196   ExtractStation_4RL_SI_Limits();
197   ExtractStation_4RL_LR_Limits();
198   ExtractStation_4RL_AP_Limits();
199 }
200 //--------------------------------------------------------------------
201
202
203 //--------------------------------------------------------------------
204 template <class TImageType>
205 void 
206 clitk::ExtractLymphStationsFilter<TImageType>::
207 FindExtremaPointsInBronchus(MaskImagePointer input, 
208                             int direction,
209                             double distance_max_from_center_point, 
210                             ListOfPointsType & LR, 
211                             ListOfPointsType & Ant, 
212                             ListOfPointsType & Post)
213 {
214
215   // Other solution ==> with auto bounding box ! (but pb to prevent to
216   // be too distant from the center point
217
218   // Extract slices
219   std::vector<typename MaskSliceType::Pointer> slices;
220   clitk::ExtractSlices<MaskImageType>(input, 2, slices);
221   
222   // Loop on slices
223   bool found;
224   for(uint i=0; i<slices.size(); i++) {
225     /*
226     // Keep main CCL
227     slices[i] = Labelize<MaskSliceType>(slices[i], 0, true, 10);
228     slices[i] = KeepLabels<MaskSliceType>(slices[i], 
229                                           GetBackgroundValue(), 
230                                           GetForegroundValue(), 1, 1, true);
231     */
232
233     // ------- Find rightmost or leftmost point  ------- 
234     MaskSliceType::PointType LRMost;
235     found = 
236       clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i], 
237                                                               GetBackgroundValue(), 
238                                                               0, // axis XY
239                                                               (direction==0?false:true),  // right or left according to direction
240                                                               LRMost);
241     // ------- Find postmost point  ------- 
242     MaskSliceType::PointType postMost;
243     found = 
244       clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i], 
245                                                               GetBackgroundValue(), 
246                                                               1, false, LRMost, 
247                                                               distance_max_from_center_point, 
248                                                               postMost);
249     // ------- Find antmost point  ------- 
250     MaskSliceType::PointType antMost;
251     found = 
252       clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i], 
253                                                               GetBackgroundValue(), 
254                                                               1, true, LRMost, 
255                                                               distance_max_from_center_point, 
256                                                               antMost);
257     // Only add point if found
258     if (found)  {
259       // ------- Convert 2D to 3D points --------
260       MaskImageType::PointType p;
261       clitk::PointsUtils<MaskImageType>::Convert2DTo3D(LRMost, input, i, p);
262       LR.push_back(p); 
263       clitk::PointsUtils<MaskImageType>::Convert2DTo3D(antMost, input, i, p);
264       Ant.push_back(p);
265       clitk::PointsUtils<MaskImageType>::Convert2DTo3D(postMost, input, i, p);
266       Post.push_back(p);
267     }
268   }
269
270 //--------------------------------------------------------------------
271
272 #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX