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://www.centreleonberard.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();
58 ExtractStation_3A_SetDefaultValues();
59 ExtractStation_7_SetDefaultValues();
61 //--------------------------------------------------------------------
64 //--------------------------------------------------------------------
65 template <class TImageType>
67 clitk::ExtractLymphStationsFilter<TImageType>::
68 GenerateOutputInformation() {
71 m_Input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
72 m_Mediastinum = GetAFDB()->template GetImage <MaskImageType>("Mediastinum");
75 StartNewStep("Station 8");
81 StartNewStep("Station 3P");
87 StartNewStep("Station 3A");
93 StartNewStep("Station 7");
98 if (0) { // temporary suppress
100 StartNewStep("Station 4RL");
102 //ExtractStation_4RL();
108 // typedef clitk::BooleanOperatorLabelImageFilter<MaskImageType> BFilter;
109 //BFilter::Pointer merge = BFilter::New();
110 // writeImage<MaskImageType>(m_Output, "ouput.mhd");
111 //writeImage<MaskImageType>(m_Working_Support, "ws.mhd");
112 /*merge->SetInput1(m_Station7);
113 merge->SetInput2(m_Station4RL); // support
114 merge->SetOperationType(BFilter::AndNot); CHANGE OPERATOR
115 merge->SetForegroundValue(4);
117 m_Output = merge->GetOutput();
120 //--------------------------------------------------------------------
123 //--------------------------------------------------------------------
124 template <class TImageType>
126 clitk::ExtractLymphStationsFilter<TImageType>::
127 GenerateInputRequestedRegion() {
128 //DD("GenerateInputRequestedRegion (nothing?)");
130 //--------------------------------------------------------------------
133 //--------------------------------------------------------------------
134 template <class TImageType>
136 clitk::ExtractLymphStationsFilter<TImageType>::
138 // Final Step -> graft output (if SetNthOutput => redo)
139 this->GraftOutput(m_ListOfStations["8"]);
141 //--------------------------------------------------------------------
144 //--------------------------------------------------------------------
145 template <class TImageType>
147 clitk::ExtractLymphStationsFilter<TImageType>::
148 CheckForStation(std::string station)
150 // Compute Station name
151 std::string s = "Station"+station;
154 // Check if station already exist in DB
156 if (GetAFDB()->TagExist(s)) {
157 m_ListOfStations[station] = GetAFDB()->template GetImage<MaskImageType>(s);
161 // Define the starting support
162 if (found && GetComputeStation(station)) {
163 std::cout << "Station " << station << " already exists, but re-computation forced." << std::endl;
165 if (!found || GetComputeStation(station)) {
166 m_Working_Support = m_Mediastinum = GetAFDB()->template GetImage<MaskImageType>("Mediastinum", true);
170 std::cout << "Station " << station << " found. I used it" << std::endl;
174 //--------------------------------------------------------------------
177 //--------------------------------------------------------------------
178 template <class TImageType>
180 clitk::ExtractLymphStationsFilter<TImageType>::
181 GetComputeStation(std::string station)
183 return (m_ComputeStationMap.find(station) != m_ComputeStationMap.end());
185 //--------------------------------------------------------------------
188 //--------------------------------------------------------------------
189 template <class TImageType>
191 clitk::ExtractLymphStationsFilter<TImageType>::
192 AddComputeStation(std::string station)
194 m_ComputeStationMap[station] = true;
196 //--------------------------------------------------------------------
199 //--------------------------------------------------------------------
200 template <class TImageType>
202 clitk::ExtractLymphStationsFilter<TImageType>::
205 if (CheckForStation("8")) {
206 ExtractStation_8_SI_Limits();
207 ExtractStation_8_Post_Limits();
208 ExtractStation_8_Ant_Sup_Limits();
209 ExtractStation_8_Ant_Inf_Limits();
210 ExtractStation_8_LR_1_Limits();
211 ExtractStation_8_LR_2_Limits();
212 ExtractStation_8_LR_Limits();
213 ExtractStation_8_Ant_Injected_Limits();
214 ExtractStation_8_Single_CCL_Limits();
215 ExtractStation_8_Remove_Structures();
216 // Store image filenames into AFDB
217 writeImage<MaskImageType>(m_ListOfStations["8"], "seg/Station8.mhd");
218 GetAFDB()->SetImageFilename("Station8", "seg/Station8.mhd");
222 //--------------------------------------------------------------------
225 //--------------------------------------------------------------------
226 template <class TImageType>
228 clitk::ExtractLymphStationsFilter<TImageType>::
231 if (CheckForStation("3P")) {
232 ExtractStation_3P_SI_Limits();
233 ExtractStation_3P_Ant_Limits();
234 ExtractStation_3P_Post_Limits();
235 ExtractStation_3P_LR_sup_Limits();
236 // ExtractStation_3P_LR_sup_Limits_2();
237 ExtractStation_3P_LR_inf_Limits();
238 ExtractStation_8_Single_CCL_Limits(); // YES 8 !
239 ExtractStation_3P_Remove_Structures(); // after CCL
240 // Store image filenames into AFDB
241 writeImage<MaskImageType>(m_ListOfStations["3P"], "seg/Station3P.mhd");
242 GetAFDB()->SetImageFilename("Station3P", "seg/Station3P.mhd");
246 //--------------------------------------------------------------------
249 //--------------------------------------------------------------------
250 template <class TImageType>
252 clitk::ExtractLymphStationsFilter<TImageType>::
254 if (CheckForStation("7")) {
255 ExtractStation_7_SI_Limits();
256 ExtractStation_7_RL_Limits();
257 ExtractStation_7_Posterior_Limits();
258 // ExtractStation_8_Single_CCL_Limits(); // Yes the same than 8
259 ExtractStation_7_Remove_Structures();
260 // Store image filenames into AFDB
261 writeImage<MaskImageType>(m_ListOfStations["7"], "seg/Station7.mhd");
262 GetAFDB()->SetImageFilename("Station7", "seg/Station7.mhd");
266 //--------------------------------------------------------------------
269 //--------------------------------------------------------------------
270 template <class TImageType>
272 clitk::ExtractLymphStationsFilter<TImageType>::
275 if (CheckForStation("3A")) {
276 ExtractStation_3A_SI_Limits();
277 ExtractStation_3A_Ant_Limits();
278 // Store image filenames into AFDB
279 writeImage<MaskImageType>(m_ListOfStations["3A"], "seg/Station3A.mhd");
280 GetAFDB()->SetImageFilename("Station3A", "seg/Station3A.mhd");
284 //--------------------------------------------------------------------
287 //--------------------------------------------------------------------
288 template <class TImageType>
290 clitk::ExtractLymphStationsFilter<TImageType>::
291 ExtractStation_4RL() {
295 WARNING ONLY 4R FIRST !!! (not same inf limits)
297 ExtractStation_4RL_SI_Limits();
298 ExtractStation_4RL_LR_Limits();
299 ExtractStation_4RL_AP_Limits();
301 //--------------------------------------------------------------------
304 //--------------------------------------------------------------------
305 template <class ImageType>
307 clitk::ExtractLymphStationsFilter<ImageType>::
308 Remove_Structures(std::string s)
311 StartNewStep("[Station7] Remove "+s);
312 MaskImagePointer Structure = GetAFDB()->template GetImage<MaskImageType>(s);
313 clitk::AndNot<MaskImageType>(m_Working_Support, Structure, GetBackgroundValue());
315 catch(clitk::ExceptionObject e) {
316 std::cout << s << " not found, skip." << std::endl;
319 //--------------------------------------------------------------------
323 #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX