]> Creatis software - clitk.git/blob - segmentation/clitkExtractLymphStation_3P.txx
Update supports & stations 3A,3P
[clitk.git] / segmentation / clitkExtractLymphStation_3P.txx
1
2 //--------------------------------------------------------------------
3 template <class ImageType>
4 void 
5 clitk::ExtractLymphStationsFilter<ImageType>::
6 ExtractStation_3P_SetDefaultValues()
7 {
8 }
9 //--------------------------------------------------------------------
10
11
12 //--------------------------------------------------------------------
13 template <class TImageType>
14 void 
15 clitk::ExtractLymphStationsFilter<TImageType>::
16 ExtractStation_3P()
17 {
18   if (!CheckForStation("3P")) return;
19
20   // Get the current support 
21   StartNewStep("[Station 3P] Get the current 3P suppport");
22   m_Working_Support = m_ListOfSupports["S3P"];
23   m_ListOfStations["3P"] = m_Working_Support;
24   StopCurrentStep<MaskImageType>(m_Working_Support);
25   
26   // LR limits inferiorly
27   ExtractStation_3P_LR_inf_Limits();
28   
29   // LR limits superiorly => not here for the moment because not
30   //  clear in the def
31   // ExtractStation_3P_LR_sup_Limits_2(); //TODO
32   // ExtractStation_3P_LR_sup_Limits();   // old version to change
33   
34   ExtractStation_8_Single_CCL_Limits(); // YES 8 !
35   ExtractStation_3P_Remove_Structures(); // after CCL
36   
37   // Store image filenames into AFDB 
38   writeImage<MaskImageType>(m_ListOfStations["3P"], "seg/Station3P.mhd");
39   GetAFDB()->SetImageFilename("Station3P", "seg/Station3P.mhd"); 
40   WriteAFDB();   
41 }
42 //--------------------------------------------------------------------
43
44
45 //--------------------------------------------------------------------
46 template <class ImageType>
47 void 
48 clitk::ExtractLymphStationsFilter<ImageType>::
49 ExtractStation_3P_Remove_Structures() 
50 {
51   StartNewStep("[Station 3P] Remove some structures.");
52
53   Remove_Structures("3P", "Aorta");
54   Remove_Structures("3P", "VertebralBody");
55   Remove_Structures("3P", "SubclavianArteryLeft");
56   Remove_Structures("3P", "SubclavianArteryRight");
57   Remove_Structures("3P", "Esophagus");
58   Remove_Structures("3P", "AzygousVein");
59   Remove_Structures("3P", "Thyroid");
60   Remove_Structures("3P", "VertebralArtery");
61
62   StopCurrentStep<MaskImageType>(m_Working_Support);
63   m_ListOfStations["3P"] = m_Working_Support;
64 }
65 //--------------------------------------------------------------------
66
67
68 //--------------------------------------------------------------------
69 template <class ImageType>
70 void 
71 clitk::ExtractLymphStationsFilter<ImageType>::
72 ExtractStation_3P_LR_sup_Limits() 
73 {
74   /*
75     "On the right side, the limit is defined by the air–soft-tissue
76     interface. On the left side, it is defined by the air–tissue
77     interface superiorly (Fig. 2A–C) and the aorta inferiorly
78     (Figs. 2D–I and 3A–C)."
79
80     sup : 
81     Resizelike support : Trachea, SubclavianArtery
82     Trachea, slice by slice, get centroid trachea
83     SubclavianArtery, slice by slice, CCL
84     prendre la 1ère à L et R, not at Left
85     
86   */
87   StartNewStep("[Station 3P] Left/Right limits (superior part) ");
88
89   // Load structures
90   MaskImagePointer Trachea = GetAFDB()->template GetImage<MaskImageType>("Trachea");
91   MaskImagePointer SubclavianArtery = GetAFDB()->template GetImage<MaskImageType>("SubclavianArtery");
92   
93   // Crop like current support
94   Trachea = clitk::ResizeImageLike<MaskImageType>(Trachea, m_Working_Support, GetBackgroundValue());
95   SubclavianArtery = clitk::ResizeImageLike<MaskImageType>(SubclavianArtery, m_Working_Support, GetBackgroundValue());
96   
97   writeImage<MaskImageType>(Trachea, "tr.mhd");
98   writeImage<MaskImageType>(SubclavianArtery, "sca.mhd");
99   
100   // Get list of slices
101   std::vector<MaskSlicePointer> slices_support;
102   std::vector<MaskSlicePointer> slices_trachea;
103   std::vector<MaskSlicePointer> slices_subclavianartery;
104   clitk::ExtractSlices<MaskImageType>(m_Working_Support, 2, slices_support);
105   clitk::ExtractSlices<MaskImageType>(Trachea, 2, slices_trachea);
106   clitk::ExtractSlices<MaskImageType>(SubclavianArtery, 2, slices_subclavianartery);
107
108   // Loop on slices
109   std::vector<MaskImagePointType> points;
110   MaskImagePointType p;
111   for(uint i=0; i<slices_support.size(); i++) {
112     // Get Trachea centroid
113     std::vector<typename MaskSliceType::PointType> centroids;
114     typename MaskSliceType::PointType c;
115     ComputeCentroids<MaskSliceType>(slices_trachea[i], GetBackgroundValue(), centroids);
116     c = centroids[1];
117
118     // [debug] Store point
119     clitk::PointsUtils<MaskImageType>::Convert2DTo3D(centroids[1], Trachea, i, p);
120     points.push_back(p);
121     
122     // Get Right and Left CCL in SubclavianArtery
123     slices_subclavianartery[i] = Labelize<MaskSliceType>(slices_subclavianartery[i], 0, true, 10);
124     ComputeCentroids<MaskSliceType>(slices_subclavianartery[i], GetBackgroundValue(), centroids);
125
126     if (centroids.size() > 1) {
127       // Determine the one at Right/Left -> first after Trachea
128       // centroid 
129       typename MaskSliceType::PointType right;
130       typename MaskSliceType::PointType left;
131       int label_right=-1;
132       int label_left=-1;
133       right[0] = c[0]-100;
134       left[0] = c[0]+100;
135       for(uint j=1; j<centroids.size(); j++) {
136         if (centroids[j][0] < c[0]) { // At Right of Trachea centroid
137           if (centroids[j][0] >= right[0]) {
138             right = centroids[j];
139             label_right = j;
140           }
141         }
142         if (centroids[j][0] > c[0]) { // At Left of Trachea centroid
143           if (centroids[j][0] <= left[0]) {
144             left = centroids[j];
145             label_left = j;
146           }
147         }
148       }
149
150       if (label_right != -1) {
151     
152         // Debug points
153         clitk::PointsUtils<MaskImageType>::Convert2DTo3D(centroids[label_right], SubclavianArtery, i, p);
154         points.push_back(p);
155
156         // Set Background and ForegroundValue according to label_right
157         MaskSlicePointer object = 
158           clitk::Binarize<MaskSliceType>(slices_subclavianartery[i], label_right, label_right, 
159                                          GetBackgroundValue(), GetForegroundValue());
160       
161         // Relative Position : not at Right
162         typedef clitk::AddRelativePositionConstraintToLabelImageFilter<MaskSliceType> RelPosFilterType;
163         typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
164         relPosFilter->VerboseStepFlagOff();
165         relPosFilter->WriteStepFlagOff();
166         relPosFilter->SetBackgroundValue(GetBackgroundValue());
167         relPosFilter->SetInput(slices_support[i]); 
168         relPosFilter->SetInputObject(object); 
169         relPosFilter->AddOrientationTypeString("R");
170         relPosFilter->SetInverseOrientationFlag(true);
171         //      relPosFilter->SetIntermediateSpacing(3);
172         relPosFilter->SetIntermediateSpacingFlag(false);
173         relPosFilter->SetFuzzyThreshold(0.7);
174         relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
175         relPosFilter->Update();
176         slices_support[i] = relPosFilter->GetOutput();
177
178         // Relative Position : not Anterior
179         relPosFilter = RelPosFilterType::New();
180         relPosFilter->VerboseStepFlagOff();
181         relPosFilter->WriteStepFlagOff();
182         relPosFilter->SetBackgroundValue(GetBackgroundValue());
183         relPosFilter->SetInput(slices_support[i]); 
184         relPosFilter->SetInputObject(object); 
185         relPosFilter->AddOrientationTypeString("A");
186         relPosFilter->SetInverseOrientationFlag(true);
187         //      relPosFilter->SetIntermediateSpacing(3);
188         relPosFilter->SetIntermediateSpacingFlag(false);
189         relPosFilter->SetFuzzyThreshold(0.7);
190         relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
191         relPosFilter->Update();
192         slices_support[i] = relPosFilter->GetOutput();
193
194       } // End RelativePosition for Right
195
196
197       if (label_left != -1) {
198     
199         // Debug points
200         clitk::PointsUtils<MaskImageType>::Convert2DTo3D(centroids[label_left], SubclavianArtery, i, p);
201         points.push_back(p);
202
203         // Set Background and ForegroundValue according to label_right
204         MaskSlicePointer object = 
205           clitk::Binarize<MaskSliceType>(slices_subclavianartery[i], label_left, label_left, 
206                                          GetBackgroundValue(), GetForegroundValue());
207       
208         // Relative Position : not at Right
209         typedef clitk::AddRelativePositionConstraintToLabelImageFilter<MaskSliceType> RelPosFilterType;
210         typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
211         relPosFilter->VerboseStepFlagOff();
212         relPosFilter->WriteStepFlagOff();
213         relPosFilter->SetBackgroundValue(GetBackgroundValue());
214         relPosFilter->SetInput(slices_support[i]); 
215         relPosFilter->SetInputObject(object); 
216         relPosFilter->AddOrientationTypeString("L");
217         relPosFilter->SetInverseOrientationFlag(true);
218         //      relPosFilter->SetIntermediateSpacing(3);
219         relPosFilter->SetIntermediateSpacingFlag(false);
220         relPosFilter->SetFuzzyThreshold(0.7);
221         relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
222         relPosFilter->Update();
223         slices_support[i] = relPosFilter->GetOutput();
224
225         // Relative Position : not Anterior
226         relPosFilter = RelPosFilterType::New();
227         relPosFilter->VerboseStepFlagOff();
228         relPosFilter->WriteStepFlagOff();
229         relPosFilter->SetBackgroundValue(GetBackgroundValue());
230         relPosFilter->SetInput(slices_support[i]); 
231         relPosFilter->SetInputObject(object); 
232         relPosFilter->AddOrientationTypeString("A");
233         relPosFilter->SetInverseOrientationFlag(true);
234         //      relPosFilter->SetIntermediateSpacing(3);
235         relPosFilter->SetIntermediateSpacingFlag(false);
236         relPosFilter->SetFuzzyThreshold(0.7);
237         relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
238         relPosFilter->Update();
239         slices_support[i] = relPosFilter->GetOutput();
240
241       }
242
243     
244     } // if centroids.size > 1
245   } // End loop slices
246
247   // Joint slices
248   m_Working_Support = clitk::JoinSlices<MaskImageType>(slices_support, m_Working_Support, 2);
249
250   // Save list points
251   clitk::WriteListOfLandmarks<MaskImageType>(points, "subcl-lr.txt");
252
253
254   StopCurrentStep<MaskImageType>(m_Working_Support);
255   m_ListOfStations["3P"] = m_Working_Support;
256 }
257 //--------------------------------------------------------------------
258
259 //--------------------------------------------------------------------
260 template <class ImageType>
261 void 
262 clitk::ExtractLymphStationsFilter<ImageType>::
263 ExtractStation_3P_LR_sup_Limits_2() 
264 {
265   /*
266     "On the right side, the limit is defined by the air–soft-tissue
267     interface. On the left side, it is defined by the air–tissue
268     interface superiorly (Fig. 2A–C) and the aorta inferiorly
269     (Figs. 2D–I and 3A–C)."
270
271     sup : 
272     Resizelike support : Trachea, SubclavianArtery
273     Trachea, slice by slice, get centroid trachea
274     SubclavianArtery, slice by slice, CCL
275     prendre la 1ère à L et R, not at Left
276     
277   */
278   //  StartNewStep("[Station 3P] Left/Right limits (superior part) ");
279   
280
281 }
282 //--------------------------------------------------------------------
283
284 //--------------------------------------------------------------------
285 template <class ImageType>
286 void 
287 clitk::ExtractLymphStationsFilter<ImageType>::
288 ExtractStation_3P_LR_inf_Limits() 
289 {
290   /*
291     "On the right side, the limit is defined by the air–soft-tissue
292     interface. On the left side, it is defined by the air–tissue
293     interface superiorly (Fig. 2A–C) and the aorta inferiorly
294     (Figs. 2D–I and 3A–C)."
295
296     inf : not Right to Azygousvein    
297   */
298   StartNewStep("[Station 3P] Left/Right limits (inferior part) with Azygousvein and Aorta");
299
300   // Load structures
301   MaskImagePointer AzygousVein = GetAFDB()->template GetImage<MaskImageType>("AzygousVein");
302   MaskImagePointer Aorta = GetAFDB()->template GetImage<MaskImageType>("Aorta");
303
304   DD("ici");
305   writeImage<MaskImageType>(m_Working_Support, "ws.mhd");
306
307   typedef clitk::AddRelativePositionConstraintToLabelImageFilter<MaskImageType> RelPosFilterType;
308   typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
309   relPosFilter->VerboseStepFlagOff();
310   relPosFilter->WriteStepFlagOff();
311   relPosFilter->SetBackgroundValue(GetBackgroundValue());
312   relPosFilter->SetInput(m_Working_Support); 
313   relPosFilter->SetInputObject(AzygousVein); 
314   relPosFilter->AddOrientationTypeString("R");
315   relPosFilter->SetInverseOrientationFlag(true);
316   relPosFilter->SetIntermediateSpacing(3);
317   relPosFilter->SetIntermediateSpacingFlag(false);
318   relPosFilter->SetFuzzyThreshold(0.7);
319   relPosFilter->AutoCropFlagOn();
320   relPosFilter->Update();
321   m_Working_Support = relPosFilter->GetOutput();
322
323   DD("la");
324   writeImage<MaskImageType>(m_Working_Support, "before-L-aorta.mhd");
325   relPosFilter->SetInput(m_Working_Support); 
326   relPosFilter->SetInputObject(Aorta); 
327   relPosFilter->AddOrientationTypeString("L");
328   relPosFilter->SetInverseOrientationFlag(true);
329   relPosFilter->SetIntermediateSpacing(3);
330   relPosFilter->SetIntermediateSpacingFlag(false);
331   relPosFilter->SetFuzzyThreshold(0.7);
332   relPosFilter->AutoCropFlagOn();
333   relPosFilter->Update();
334   m_Working_Support = relPosFilter->GetOutput();
335   writeImage<MaskImageType>(m_Working_Support, "after-L-aorta.mhd");
336
337   StopCurrentStep<MaskImageType>(m_Working_Support);
338   m_ListOfStations["3P"] = m_Working_Support;
339 }
340 //--------------------------------------------------------------------