2 //--------------------------------------------------------------------
3 template <class ImageType>
5 clitk::ExtractLymphStationsFilter<ImageType>::
6 ExtractStation_3A_SetDefaultValues()
9 //--------------------------------------------------------------------
12 //--------------------------------------------------------------------
13 template <class TImageType>
15 clitk::ExtractLymphStationsFilter<TImageType>::
18 if (!CheckForStation("3A")) return;
20 StartNewStep("Station 3A");
23 // Get the current support
24 StartNewStep("[Station 3A] Get the current 3A suppport");
25 m_Working_Support = m_ListOfSupports["S3A"];
26 m_ListOfStations["3A"] = m_Working_Support;
27 StopCurrentStep<MaskImageType>(m_Working_Support);
29 ExtractStation_3A_Post_Left_Limits_With_Aorta_S5_Support();
30 ExtractStation_3A_Post_Limits_With_Dilated_Aorta_S6_Support();
31 ExtractStation_3A_AntPost_Superiorly();
32 ExtractStation_3A_Remove_Structures();
34 // Generic RelativePosition processes
35 m_ListOfStations["3A"] = this->ApplyRelativePositionList("Station_3A", m_ListOfStations["3A"]);
38 m_ListOfStations["3A"] =
39 clitk::SliceBySliceKeepMainCCL<MaskImageType>(m_ListOfStations["3A"],
41 GetForegroundValue());
43 // Store image filenames into AFDB
44 writeImage<MaskImageType>(m_ListOfStations["3A"], "seg/Station3A.mhd");
45 GetAFDB()->SetImageFilename("Station3A", "seg/Station3A.mhd");
49 //--------------------------------------------------------------------
53 //--------------------------------------------------------------------
54 template <class ImageType>
56 clitk::ExtractLymphStationsFilter<ImageType>::
57 ExtractStation_3A_Post_Left_Limits_With_Aorta_S5_Support()
59 StartNewStep("[Station 3A] Post limits in S5 support according to Aorta");
61 // Consider Aorta, remove Left/Post part ; only around S5
62 // Get S5 support and Aorta
63 MaskImagePointer S5 = m_ListOfSupports["S5"];
64 MaskImagePointer Aorta = GetAFDB()->template GetImage <MaskImageType>("Aorta");
65 Aorta = clitk::ResizeImageLike<MaskImageType>(Aorta, S5, GetBackgroundValue());
67 // Inferiorly, Aorta has two CCL that merge into a single one when
68 // S6 appears. Loop on Aorta slices, select the most ant one, detect
69 // the most ant point.
73 // ====> TO BE CHANGED USING AscendingAorta and DescendingAorta
77 std::vector<MaskSlicePointer> slices;
78 clitk::ExtractSlices<MaskImageType>(Aorta, 2, slices);
79 std::vector<MaskImagePointType> points;
80 for(uint i=0; i<slices.size(); i++) {
81 // Select most ant CCL
82 slices[i] = clitk::Labelize<MaskSliceType>(slices[i], GetBackgroundValue(), false, 1);
83 std::vector<MaskSlicePointType> c;
84 clitk::ComputeCentroids<MaskSliceType>(slices[i], GetBackgroundValue(), c);
85 assert(c.size() == 3); // only 2 CCL
86 typename MaskSliceType::PixelType l;
87 if (c[1][1] > c[2][1]) { // We will remove the label=1
91 l = 2;// We will remove the label=2
93 slices[i] = clitk::SetBackground<MaskSliceType, MaskSliceType>(slices[i], slices[i], l,
94 GetBackgroundValue(), true);
96 // Detect the most ant point
98 MaskImagePointType pA;
99 clitk::FindExtremaPointInAGivenDirection<MaskSliceType>(slices[i], GetBackgroundValue(), 1, true, p);
100 // Set the X coordinate to the X coordinate of the centroid
101 if (l==1) p[0] = c[2][0];
104 // Convert in 3D and store
105 clitk::PointsUtils<MaskImageType>::Convert2DTo3D(p, Aorta, i, pA);
106 points.push_back(pA);
110 // MaskImagePointer o = clitk::JoinSlices<MaskImageType>(slices, Aorta, 2);
111 // writeImage<MaskImageType>(o, "o.mhd");
112 // clitk::WriteListOfLandmarks<MaskImageType>(points, "Ant-Aorta.txt");
114 // Remove Post/Left to this point
116 clitk::SliceBySliceSetBackgroundFromPoints<MaskImageType>(m_Working_Support,
117 GetBackgroundValue(), 2,
119 true, // Set BG if X greater than point[x], and
120 true); // if Y greater than point[y]
122 StopCurrentStep<MaskImageType>(m_Working_Support);
123 m_ListOfStations["3A"] = m_Working_Support;
125 //--------------------------------------------------------------------
128 //--------------------------------------------------------------------
129 template <class ImageType>
131 clitk::ExtractLymphStationsFilter<ImageType>::
132 ExtractStation_3A_Post_Limits_With_Dilated_Aorta_S6_Support()
134 StartNewStep("[Station 3A] Post limits with dilated Aorta");
137 MaskImagePointer Aorta = GetAFDB()->template GetImage <MaskImageType>("Aorta");
139 // Limits the support to S6
140 MaskImagePointer S6 = m_ListOfSupports["S6"];
141 Aorta = clitk::ResizeImageLike<MaskImageType>(Aorta, S6, GetBackgroundValue());
143 // Extend 1cm anteriorly
144 MaskImagePointType radius; // in mm
147 radius[2] = 0; // required
148 Aorta = clitk::Dilate<MaskImageType>(Aorta, radius, GetBackgroundValue(), GetForegroundValue(), false);
150 // Now, insert this image in the AFDB (but do not store on disk)
151 GetAFDB()->template SetImage<MaskImageType>("Aorta_Dilated_Anteriorly", "bidon",
156 clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, Aorta, 2,
157 GetFuzzyThreshold("3A", "Aorta"),
159 Aorta->GetSpacing()[0], false, false);
164 StopCurrentStep<MaskImageType>(m_Working_Support);
165 m_ListOfStations["3A"] = m_Working_Support;
167 //--------------------------------------------------------------------
170 //--------------------------------------------------------------------
171 template <class ImageType>
173 clitk::ExtractLymphStationsFilter<ImageType>::
174 ExtractStation_3A_AntPost_Superiorly()
176 StartNewStep("[Station 3A] Post limits superiorly");
178 // Get or compute the binary mask that separate Ant/Post part
179 // according to vessels
180 MaskImagePointer binarizedContour = FindAntPostVessels2();
181 binarizedContour = clitk::ResizeImageLike<MaskImageType>(binarizedContour,
183 GetBackgroundValue());
185 // remove from support
186 typedef clitk::BooleanOperatorLabelImageFilter<MaskImageType> BoolFilterType;
187 typename BoolFilterType::Pointer boolFilter = BoolFilterType::New();
188 boolFilter->InPlaceOn();
189 boolFilter->SetInput1(m_Working_Support);
190 boolFilter->SetInput2(binarizedContour);
191 boolFilter->SetBackgroundValue1(GetBackgroundValue());
192 boolFilter->SetBackgroundValue2(GetBackgroundValue());
193 boolFilter->SetOperationType(BoolFilterType::AndNot);
194 boolFilter->Update();
195 m_Working_Support = boolFilter->GetOutput();
197 StopCurrentStep<MaskImageType>(m_Working_Support);
198 m_ListOfStations["3A"] = m_Working_Support;
200 //--------------------------------------------------------------------
203 //--------------------------------------------------------------------
204 template <class ImageType>
206 clitk::ExtractLymphStationsFilter<ImageType>::
207 ExtractStation_3A_Remove_Structures()
209 Remove_Structures(" 3A", "Aorta");
210 Remove_Structures(" 3A", "LeftSubclavianArtery");
211 Remove_Structures(" 3A", "RightSubclavianArtery");
212 Remove_Structures(" 3A", "Thyroid");
213 Remove_Structures(" 3A", "LeftCommonCarotidArtery");
214 Remove_Structures(" 3A", "RightCommonCarotidArtery");
215 Remove_Structures(" 3A", "BrachioCephalicArtery");
216 // Remove_Structures("3A", "Bones"); --> should be in extractmediastinum
217 // Remove_Structures("3A", "BrachioCephalicVein"); ?
219 StartNewStep("[Station 3A] Remove part of BrachioCephalicVein");
220 // resize like support, extract slices
221 // while single CCL -> remove
222 // when two remove only the most post
223 MaskImagePointer BrachioCephalicVein =
224 GetAFDB()->template GetImage <MaskImageType>("BrachioCephalicVein");
225 BrachioCephalicVein = clitk::ResizeImageLike<MaskImageType>(BrachioCephalicVein,
227 GetBackgroundValue());
228 std::vector<MaskSlicePointer> slices;
229 std::vector<MaskSlicePointer> slices_BCV;
230 clitk::ExtractSlices<MaskImageType>(m_Working_Support, 2, slices);
231 clitk::ExtractSlices<MaskImageType>(BrachioCephalicVein, 2, slices_BCV);
232 for(uint i=0; i<slices.size(); i++) {
233 // Labelize slices_BCV
234 slices_BCV[i] = Labelize<MaskSliceType>(slices_BCV[i], 0, true, 1);
237 std::vector<typename MaskSliceType::PointType> centroids;
238 ComputeCentroids<MaskSliceType>(slices_BCV[i], GetBackgroundValue(), centroids);
240 // If several centroid, select the one most anterior
241 if (centroids.size() > 2) {
242 // Only keep the one most post
243 typename MaskSliceType::PixelType label;
244 if (centroids[1][1] > centroids[2][1]) {
251 slices_BCV[i] = clitk::SetBackground<MaskSliceType, MaskSliceType>(slices_BCV[i],
254 GetBackgroundValue(),
258 // Remove from the support
259 clitk::AndNot<MaskSliceType>(slices[i], slices_BCV[i], GetBackgroundValue());
263 m_Working_Support = clitk::JoinSlices<MaskImageType>(slices, m_Working_Support, 2);
265 StopCurrentStep<MaskImageType>(m_Working_Support);
266 m_ListOfStations["3A"] = m_Working_Support;
268 //--------------------------------------------------------------------