+ for(uint i=0; i<slices_support.size(); i++) {
+ // Get Trachea centroid
+ std::vector<typename MaskSliceType::PointType> centroids;
+ typename MaskSliceType::PointType c;
+ ComputeCentroids<MaskSliceType>(slices_trachea[i], GetBackgroundValue(), centroids);
+ c = centroids[1];
+
+ // [debug] Store point
+ clitk::PointsUtils<MaskImageType>::Convert2DTo3D(centroids[1], Trachea, i, p);
+ points.push_back(p);
+
+ // Get Right and Left CCL in SubclavianArtery
+ slices_subclavianartery[i] = Labelize<MaskSliceType>(slices_subclavianartery[i], 0, true, 10);
+ ComputeCentroids<MaskSliceType>(slices_subclavianartery[i], GetBackgroundValue(), centroids);
+
+ if (centroids.size() > 1) {
+ // Determine the one at Right/Left -> first after Trachea
+ // centroid
+ typename MaskSliceType::PointType right;
+ typename MaskSliceType::PointType left;
+ int label_right=-1;
+ int label_left=-1;
+ right[0] = c[0]-100;
+ left[0] = c[0]+100;
+ for(uint j=1; j<centroids.size(); j++) {
+ if (centroids[j][0] < c[0]) { // At Right of Trachea centroid
+ if (centroids[j][0] >= right[0]) {
+ right = centroids[j];
+ label_right = j;
+ }
+ }
+ if (centroids[j][0] > c[0]) { // At Left of Trachea centroid
+ if (centroids[j][0] <= left[0]) {
+ left = centroids[j];
+ label_left = j;
+ }
+ }
+ }
+
+ if (label_right != -1) {
+
+ // Debug points
+ clitk::PointsUtils<MaskImageType>::Convert2DTo3D(centroids[label_right], SubclavianArtery, i, p);
+ points.push_back(p);
+
+ // Set Background and ForegroundValue according to label_right
+ MaskSlicePointer object =
+ clitk::Binarize<MaskSliceType>(slices_subclavianartery[i], label_right, label_right,
+ GetBackgroundValue(), GetForegroundValue());
+
+ // Relative Position : not at Right
+ typedef clitk::AddRelativePositionConstraintToLabelImageFilter<MaskSliceType> RelPosFilterType;
+ typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
+ relPosFilter->VerboseStepFlagOff();
+ relPosFilter->WriteStepFlagOff();
+ relPosFilter->SetBackgroundValue(GetBackgroundValue());
+ relPosFilter->SetInput(slices_support[i]);
+ relPosFilter->SetInputObject(object);
+ relPosFilter->AddOrientationTypeString("RightTo");
+ relPosFilter->SetInverseOrientationFlag(true);
+ // relPosFilter->SetIntermediateSpacing(3);
+ relPosFilter->SetIntermediateSpacingFlag(false);
+ relPosFilter->SetFuzzyThreshold(0.7);
+ relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
+ relPosFilter->Update();
+ slices_support[i] = relPosFilter->GetOutput();
+
+ // Relative Position : not Anterior
+ relPosFilter = RelPosFilterType::New();
+ relPosFilter->VerboseStepFlagOff();
+ relPosFilter->WriteStepFlagOff();
+ relPosFilter->SetBackgroundValue(GetBackgroundValue());
+ relPosFilter->SetInput(slices_support[i]);
+ relPosFilter->SetInputObject(object);
+ relPosFilter->AddOrientationTypeString("AntTo");
+ relPosFilter->SetInverseOrientationFlag(true);
+ // relPosFilter->SetIntermediateSpacing(3);
+ relPosFilter->SetIntermediateSpacingFlag(false);
+ relPosFilter->SetFuzzyThreshold(0.7);
+ relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
+ relPosFilter->Update();
+ slices_support[i] = relPosFilter->GetOutput();
+
+ } // End RelativePosition for Right
+
+
+ if (label_left != -1) {
+
+ // Debug points
+ clitk::PointsUtils<MaskImageType>::Convert2DTo3D(centroids[label_left], SubclavianArtery, i, p);
+ points.push_back(p);
+
+ // Set Background and ForegroundValue according to label_right
+ MaskSlicePointer object =
+ clitk::Binarize<MaskSliceType>(slices_subclavianartery[i], label_left, label_left,
+ GetBackgroundValue(), GetForegroundValue());
+
+ // Relative Position : not at Right
+ typedef clitk::AddRelativePositionConstraintToLabelImageFilter<MaskSliceType> RelPosFilterType;
+ typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
+ relPosFilter->VerboseStepFlagOff();
+ relPosFilter->WriteStepFlagOff();
+ relPosFilter->SetBackgroundValue(GetBackgroundValue());
+ relPosFilter->SetInput(slices_support[i]);
+ relPosFilter->SetInputObject(object);
+ relPosFilter->AddOrientationTypeString("L");
+ relPosFilter->SetInverseOrientationFlag(true);
+ // relPosFilter->SetIntermediateSpacing(3);
+ relPosFilter->SetIntermediateSpacingFlag(false);
+ relPosFilter->SetFuzzyThreshold(0.7);
+ relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
+ relPosFilter->Update();
+ slices_support[i] = relPosFilter->GetOutput();
+
+ // Relative Position : not Anterior
+ relPosFilter = RelPosFilterType::New();
+ relPosFilter->VerboseStepFlagOff();
+ relPosFilter->WriteStepFlagOff();
+ relPosFilter->SetBackgroundValue(GetBackgroundValue());
+ relPosFilter->SetInput(slices_support[i]);
+ relPosFilter->SetInputObject(object);
+ relPosFilter->AddOrientationTypeString("A");
+ relPosFilter->SetInverseOrientationFlag(true);
+ // relPosFilter->SetIntermediateSpacing(3);
+ relPosFilter->SetIntermediateSpacingFlag(false);
+ relPosFilter->SetFuzzyThreshold(0.7);
+ relPosFilter->AutoCropFlagOff(); // important ! because we join the slices after this loop
+ relPosFilter->Update();
+ slices_support[i] = relPosFilter->GetOutput();
+
+ }
+
+
+ } // if centroids.size > 1
+ } // End loop slices
+
+ // Joint slices
+ m_Working_Support = clitk::JoinSlices<MaskImageType>(slices_support, m_Working_Support, 2);
+
+ // Save list points
+ clitk::WriteListOfLandmarks<MaskImageType>(points, "subcl-lr.txt");
+