1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
19 #ifndef CLITKEXTRACTLYMPHSTATIONSFILTER_TXX
20 #define CLITKEXTRACTLYMPHSTATIONSFILTER_TXX
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"
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>
41 #include "RelativePositionPropImageFilter.h"
43 //--------------------------------------------------------------------
44 template <class TImageType>
45 clitk::ExtractLymphStationsFilter<TImageType>::
46 ExtractLymphStationsFilter():
48 clitk::FilterWithAnatomicalFeatureDatabaseManagement(),
49 itk::ImageToImageFilter<TImageType, MaskImageType>()
51 this->SetNumberOfRequiredInputs(1);
52 SetBackgroundValue(0);
53 SetForegroundValue(1);
56 SetDistanceMaxToAnteriorPartOfTheSpine(10);
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);
65 SetFuzzyThreshold(0.5);
66 SetStation7Filename("station7.mhd");
68 //--------------------------------------------------------------------
71 //--------------------------------------------------------------------
72 template <class TImageType>
74 clitk::ExtractLymphStationsFilter<TImageType>::
75 GenerateOutputInformation() {
78 m_Input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
79 m_Mediastinum = GetAFDB()->template GetImage <MaskImageType>("Mediastinum");
82 StartNewStep("Station 8");
87 // Compute some interesting points in trachea
88 // ( ALTERNATIVE -> SKELETON ANALYSIS ?
89 // Pb : not sufficient for mostXX points ... )
91 /* ==> todo (but why ???)
92 ComputeTracheaCentroidsAboveCarina();
93 ComputeBronchusExtremaPointsBelowCarina();
96 if (0) { // temporary suppress
98 StartNewStep("Station 7");
103 // Extract Station4RL
104 StartNewStep("Station 4RL");
106 //ExtractStation_4RL();
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);
121 m_Output = merge->GetOutput();
124 //--------------------------------------------------------------------
127 //--------------------------------------------------------------------
128 template <class TImageType>
130 clitk::ExtractLymphStationsFilter<TImageType>::
131 GenerateInputRequestedRegion() {
132 DD("GenerateInputRequestedRegion (nothing?)");
134 //--------------------------------------------------------------------
137 //--------------------------------------------------------------------
138 template <class TImageType>
140 clitk::ExtractLymphStationsFilter<TImageType>::
142 DD("GenerateData, graft output");
144 // Final Step -> graft output (if SetNthOutput => redo)
145 this->GraftOutput(m_ListOfStations["8"]);
147 //--------------------------------------------------------------------
150 //--------------------------------------------------------------------
151 template <class TImageType>
153 clitk::ExtractLymphStationsFilter<TImageType>::
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"];
162 else m_Working_Support = m_Mediastinum;
164 ExtractStation_8_SI_Limits();
165 ExtractStation_8_AP_Limits();
166 // ExtractStation_8_LR_Limits();
168 //--------------------------------------------------------------------
171 //--------------------------------------------------------------------
172 template <class TImageType>
174 clitk::ExtractLymphStationsFilter<TImageType>::
176 if (m_ListOfStations["7"]) {
177 DD("Station 7 support already exist -> use it");
178 m_Working_Support = m_ListOfStations["7"];
180 else m_Working_Support = m_Mediastinum;
181 ExtractStation_7_SI_Limits();
182 ExtractStation_7_RL_Limits();
183 ExtractStation_7_Posterior_Limits();
185 //--------------------------------------------------------------------
188 //--------------------------------------------------------------------
189 template <class TImageType>
191 clitk::ExtractLymphStationsFilter<TImageType>::
192 ExtractStation_4RL() {
194 WARNING ONLY 4R FIRST !!! (not same inf limits)
196 ExtractStation_4RL_SI_Limits();
197 ExtractStation_4RL_LR_Limits();
198 ExtractStation_4RL_AP_Limits();
200 //--------------------------------------------------------------------
203 //--------------------------------------------------------------------
204 template <class TImageType>
206 clitk::ExtractLymphStationsFilter<TImageType>::
207 FindExtremaPointsInBronchus(MaskImagePointer input,
209 double distance_max_from_center_point,
210 ListOfPointsType & LR,
211 ListOfPointsType & Ant,
212 ListOfPointsType & Post)
215 // Other solution ==> with auto bounding box ! (but pb to prevent to
216 // be too distant from the center point
219 std::vector<typename MaskSliceType::Pointer> slices;
220 clitk::ExtractSlices<MaskImageType>(input, 2, slices);
224 for(uint i=0; i<slices.size(); i++) {
227 slices[i] = Labelize<MaskSliceType>(slices[i], 0, true, 10);
228 slices[i] = KeepLabels<MaskSliceType>(slices[i],
229 GetBackgroundValue(),
230 GetForegroundValue(), 1, 1, true);
233 // ------- Find rightmost or leftmost point -------
234 MaskSliceType::PointType LRMost;
236 clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i],
237 GetBackgroundValue(),
239 (direction==0?false:true), // right or left according to direction
241 // ------- Find postmost point -------
242 MaskSliceType::PointType postMost;
244 clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i],
245 GetBackgroundValue(),
247 distance_max_from_center_point,
249 // ------- Find antmost point -------
250 MaskSliceType::PointType antMost;
252 clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i],
253 GetBackgroundValue(),
255 distance_max_from_center_point,
257 // Only add point if found
259 // ------- Convert 2D to 3D points --------
260 MaskImageType::PointType p;
261 clitk::PointsUtils<MaskImageType>::Convert2DTo3D(LRMost, input, i, p);
263 clitk::PointsUtils<MaskImageType>::Convert2DTo3D(antMost, input, i, p);
265 clitk::PointsUtils<MaskImageType>::Convert2DTo3D(postMost, input, i, p);
270 //--------------------------------------------------------------------
272 #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX