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", "seg/Aorta_Dilated_Anteriorly.mha", Aorta, false);
152 writeImage<MaskImageType>(Aorta, "seg/Aorta_Dilated_Anteriorly.mha");
155 StopCurrentStep<MaskImageType>(m_Working_Support);
156 m_ListOfStations["3A"] = m_Working_Support;
158 //--------------------------------------------------------------------
161 //--------------------------------------------------------------------
162 template <class ImageType>
164 clitk::ExtractLymphStationsFilter<ImageType>::
165 ExtractStation_3A_AntPost_Superiorly()
167 StartNewStep("[Station 3A] Post limits superiorly");
169 // Get or compute the binary mask that separate Ant/Post part
170 // according to vessels
171 MaskImagePointer binarizedContour = FindAntPostVessels2();
172 binarizedContour = clitk::ResizeImageLike<MaskImageType>(binarizedContour,
174 GetBackgroundValue());
176 // remove from support
177 typedef clitk::BooleanOperatorLabelImageFilter<MaskImageType> BoolFilterType;
178 typename BoolFilterType::Pointer boolFilter = BoolFilterType::New();
179 boolFilter->InPlaceOn();
180 boolFilter->SetInput1(m_Working_Support);
181 boolFilter->SetInput2(binarizedContour);
182 boolFilter->SetBackgroundValue1(GetBackgroundValue());
183 boolFilter->SetBackgroundValue2(GetBackgroundValue());
184 boolFilter->SetOperationType(BoolFilterType::AndNot);
185 boolFilter->Update();
186 m_Working_Support = boolFilter->GetOutput();
188 StopCurrentStep<MaskImageType>(m_Working_Support);
189 m_ListOfStations["3A"] = m_Working_Support;
191 //--------------------------------------------------------------------
194 //--------------------------------------------------------------------
195 template <class ImageType>
197 clitk::ExtractLymphStationsFilter<ImageType>::
198 ExtractStation_3A_Remove_Structures()
200 Remove_Structures(" 3A", "Aorta");
201 Remove_Structures(" 3A", "LeftSubclavianArtery");
202 Remove_Structures(" 3A", "RightSubclavianArtery");
203 Remove_Structures(" 3A", "Thyroid");
204 Remove_Structures(" 3A", "LeftCommonCarotidArtery");
205 Remove_Structures(" 3A", "RightCommonCarotidArtery");
206 Remove_Structures(" 3A", "BrachioCephalicArtery");
207 // Remove_Structures("3A", "Bones"); --> should be in extractmediastinum
208 // Remove_Structures("3A", "BrachioCephalicVein"); ?
210 StartNewStep("[Station 3A] Remove part of BrachioCephalicVein");
211 // resize like support, extract slices
212 // while single CCL -> remove
213 // when two remove only the most post
214 MaskImagePointer BrachioCephalicVein =
215 GetAFDB()->template GetImage <MaskImageType>("BrachioCephalicVein");
216 BrachioCephalicVein = clitk::ResizeImageLike<MaskImageType>(BrachioCephalicVein,
218 GetBackgroundValue());
219 std::vector<MaskSlicePointer> slices;
220 std::vector<MaskSlicePointer> slices_BCV;
221 clitk::ExtractSlices<MaskImageType>(m_Working_Support, 2, slices);
222 clitk::ExtractSlices<MaskImageType>(BrachioCephalicVein, 2, slices_BCV);
223 for(uint i=0; i<slices.size(); i++) {
224 // Labelize slices_BCV
225 slices_BCV[i] = Labelize<MaskSliceType>(slices_BCV[i], 0, true, 1);
228 std::vector<typename MaskSliceType::PointType> centroids;
229 ComputeCentroids<MaskSliceType>(slices_BCV[i], GetBackgroundValue(), centroids);
231 // If several centroid, select the one most anterior
232 if (centroids.size() > 2) {
233 // Only keep the one most post
234 typename MaskSliceType::PixelType label;
235 if (centroids[1][1] > centroids[2][1]) {
242 slices_BCV[i] = clitk::SetBackground<MaskSliceType, MaskSliceType>(slices_BCV[i],
245 GetBackgroundValue(),
249 // Remove from the support
250 clitk::AndNot<MaskSliceType>(slices[i], slices_BCV[i], GetBackgroundValue());
254 m_Working_Support = clitk::JoinSlices<MaskImageType>(slices, m_Working_Support, 2);
256 StopCurrentStep<MaskImageType>(m_Working_Support);
257 m_ListOfStations["3A"] = m_Working_Support;
259 //--------------------------------------------------------------------