clitk::ExtractLymphStationsFilter<ImageType>::
ExtractStation_2RL_SetDefaultValues()
{
- SetFuzzyThreshold("2RL", "CommonCarotidArtery", 0.7);
- SetFuzzyThreshold("2RL", "BrachioCephalicArtery", 0.7);
- SetFuzzyThreshold("2RL", "BrachioCephalicVein", 0.3);
- SetFuzzyThreshold("2RL", "Aorta", 0.7);
- SetFuzzyThreshold("2RL", "SubclavianArteryRight", 0.5);
- SetFuzzyThreshold("2RL", "SubclavianArteryLeft", 0.8);
}
//--------------------------------------------------------------------
{
if ((!CheckForStation("2R")) && (!CheckForStation("2L"))) return;
- ExtractStation_2RL_SI_Limits();
- ExtractStation_2RL_Post_Limits();
-
- ExtractStation_2RL_Ant_Limits2();
- //ExtractStation_2RL_Ant_Limits();
-
- ExtractStation_2RL_LR_Limits();
- ExtractStation_2RL_Remove_Structures();
- ExtractStation_2RL_SeparateRL();
-
- // Store image filenames into AFDB
- writeImage<MaskImageType>(m_ListOfStations["2R"], "seg/Station2R.mhd");
- writeImage<MaskImageType>(m_ListOfStations["2L"], "seg/Station2L.mhd");
- GetAFDB()->SetImageFilename("Station2R", "seg/Station2R.mhd");
- GetAFDB()->SetImageFilename("Station2L", "seg/Station2L.mhd");
- WriteAFDB();
-
-}
-//--------------------------------------------------------------------
-
-
-//--------------------------------------------------------------------
-template <class ImageType>
-void
-clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_2RL_SI_Limits()
-{
- // Apex of the chest or Sternum & Carina.
- StartNewStep("[Station 2RL] Inf/Sup limits with Sternum and TopOfAorticArch/CaudalMarginOfLeftBrachiocephalicVein");
+ StartNewStep("Stations 2RL");
+ StartSubStep();
- /* Rod says: "For the inferior border, unlike in Atlas – UM, there
- is now a difference between 2R and 2L. 2R stops at the
- intersection of the caudal margin of the innominate vein with the
- trachea. 2L extends less inferiorly to the superior border of the
- aortic arch." */
-
- /* Get TopOfAorticArch and CaudalMarginOfLeftBrachiocephalicVein
- - TopOfAorticArch -> can be obtain from Aorta -> most sup part.
- - CaudalMarginOfLeftBrachiocephalicVein -> must inf part of BrachicephalicVein
- */
- MaskImagePointer Aorta = GetAFDB()->template GetImage<MaskImageType>("Aorta");
- MaskImagePointType p = Aorta->GetOrigin(); // initialise to avoid warning
- clitk::FindExtremaPointInAGivenDirection<MaskImageType>(Aorta, GetBackgroundValue(), 2, false, p);
- double TopOfAorticArchZ=p[2];
- GetAFDB()->SetDouble("TopOfAorticArchZ", TopOfAorticArchZ);
-
- MaskImagePointer BrachioCephalicVein = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicVein");
- clitk::FindExtremaPointInAGivenDirection<MaskImageType>(BrachioCephalicVein, GetBackgroundValue(), 2, true, p);
- double CaudalMarginOfLeftBrachiocephalicVeinZ=p[2];
- GetAFDB()->SetDouble("CaudalMarginOfLeftBrachiocephalicVeinZ", CaudalMarginOfLeftBrachiocephalicVeinZ);
-
- // First, cut on the most inferior part. Add one slice because this
- // inf slice should not be included.
- double inf = std::min(CaudalMarginOfLeftBrachiocephalicVeinZ, TopOfAorticArchZ) + m_Working_Support->GetSpacing()[2];
-
- // Get Sternum and search for the upper position
- MaskImagePointer Sternum = GetAFDB()->template GetImage<MaskImageType>("Sternum");
-
- // Search most sup point
- clitk::FindExtremaPointInAGivenDirection<MaskImageType>(Sternum, GetBackgroundValue(), 2, false, p);
- double m_SternumZ = p[2];
- // +Sternum->GetSpacing()[2]; // One more slice, because it is below this point // NOT HERE ?? WHY DIFFERENT FROM 3A ??
-
- //* Crop support :
- m_Working_Support =
- clitk::CropImageAlongOneAxis<MaskImageType>(m_Working_Support, 2,
- inf, m_SternumZ, true,
- GetBackgroundValue());
-
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
-}
-//--------------------------------------------------------------------
-
-
-//--------------------------------------------------------------------
-template <class ImageType>
-void
-clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_2RL_Ant_Limits()
-{
- // -----------------------------------------------------
- /* Rod says: "The anterior border, as with the Atlas – UM, is
- posterior to the vessels (right subclavian vein, left
- brachiocephalic vein, right brachiocephalic vein, left subclavian
- artery, left common carotid artery and brachiocephalic trunk).
- These vessels are not included in the nodal station. The anterior
- border is drawn to the midpoint of the vessel and an imaginary
- line joins the middle of these vessels. Between the vessels,
- station 2 is in contact with station 3a." */
-
- // -----------------------------------------------------
- StartNewStep("[Station 2RL] Ant limits with CommonCarotidArtery");
-
- // Get CommonCarotidArtery
- MaskImagePointer CommonCarotidArtery = GetAFDB()->template GetImage<MaskImageType>("CommonCarotidArtery");
-
- // Remove Ant to CommonCarotidArtery
- typedef SliceBySliceRelativePositionFilter<MaskImageType> SliceRelPosFilterType;
- typename SliceRelPosFilterType::Pointer sliceRelPosFilter = SliceRelPosFilterType::New();
- sliceRelPosFilter->VerboseStepFlagOff();
- sliceRelPosFilter->WriteStepFlagOff();
- sliceRelPosFilter->SetInput(m_Working_Support);
- sliceRelPosFilter->SetInputObject(CommonCarotidArtery);
- sliceRelPosFilter->SetDirection(2);
- sliceRelPosFilter->SetFuzzyThreshold(GetFuzzyThreshold("2RL", "CommonCarotidArtery"));
- sliceRelPosFilter->AddOrientationTypeString("NotAntTo");
- sliceRelPosFilter->IntermediateSpacingFlagOn();
- sliceRelPosFilter->SetIntermediateSpacing(2);
- sliceRelPosFilter->UniqueConnectedComponentBySliceOff();
- sliceRelPosFilter->UseASingleObjectConnectedComponentBySliceFlagOff();
- sliceRelPosFilter->AutoCropFlagOn();
- sliceRelPosFilter->IgnoreEmptySliceObjectFlagOn();
- sliceRelPosFilter->RemoveObjectFlagOff();
- sliceRelPosFilter->Update();
- m_Working_Support = sliceRelPosFilter->GetOutput();
-
- // End
- StopCurrentStep<MaskImageType>(m_Working_Support);
+ // Get the current support
+ StartNewStep("[Station 2RL] Get the current 2RL suppport");
+ m_ListOfStations["2R"] = m_ListOfSupports["S2R"];
+ m_ListOfStations["2L"] = m_ListOfSupports["S2L"];
+ StopCurrentStep<MaskImageType>(m_ListOfStations["2R"]);
+
+ // Do the same limits for R & L
+ m_Working_Support = m_ListOfStations["2R"];
+ ExtractStation_2RL_Ant_Limits("2R");
+ ExtractStation_2RL_Remove_Structures(" 2R");
m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
-
- // -----------------------------------------------------
- // Remove Ant to H line from the Ant most part of the
- // CommonCarotidArtery until we reach the first slice of
- // BrachioCephalicArtery
- StartNewStep("[Station 2RL] Ant limits with CommonCarotidArtery, H line");
- // First, find the first slice of BrachioCephalicArtery
- MaskImagePointer BrachioCephalicArtery = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicArtery");
- MaskImagePointType p = BrachioCephalicArtery->GetOrigin(); // initialise to avoid warning
- clitk::FindExtremaPointInAGivenDirection<MaskImageType>(BrachioCephalicArtery, GetBackgroundValue(), 2, false, p);
- double TopOfBrachioCephalicArteryZ=p[2] + BrachioCephalicArtery->GetSpacing()[2]; // Add one slice
-
- // Remove CommonCarotidArtery below this point
- CommonCarotidArtery = clitk::CropImageRemoveLowerThan<MaskImageType>(CommonCarotidArtery, 2, TopOfBrachioCephalicArteryZ, true, GetBackgroundValue());
-
- // Find most Ant points
- std::vector<MaskImagePointType> ccaAntPositionA;
- std::vector<MaskImagePointType> ccaAntPositionB;
- clitk::SliceBySliceBuildLineSegmentAccordingToExtremaPosition<MaskImageType>(CommonCarotidArtery,
- GetBackgroundValue(), 2,
- 1, true, // Ant
- 0, // Horizontal line
- -3, // margin
- ccaAntPositionA,
- ccaAntPositionB);
- // Cut ant to this line
- clitk::SliceBySliceSetBackgroundFromLineSeparation<MaskImageType>(m_Working_Support,
- ccaAntPositionA,
- ccaAntPositionB,
- GetBackgroundValue(), 1, 10);
-
- // End
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
+ m_Working_Support = m_ListOfStations["2L"];
+ ExtractStation_2RL_Ant_Limits("2L");
+ ExtractStation_2RL_Remove_Structures(" 2L");
m_ListOfStations["2L"] = m_Working_Support;
- // -----------------------------------------------------
- // Ant limit with the BrachioCephalicArtery
- StartNewStep("[Station 2RL] Ant limits with BrachioCephalicArtery line");
+ // Remove superior part to BrachioCephalicVein (used then by RelPos)
+ ExtractStation_2RL_Cut_BrachioCephalicVein_superiorly_when_it_split();
- // Remove Ant to BrachioCephalicArtery
- m_Working_Support =
- clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, BrachioCephalicArtery, 2,
- GetFuzzyThreshold("2RL", "BrachioCephalicArtery"), "NotAntTo", false, 2, true, false);
- // End
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
-
- // -----------------------------------------------------
- // Ant limit with the BrachioCephalicArtery H line
- StartNewStep("[Station 2RL] Ant limits with BrachioCephalicArtery, Horizontal line");
+ // Generic RelativePosition processes
+ m_ListOfStations["2R"] = this->ApplyRelativePositionList("Station_2R", m_ListOfStations["2R"]);
+ m_ListOfStations["2L"] = this->ApplyRelativePositionList("Station_2L", m_ListOfStations["2L"]);
- // Find most Ant points
- std::vector<MaskImagePointType> bctAntPositionA;
- std::vector<MaskImagePointType> bctAntPositionB;
- clitk::SliceBySliceBuildLineSegmentAccordingToExtremaPosition<MaskImageType>(BrachioCephalicArtery,
- GetBackgroundValue(), 2,
- 1, true, // Ant
- 0, // Horizontal line
- -1, // margin
- bctAntPositionA,
- bctAntPositionB);
- // Cut ant to this line
- clitk::SliceBySliceSetBackgroundFromLineSeparation<MaskImageType>(m_Working_Support,
- bctAntPositionA,
- bctAntPositionB,
- GetBackgroundValue(), 1, 10);
- // End
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
-
- // -----------------------------------------------------
- // Ant limit with the BrachioCephalicVein
- StartNewStep("[Station 2RL] Ant limits with BrachioCephalicVein");
-
- // Remove Ant to BrachioCephalicVein
- MaskImagePointer BrachioCephalicVein = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicVein");
- m_Working_Support =
- clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, BrachioCephalicVein, 2,
- GetFuzzyThreshold("2RL", "BrachioCephalicVein"), "NotAntTo", false, 2, true, false);
- // End
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
+ // Store image filenames into AFDB
+ writeImage<MaskImageType>(m_ListOfStations["2R"], "seg/Station2R.mhd");
+ writeImage<MaskImageType>(m_ListOfStations["2L"], "seg/Station2L.mhd");
+ GetAFDB()->SetImageFilename("Station2R", "seg/Station2R.mhd");
+ GetAFDB()->SetImageFilename("Station2L", "seg/Station2L.mhd");
+ WriteAFDB();
+ StopSubStep();
}
//--------------------------------------------------------------------
template <class ImageType>
void
clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_2RL_Ant_Limits2()
+ExtractStation_2RL_Ant_Limits(std::string s)
{
// -----------------------------------------------------
- StartNewStep("[Station 2RL] Ant limits with vessels centroids");
+ StartNewStep("[Station "+s+"] Ant limits with vessels centroids");
// WARNING, as I used "And" after, empty slice in binarizedContour
// lead to remove part of the support, although we want to keep
binarizedContour = clitk::ResizeImageLike<MaskImageType>(binarizedContour,
m_Working_Support,
GetForegroundValue());
-
// remove from support
typedef clitk::BooleanOperatorLabelImageFilter<MaskImageType> BoolFilterType;
typename BoolFilterType::Pointer boolFilter = BoolFilterType::New();
boolFilter->SetOperationType(BoolFilterType::And);
boolFilter->Update();
m_Working_Support = boolFilter->GetOutput();
-
+
// End
StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
}
//--------------------------------------------------------------------
template <class ImageType>
void
clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_2RL_Post_Limits()
+ExtractStation_2RL_Cut_BrachioCephalicVein_superiorly_when_it_split()
{
- StartNewStep("[Station 2RL] Post limits with post wall of Trachea");
-
- // Get Trachea
- MaskImagePointer Trachea = GetAFDB()->template GetImage<MaskImageType>("Trachea");
+ // -----------------------------------------------------
+ StartNewStep("[Station 2RL] Cut BrachioCephalicVein superiorly (when it split)");
- // Resize like the current support (to have the same number of slices)
- Trachea = clitk::ResizeImageLike<MaskImageType>(Trachea, m_Working_Support, GetBackgroundValue());
-
- // Find extrema post positions
- std::vector<MaskImagePointType> tracheaPostPositionsA;
- std::vector<MaskImagePointType> tracheaPostPositionsB;
- clitk::SliceBySliceBuildLineSegmentAccordingToExtremaPosition<MaskImageType>(Trachea,
- GetBackgroundValue(), 2,
- 1, false, // Post
- 0, // Horizontal line
- 1,
- tracheaPostPositionsA,
- tracheaPostPositionsB);
- // Cut post to this line
- clitk::SliceBySliceSetBackgroundFromLineSeparation<MaskImageType>(m_Working_Support,
- tracheaPostPositionsA,
- tracheaPostPositionsB,
- GetBackgroundValue(), 1, -10);
- // END
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
+ // Get BrachioCephalicVein
+ MaskImagePointer BrachioCephalicVein = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicVein");
+
+ // Remove the part superior to the slice where BrachioCephalicVein
+ // divide in two CCL
+ std::vector<MaskSlicePointer> BCV_slices;
+ clitk::ExtractSlices<MaskImageType>(BrachioCephalicVein, 2, BCV_slices);
+ bool stop = false;
+ uint i=0;
+ while (!stop) {
+ // Count the number of CCL
+ int nb;
+ clitk::LabelizeAndCountNumberOfObjects<MaskSliceType>(BCV_slices[i], GetBackgroundValue(), true, 1, nb);
+ if (nb>1) stop = true;
+ i++;
+ }
+ // Convert slice into coordinate
+ MaskImagePointType p;
+ MaskImageIndexType index;
+ index[0] = index[1] = 0;
+ index[2] = i;
+ BrachioCephalicVein->TransformIndexToPhysicalPoint(index, p);
+ BrachioCephalicVein =
+ clitk::CropImageRemoveGreaterThan<MaskImageType>(BrachioCephalicVein, 2,
+ p[2], true,
+ GetBackgroundValue());
+
+ // Now, insert this image in the AFDB (but do not store on disk)
+ GetAFDB()->template SetImage<MaskImageType>("BrachioCephalicVein_ForS2RL", "bidon",
+ BrachioCephalicVein, false);
+ // End
+ StopCurrentStep<MaskImageType>(BrachioCephalicVein);
}
//--------------------------------------------------------------------
template <class ImageType>
void
clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_2RL_LR_Limits()
+ExtractStation_2RL_Remove_Structures(std::string s)
{
- // ---------------------------------------------------------------------------
- StartNewStep("[Station 2RL] Left/Right limits with Aorta");
- MaskImagePointer Aorta = GetAFDB()->template GetImage<MaskImageType>("Aorta");
- // DD(GetFuzzyThreshold("2RL", "BrachioCephalicVein"));
- m_Working_Support =
- clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, Aorta, 2,
- GetFuzzyThreshold("2RL", "Aorta"),
- "RightTo", false, 2, true, false);
- // END
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
-
- // ---------------------------------------------------------------------------
- StartNewStep("[Station 2RL] Left/Right limits with SubclavianArtery (Right)");
-
- // SliceBySliceRelativePosition + select CCL most at Right
- MaskImagePointer SubclavianArtery = GetAFDB()->template GetImage<MaskImageType>("SubclavianArtery");
- typedef SliceBySliceRelativePositionFilter<MaskImageType> SliceRelPosFilterType;
- typename SliceRelPosFilterType::Pointer sliceRelPosFilter = SliceRelPosFilterType::New();
- sliceRelPosFilter->VerboseStepFlagOff();
- sliceRelPosFilter->WriteStepFlagOff();
- sliceRelPosFilter->SetInput(m_Working_Support);
- sliceRelPosFilter->SetInputObject(SubclavianArtery);
- sliceRelPosFilter->SetDirection(2);
- sliceRelPosFilter->SetFuzzyThreshold(GetFuzzyThreshold("2RL", "SubclavianArteryRight"));
- sliceRelPosFilter->AddOrientationTypeString("NotRightTo");
- sliceRelPosFilter->IntermediateSpacingFlagOn();
- sliceRelPosFilter->SetIntermediateSpacing(2);
- sliceRelPosFilter->UniqueConnectedComponentBySliceOff();
- sliceRelPosFilter->UseASingleObjectConnectedComponentBySliceFlagOff();
-
- sliceRelPosFilter->CCLSelectionFlagOn(); // select one CCL by slice
- sliceRelPosFilter->SetCCLSelectionDimension(0); // select according to X (0) axis
- sliceRelPosFilter->SetCCLSelectionDirection(-1); // select most at Right
- sliceRelPosFilter->CCLSelectionIgnoreSingleCCLFlagOn(); // ignore if only one CCL
-
- sliceRelPosFilter->AutoCropFlagOn();
- sliceRelPosFilter->IgnoreEmptySliceObjectFlagOn();
- sliceRelPosFilter->RemoveObjectFlagOff();
- sliceRelPosFilter->Update();
- m_Working_Support = sliceRelPosFilter->GetOutput();
-
- // END
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
-
-
- // ---------------------------------------------------------------------------
- StartNewStep("[Station 2RL] Left/Right limits with SubclavianArtery (Left)");
-
- // SliceBySliceRelativePosition + select CCL most at Right
- sliceRelPosFilter = SliceRelPosFilterType::New();
- sliceRelPosFilter->VerboseStepFlagOff();
- sliceRelPosFilter->WriteStepFlagOff();
- sliceRelPosFilter->SetInput(m_Working_Support);
- sliceRelPosFilter->SetInputObject(SubclavianArtery);
- sliceRelPosFilter->SetDirection(2);
- sliceRelPosFilter->SetFuzzyThreshold(GetFuzzyThreshold("2RL", "SubclavianArteryLeft"));
- sliceRelPosFilter->AddOrientationTypeString("NotLeftTo");
- sliceRelPosFilter->IntermediateSpacingFlagOn();
- sliceRelPosFilter->SetIntermediateSpacing(2);
- sliceRelPosFilter->UniqueConnectedComponentBySliceOff();
- sliceRelPosFilter->UseASingleObjectConnectedComponentBySliceFlagOff();
-
- sliceRelPosFilter->CCLSelectionFlagOn(); // select one CCL by slice
- sliceRelPosFilter->SetCCLSelectionDimension(0); // select according to X (0) axis
- sliceRelPosFilter->SetCCLSelectionDirection(+1); // select most at Left
- sliceRelPosFilter->CCLSelectionIgnoreSingleCCLFlagOff(); // do not ignore if only one CCL
-
- sliceRelPosFilter->AutoCropFlagOn();
- sliceRelPosFilter->IgnoreEmptySliceObjectFlagOn();
- sliceRelPosFilter->RemoveObjectFlagOff();
- sliceRelPosFilter->Update();
- m_Working_Support = sliceRelPosFilter->GetOutput();
-
- // END
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
-}
-//--------------------------------------------------------------------
-
-//--------------------------------------------------------------------
-template <class ImageType>
-void
-clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_2RL_Remove_Structures()
-{
- Remove_Structures("2RL", "BrachioCephalicVein");
- Remove_Structures("2RL", "CommonCarotidArtery");
- Remove_Structures("2RL", "SubclavianArtery");
- Remove_Structures("2RL", "Thyroid");
- Remove_Structures("2RL", "Aorta");
-
- // END
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support;
+ // m_Working_Support must be set
+ Remove_Structures(s, "BrachioCephalicVein");
+ Remove_Structures(s, "BrachioCephalicArtery");
+ Remove_Structures(s, "CommonCarotidArteryLeft");
+ Remove_Structures(s, "CommonCarotidArteryRight");
+ Remove_Structures(s, "SubclavianArteryLeft");
+ Remove_Structures(s, "SubclavianArteryRight");
+ Remove_Structures(s, "Thyroid");
+ Remove_Structures(s, "Aorta");
}
//--------------------------------------------------------------------
-//--------------------------------------------------------------------
-template <class ImageType>
-void
-clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_2RL_SeparateRL()
-{
- // ---------------------------------------------------------------------------
- StartNewStep("[Station 2RL] Separate 2R/2L according to Trachea");
-
- /*Rod says:
-
- "For station 2 there is a shift, dividing 2R from 2L, from midline
- to the left paratracheal border."
-
- Algo:
- - Consider Trachea SliceBySlice
- - find extrema at Left
- - add margins towards Right
- - remove what is at Left of this line
- */
-
- // Get Trachea
- MaskImagePointer Trachea = GetAFDB()->template GetImage<MaskImageType>("Trachea");
-
- // Resize like the current support (to have the same number of slices)
- Trachea = clitk::ResizeImageLike<MaskImageType>(Trachea, m_Working_Support, GetBackgroundValue());
-
- // Find extrema post positions
- std::vector<MaskImagePointType> tracheaLeftPositionsA;
- std::vector<MaskImagePointType> tracheaLeftPositionsB;
- clitk::SliceBySliceBuildLineSegmentAccordingToExtremaPosition<MaskImageType>(Trachea,
- GetBackgroundValue(), 2,
- 0, false, // Left
- 1, // Vertical line
- 1, // margins
- tracheaLeftPositionsA,
- tracheaLeftPositionsB);
- // Copy support for R and L
- typedef itk::ImageDuplicator<MaskImageType> DuplicatorType;
- DuplicatorType::Pointer duplicator = DuplicatorType::New();
- duplicator->SetInputImage(m_Working_Support);
- duplicator->Update();
- MaskImageType::Pointer m_Working_Support2 = duplicator->GetOutput();
-
- // Cut post to this line for Right part
- clitk::SliceBySliceSetBackgroundFromLineSeparation<MaskImageType>(m_Working_Support,
- tracheaLeftPositionsA,
- tracheaLeftPositionsB,
- GetBackgroundValue(), 0, -10);
- writeImage<MaskImageType>(m_Working_Support, "R.mhd");
-
- // Cut post to this line for Left part
- clitk::SliceBySliceSetBackgroundFromLineSeparation<MaskImageType>(m_Working_Support2,
- tracheaLeftPositionsA,
- tracheaLeftPositionsB,
- GetBackgroundValue(), 0, +10);
- writeImage<MaskImageType>(m_Working_Support2, "L.mhd");
-
- // END
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["2R"] = m_Working_Support;
- m_ListOfStations["2L"] = m_Working_Support2;
-}
-//--------------------------------------------------------------------
clitk::ExtractLymphStationsFilter<ImageType>::
ExtractStation_3A_SetDefaultValues()
{
- SetFuzzyThreshold("3A", "Sternum", 0.5);
- SetFuzzyThreshold("3A", "SubclavianArtery", 0.5);
}
//--------------------------------------------------------------------
m_ListOfStations["3A"] = m_Working_Support;
StopCurrentStep<MaskImageType>(m_Working_Support);
- ExtractStation_3A_AntPost_S5();
- ExtractStation_3A_AntPost_S6();
+ ExtractStation_3A_Post_Left_Limits_With_Aorta_S5_Support();
+ ExtractStation_3A_Post_Limits_With_Dilated_Aorta_S6_Support();
ExtractStation_3A_AntPost_Superiorly();
ExtractStation_3A_Remove_Structures();
-
- Remove_Structures("3A", "Aorta");
- Remove_Structures("3A", "SubclavianArteryLeft");
- Remove_Structures("3A", "SubclavianArteryRight");
- Remove_Structures("3A", "Thyroid");
- Remove_Structures("3A", "CommonCarotidArteryLeft");
- Remove_Structures("3A", "CommonCarotidArteryRight");
- Remove_Structures("3A", "BrachioCephalicArtery");
-
- ExtractStation_3A_PostToBones();
+ // Generic RelativePosition processes
+ m_ListOfStations["3A"] = this->ApplyRelativePositionList("Station_3A", m_ListOfStations["3A"]);
+
// Keep a single CCL
m_ListOfStations["3A"] =
clitk::SliceBySliceKeepMainCCL<MaskImageType>(m_ListOfStations["3A"],
template <class ImageType>
void
clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_3A_AntPost_S5()
+ExtractStation_3A_Post_Left_Limits_With_Aorta_S5_Support()
{
- StartNewStep("[Station 3A] Post limits around S5");
-
- // First remove post to SVC
- MaskImagePointer SVC = GetAFDB()->template GetImage <MaskImageType>("SVC");
-
- // Trial in 3D -> difficulties superiorly. Stay slice by slice.
- // Slice by slice not post to SVC. Use initial spacing
- m_Working_Support =
- clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, SVC, 2,
- GetFuzzyThreshold("3A", "SVC"),
- "NotPostTo", true,
- SVC->GetSpacing()[0], false, false);
+ StartNewStep("[Station 3A] Post limits in S5 support according to Aorta");
- // Consider Aorta, remove Left/Post part ; only around S5
+ // Consider Aorta, remove Left/Post part ; only around S5
// Get S5 support and Aorta
MaskImagePointer S5 = m_ListOfSupports["S5"];
MaskImagePointer Aorta = GetAFDB()->template GetImage <MaskImageType>("Aorta");
template <class ImageType>
void
clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_3A_AntPost_S6()
+ExtractStation_3A_Post_Limits_With_Dilated_Aorta_S6_Support()
{
- StartNewStep("[Station 3A] Post limits around S6");
+ StartNewStep("[Station 3A] Post limits with dilated Aorta");
// Consider Aorta
MaskImagePointer Aorta = GetAFDB()->template GetImage <MaskImageType>("Aorta");
radius[2] = 0; // required
Aorta = clitk::Dilate<MaskImageType>(Aorta, radius, GetBackgroundValue(), GetForegroundValue(), false);
+ // Now, insert this image in the AFDB (but do not store on disk)
+ GetAFDB()->template SetImage<MaskImageType>("Aorta_Dilated_Anteriorly", "bidon",
+ Aorta, false);
+ /*
// Not Post to
m_Working_Support =
clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, Aorta, 2,
GetFuzzyThreshold("3A", "Aorta"),
"NotPostTo", true,
Aorta->GetSpacing()[0], false, false);
+
+ */
+
StopCurrentStep<MaskImageType>(m_Working_Support);
m_ListOfStations["3A"] = m_Working_Support;
ExtractStation_3A_AntPost_Superiorly()
{
StartNewStep("[Station 3A] Post limits superiorly");
-
- /*
- MaskImagePointer BrachioCephalicVein = GetAFDB()->template GetImage <MaskImageType>("BrachioCephalicVein");
- MaskImagePointer BrachioCephalicArtery = GetAFDB()->template GetImage <MaskImageType>("BrachioCephalicArtery");
- MaskImagePointer CommonCarotidArteryLeft = GetAFDB()->template GetImage <MaskImageType>("CommonCarotidArteryLeft");
- MaskImagePointer CommonCarotidArteryRight = GetAFDB()->template GetImage <MaskImageType>("CommonCarotidArteryRight");
- MaskImagePointer SubclavianArteryLeft = GetAFDB()->template GetImage <MaskImageType>("SubclavianArteryLeft");
- MaskImagePointer SubclavianArteryRight = GetAFDB()->template GetImage <MaskImageType>("SubclavianArteryRight");
-
- // Not Post to
-#define RP(STRUCTURE) \
- m_Working_Support = \
- clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, STRUCTURE, 2, \
- 0.5, \
- "NotPostTo", true, \
- STRUCTURE->GetSpacing()[0], false, false);
-
- // RP(BrachioCephalicVein);
- RP(BrachioCephalicArtery);
- RP(CommonCarotidArteryRight);
- RP(CommonCarotidArteryLeft);
- RP(SubclavianArteryRight);
- RP(SubclavianArteryLeft);
- */
// Get or compute the binary mask that separate Ant/Post part
// according to vessels
clitk::ExtractLymphStationsFilter<ImageType>::
ExtractStation_3A_Remove_Structures()
{
- Remove_Structures("3A", "Aorta");
- Remove_Structures("3A", "SubclavianArteryLeft");
- Remove_Structures("3A", "SubclavianArteryRight");
- Remove_Structures("3A", "Thyroid");
- Remove_Structures("3A", "CommonCarotidArteryLeft");
- Remove_Structures("3A", "CommonCarotidArteryRight");
- Remove_Structures("3A", "BrachioCephalicArtery");
+ Remove_Structures(" 3A", "Aorta");
+ Remove_Structures(" 3A", "SubclavianArteryLeft");
+ Remove_Structures(" 3A", "SubclavianArteryRight");
+ Remove_Structures(" 3A", "Thyroid");
+ Remove_Structures(" 3A", "CommonCarotidArteryLeft");
+ Remove_Structures(" 3A", "CommonCarotidArteryRight");
+ Remove_Structures(" 3A", "BrachioCephalicArtery");
+ // Remove_Structures("3A", "Bones"); --> should be in extractmediastinum
// Remove_Structures("3A", "BrachioCephalicVein"); ?
StartNewStep("[Station 3A] Remove part of BrachioCephalicVein");
//--------------------------------------------------------------------
-//--------------------------------------------------------------------
-template <class ImageType>
-void
-clitk::ExtractLymphStationsFilter<ImageType>::
-ExtractStation_3A_PostToBones()
-{
- StartNewStep("[Station 3A] Post limits with bones");
-
- // limits with bones
- MaskImagePointer Bones = GetAFDB()->template GetImage<MaskImageType>("Bones");
- m_Working_Support =
- clitk::SliceBySliceRelativePosition<MaskImageType>(m_Working_Support, Bones, 2,
- GetFuzzyThreshold("3A", "Bones"), "NotAntTo",
- false, 3, true, false);
-
- StopCurrentStep<MaskImageType>(m_Working_Support);
- m_ListOfStations["3A"] = m_Working_Support;
-}
-//--------------------------------------------------------------------
-