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 ExtractStation_8_SetDefaultValues();
57 ExtractStation_3P_SetDefaultValues();
60 SetFuzzyThreshold(0.5);
61 SetStation7Filename("station7.mhd");
63 //--------------------------------------------------------------------
66 //--------------------------------------------------------------------
67 template <class TImageType>
69 clitk::ExtractLymphStationsFilter<TImageType>::
70 GenerateOutputInformation() {
73 m_Input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
74 m_Mediastinum = GetAFDB()->template GetImage <MaskImageType>("Mediastinum");
77 StartNewStep("Station 8");
83 StartNewStep("Station 3P");
88 if (0) { // temporary suppress
90 StartNewStep("Station 7");
96 StartNewStep("Station 4RL");
98 //ExtractStation_4RL();
104 // typedef clitk::BooleanOperatorLabelImageFilter<MaskImageType> BFilter;
105 //BFilter::Pointer merge = BFilter::New();
106 // writeImage<MaskImageType>(m_Output, "ouput.mhd");
107 //writeImage<MaskImageType>(m_Working_Support, "ws.mhd");
108 /*merge->SetInput1(m_Station7);
109 merge->SetInput2(m_Station4RL); // support
110 merge->SetOperationType(BFilter::AndNot); CHANGE OPERATOR
111 merge->SetForegroundValue(4);
113 m_Output = merge->GetOutput();
116 //--------------------------------------------------------------------
119 //--------------------------------------------------------------------
120 template <class TImageType>
122 clitk::ExtractLymphStationsFilter<TImageType>::
123 GenerateInputRequestedRegion() {
124 //DD("GenerateInputRequestedRegion (nothing?)");
126 //--------------------------------------------------------------------
129 //--------------------------------------------------------------------
130 template <class TImageType>
132 clitk::ExtractLymphStationsFilter<TImageType>::
134 DD("GenerateData, graft output");
136 // Final Step -> graft output (if SetNthOutput => redo)
137 this->GraftOutput(m_ListOfStations["8"]);
139 //--------------------------------------------------------------------
142 //--------------------------------------------------------------------
143 template <class TImageType>
145 clitk::ExtractLymphStationsFilter<TImageType>::
146 CheckForStation(std::string station)
148 // Compute Station name
149 std::string s = "Station"+station;
152 // Check if station already exist in DB
154 if (GetAFDB()->TagExist(s)) {
155 m_ListOfStations[station] = GetAFDB()->template GetImage<MaskImageType>(s);
159 // Define the starting support
160 if (found && GetComputeStation(station)) {
161 std::cout << "Station " << station << " already exists, but re-computation forced." << std::endl;
163 if (!found || GetComputeStation(station)) {
164 m_Working_Support = m_Mediastinum = GetAFDB()->template GetImage<MaskImageType>("Mediastinum", true);
168 std::cout << "Station " << station << " found. I used it" << std::endl;
172 //--------------------------------------------------------------------
175 //--------------------------------------------------------------------
176 template <class TImageType>
178 clitk::ExtractLymphStationsFilter<TImageType>::
179 GetComputeStation(std::string station)
181 return (m_ComputeStationMap.find(station) != m_ComputeStationMap.end());
183 //--------------------------------------------------------------------
186 //--------------------------------------------------------------------
187 template <class TImageType>
189 clitk::ExtractLymphStationsFilter<TImageType>::
190 AddComputeStation(std::string station)
192 m_ComputeStationMap[station] = true;
194 //--------------------------------------------------------------------
197 //--------------------------------------------------------------------
198 template <class TImageType>
200 clitk::ExtractLymphStationsFilter<TImageType>::
203 if (CheckForStation("8")) {
204 ExtractStation_8_SI_Limits();
205 ExtractStation_8_Post_Limits();
206 ExtractStation_8_Ant_Sup_Limits();
207 ExtractStation_8_Ant_Inf_Limits();
208 ExtractStation_8_LR_1_Limits();
209 ExtractStation_8_LR_2_Limits();
210 ExtractStation_8_LR_Limits();
211 ExtractStation_8_Ant_Injected_Limits();
212 ExtractStation_8_Single_CCL_Limits();
213 ExtractStation_8_Remove_Structures();
214 // Store image filenames into AFDB
215 writeImage<MaskImageType>(m_ListOfStations["8"], "seg/Station8.mhd");
216 GetAFDB()->SetImageFilename("Station8", "seg/Station8.mhd");
220 //--------------------------------------------------------------------
223 //--------------------------------------------------------------------
224 template <class TImageType>
226 clitk::ExtractLymphStationsFilter<TImageType>::
229 if (CheckForStation("3P")) {
230 ExtractStation_3P_SI_Limits();
231 ExtractStation_3P_Remove_Structures();
232 ExtractStation_3P_Ant_Limits();
233 ExtractStation_3P_Post_Limits();
234 ExtractStation_3P_LR_sup_Limits();
235 ExtractStation_3P_LR_inf_Limits();
236 // Store image filenames into AFDB
237 writeImage<MaskImageType>(m_ListOfStations["3P"], "seg/Station3P.mhd");
238 GetAFDB()->SetImageFilename("Station3P", "seg/Station3P.mhd");
242 //--------------------------------------------------------------------
245 //--------------------------------------------------------------------
246 template <class TImageType>
248 clitk::ExtractLymphStationsFilter<TImageType>::
250 if (m_ListOfStations["7"]) {
251 DD("Station 7 support already exist -> use it");
252 m_Working_Support = m_ListOfStations["7"];
254 else m_Working_Support = m_Mediastinum;
255 ExtractStation_7_SI_Limits();
256 ExtractStation_7_RL_Limits();
257 ExtractStation_7_Posterior_Limits();
259 //--------------------------------------------------------------------
262 //--------------------------------------------------------------------
263 template <class TImageType>
265 clitk::ExtractLymphStationsFilter<TImageType>::
266 ExtractStation_4RL() {
268 WARNING ONLY 4R FIRST !!! (not same inf limits)
270 ExtractStation_4RL_SI_Limits();
271 ExtractStation_4RL_LR_Limits();
272 ExtractStation_4RL_AP_Limits();
274 //--------------------------------------------------------------------
277 //--------------------------------------------------------------------
281 #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX