]> Creatis software - clitk.git/blob - segmentation/clitkExtractLymphStationsFilter.h
Merge branch 'master' of /home/dsarrut/clitk3.server
[clitk.git] / segmentation / clitkExtractLymphStationsFilter.h
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_H
20 #define CLITKEXTRACTLYMPHSTATIONSFILTER_H
21
22 // clitk
23 #include "clitkFilterBase.h"
24 #include "clitkFilterWithAnatomicalFeatureDatabaseManagement.h"
25
26 // vtk
27 #include <vtkPolyData.h>
28
29 namespace clitk {
30   
31   //--------------------------------------------------------------------
32   /*
33     Try to extract the LymphStations part of a thorax CT.
34     Need a set of Anatomical Features (AFDB)
35   */
36   //--------------------------------------------------------------------
37   
38   template <class TImageType>
39   class ITK_EXPORT ExtractLymphStationsFilter: 
40     public virtual clitk::FilterBase, 
41     public clitk::FilterWithAnatomicalFeatureDatabaseManagement,
42     public itk::ImageToImageFilter<TImageType, itk::Image<uchar, 3> >
43   {
44
45   public:
46     /** Standard class typedefs. */
47     typedef itk::ImageToImageFilter<TImageType, itk::Image<uchar, 3> > Superclass;
48     typedef ExtractLymphStationsFilter          Self;
49     typedef itk::SmartPointer<Self>             Pointer;
50     typedef itk::SmartPointer<const Self>       ConstPointer;
51     
52     /** Method for creation through the object factory. */
53     itkNewMacro(Self);
54     
55     /** Run-time type information (and related methods). */
56     itkTypeMacro(ExtractLymphStationsFilter, ImageToImageFilter);
57
58     /** Some convenient typedefs. */
59     typedef TImageType                       ImageType;
60     typedef typename ImageType::ConstPointer ImageConstPointer;
61     typedef typename ImageType::Pointer      ImagePointer;
62     typedef typename ImageType::RegionType   ImageRegionType; 
63     typedef typename ImageType::PixelType    ImagePixelType; 
64     typedef typename ImageType::SizeType     ImageSizeType; 
65     typedef typename ImageType::IndexType    ImageIndexType; 
66     typedef typename ImageType::PointType    ImagePointType; 
67         
68     typedef uchar MaskImagePixelType;
69     typedef itk::Image<MaskImagePixelType, 3>    MaskImageType;  
70     typedef typename MaskImageType::Pointer      MaskImagePointer;
71     typedef typename MaskImageType::RegionType   MaskImageRegionType; 
72     typedef typename MaskImageType::SizeType     MaskImageSizeType; 
73     typedef typename MaskImageType::IndexType    MaskImageIndexType; 
74     typedef typename MaskImageType::PointType    MaskImagePointType; 
75
76     typedef itk::Image<MaskImagePixelType, 2>    MaskSliceType;
77     typedef typename MaskSliceType::Pointer      MaskSlicePointer;
78     typedef typename MaskSliceType::PointType    MaskSlicePointType;
79     typedef typename MaskSliceType::RegionType   MaskSliceRegionType; 
80     typedef typename MaskSliceType::SizeType     MaskSliceSizeType; 
81     typedef typename MaskSliceType::IndexType    MaskSliceIndexType; 
82
83     /** ImageDimension constants */
84     itkStaticConstMacro(ImageDimension, unsigned int, ImageType::ImageDimension);
85     FILTERBASE_INIT;
86    
87     itkGetConstMacro(BackgroundValue, MaskImagePixelType);
88     itkGetConstMacro(ForegroundValue, MaskImagePixelType);
89     itkSetMacro(BackgroundValue, MaskImagePixelType);
90     itkSetMacro(ForegroundValue, MaskImagePixelType);
91
92     // Station 8
93     // itkSetMacro(DistanceMaxToAnteriorPartOfTheSpine, double);
94     //itkGetConstMacro(DistanceMaxToAnteriorPartOfTheSpine, double);
95     itkSetMacro(EsophagusDiltationForAnt, MaskImagePointType);
96     itkGetConstMacro(EsophagusDiltationForAnt, MaskImagePointType);
97     itkSetMacro(EsophagusDiltationForRight, MaskImagePointType);
98     itkGetConstMacro(EsophagusDiltationForRight, MaskImagePointType);
99     itkSetMacro(InjectedThresholdForS8, double);
100     itkGetConstMacro(InjectedThresholdForS8, double);
101
102     // Station 7
103     itkGetConstMacro(S7_UseMostInferiorPartOnlyFlag, bool);
104     itkSetMacro(S7_UseMostInferiorPartOnlyFlag, bool);
105     itkBooleanMacro(S7_UseMostInferiorPartOnlyFlag);
106
107     // All stations
108     bool GetComputeStation(std::string s);
109     void AddComputeStation(std::string station) ;
110     void SetFuzzyThreshold(std::string station, std::string tag, double value);
111     double GetFuzzyThreshold(std::string station, std::string tag);
112     void SetThreshold(std::string station, std::string tag, double value);
113     double GetThreshold(std::string station, std::string tag);
114     itkGetConstMacro(ComputeStationsSupportsFlag, bool);
115     itkSetMacro(ComputeStationsSupportsFlag, bool);
116     itkBooleanMacro(ComputeStationsSupportsFlag);
117
118   protected:
119     ExtractLymphStationsFilter();
120     virtual ~ExtractLymphStationsFilter() {}
121     
122     virtual void GenerateOutputInformation();
123     virtual void GenerateInputRequestedRegion();
124     virtual void GenerateData();
125     
126     ImageConstPointer  m_Input;
127     MaskImagePointer   m_Mediastinum;
128     MaskImagePointer   m_Working_Support;
129     std::map<std::string, MaskImagePointer> m_ListOfStations;
130     std::map<std::string, MaskImagePointer> m_ListOfSupports;
131     MaskImagePixelType m_BackgroundValue;
132     MaskImagePixelType m_ForegroundValue;
133     std::map<std::string, bool> m_ComputeStationMap;
134
135     bool CheckForStation(std::string station);
136     void Remove_Structures(std::string station, std::string s);
137
138     // Functions common to several stations
139     double FindCarina();
140     double FindApexOfTheChest();
141     double FindSuperiorBorderOfAorticArch();
142     double FindInferiorBorderOfAorticArch();
143     void FindLeftAndRightBronchi();
144     void FindLineForS7S8Separation(MaskImagePointType & A, MaskImagePointType & B);
145     MaskImagePointer FindAntPostVessels();
146     MaskImagePointer FindAntPostVessels2();
147
148     // Global parameters
149     typedef std::map<std::string, double> FuzzyThresholdByStructureType;
150     std::map<std::string, FuzzyThresholdByStructureType> m_FuzzyThreshold;    
151     typedef std::map<std::string, double> ThresholdByStructureType;
152     std::map<std::string, ThresholdByStructureType> m_Threshold;    
153
154     // Station's supports
155     void ExtractStationSupports();
156     void Support_SupInf_S1RL();
157     void Support_LeftRight_S1R_S1L();
158     void Support_SupInf_S2R_S2L();
159     void Support_LeftRight_S2R_S2L();
160     void Support_SupInf_S4R_S4L();
161     void Support_LeftRight_S4R_S4L();
162     void Support_Post_S1S2S4();
163     void Support_S3P();
164     void Support_S3A();
165     void Support_S5();
166     void Support_S6();
167
168     MaskImagePointer LimitsWithTrachea(MaskImageType * input, 
169                                        int extremaDirection, int lineDirection, 
170                                        double offset, double maxSupPosition);
171     MaskImagePointer LimitsWithTrachea(MaskImageType * input, 
172                                        int extremaDirection, int lineDirection, 
173                                        double offset);
174
175     // Station 8
176     // double m_DistanceMaxToAnteriorPartOfTheSpine;
177     double m_DiaphragmInferiorLimit;
178     double m_OriginOfRightMiddleLobeBronchusZ;
179     double m_InjectedThresholdForS8;
180     MaskImagePointer m_Esophagus;
181     MaskImagePointType m_EsophagusDiltationForAnt;
182     MaskImagePointType m_EsophagusDiltationForRight;
183
184     void ExtractStation_8();
185     void ExtractStation_8_SetDefaultValues();
186     void ExtractStation_8_SI_Limits();
187     void ExtractStation_8_Ant_Limits();
188     void ExtractStation_8_Left_Sup_Limits();
189     void ExtractStation_8_Left_Inf_Limits();
190     void ExtractStation_8_Single_CCL_Limits();
191     void ExtractStation_8_Remove_Structures();
192
193     // Station 3P
194     void ExtractStation_3P();
195     void ExtractStation_3P_SetDefaultValues();
196     void ExtractStation_3P_LR_inf_Limits();
197     void ExtractStation_3P_LR_sup_Limits_2();
198     void ExtractStation_3P_Remove_Structures();
199     void ExtractStation_3P_LR_sup_Limits();
200
201     // Station 3A
202     void ExtractStation_3A();
203     void ExtractStation_3A_SetDefaultValues();
204     void ExtractStation_3A_AntPost_S5();
205     void ExtractStation_3A_AntPost_S6();
206     void ExtractStation_3A_AntPost_Superiorly();
207     void ExtractStation_3A_Remove_Structures();
208     void ExtractStation_3A_PostToBones();
209
210     // Station 2RL
211     void ExtractStation_2RL();
212     void ExtractStation_2RL_SetDefaultValues();
213     void ExtractStation_2RL_SI_Limits();
214     void ExtractStation_2RL_Ant_Limits();
215     void ExtractStation_2RL_Ant_Limits2();
216     void ExtractStation_2RL_Post_Limits();
217     void ExtractStation_2RL_LR_Limits();
218     void ExtractStation_2RL_Remove_Structures();
219     void ExtractStation_2RL_SeparateRL();
220     vtkSmartPointer<vtkPolyData> Build3DMeshFrom2DContour(const std::vector<ImagePointType> & points);
221
222     // Station 7
223     void ExtractStation_7();
224     void ExtractStation_7_SetDefaultValues();
225     void ExtractStation_7_SI_Limits();
226     void ExtractStation_7_RL_Interior_Limits();
227
228
229     void ExtractStation_7_RL_Limits_OLD();
230     void ExtractStation_7_Posterior_Limits();   
231     void ExtractStation_7_Remove_Structures();
232     bool m_S7_UseMostInferiorPartOnlyFlag;
233     bool m_ComputeStationsSupportsFlag;
234     MaskImagePointer m_Working_Trachea;
235     MaskImagePointer m_LeftBronchus;
236     MaskImagePointer m_RightBronchus;
237     typedef std::vector<MaskImageType::PointType> ListOfPointsType;
238     ListOfPointsType  m_RightMostInLeftBronchus;
239     ListOfPointsType  m_AntMostInLeftBronchus;
240     ListOfPointsType  m_PostMostInLeftBronchus;
241     ListOfPointsType  m_LeftMostInRightBronchus;
242     ListOfPointsType  m_AntMostInRightBronchus;
243     ListOfPointsType  m_PostMostInRightBronchus;
244
245     void FindExtremaPointsInBronchus(MaskImagePointer input, 
246                                      int direction,
247                                      double distance_max_from_center_point, 
248                                      ListOfPointsType & LR, 
249                                      ListOfPointsType & Ant, 
250                                      ListOfPointsType & Post);
251     // Station 4RL
252     void ExtractStation_4RL();
253     void ExtractStation_4RL_SI_Limits();
254     void ExtractStation_4RL_LR_Limits();
255     void ExtractStation_4RL_AP_Limits();
256     MaskImagePointer m_RightSupport;
257     MaskImagePointer m_LeftSupport;
258
259   private:
260     ExtractLymphStationsFilter(const Self&); //purposely not implemented
261     void operator=(const Self&); //purposely not implemented
262     
263   }; // end class
264   //--------------------------------------------------------------------
265
266 } // end namespace clitk
267 //--------------------------------------------------------------------
268
269 #ifndef ITK_MANUAL_INSTANTIATION
270 #include "clitkExtractLymphStationsFilter.txx"
271 #include "clitkExtractLymphStation_Supports.txx"
272 #include "clitkExtractLymphStation_8.txx"
273 #include "clitkExtractLymphStation_3P.txx"
274 #include "clitkExtractLymphStation_2RL.txx"
275 #include "clitkExtractLymphStation_3A.txx"
276 #include "clitkExtractLymphStation_7.txx"
277 #include "clitkExtractLymphStation_4RL.txx"
278 #endif
279
280 #endif