X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=segmentation%2FclitkExtractLymphStationsFilter.txx;h=64455a87a218b79c28d86ee391b7b4a4e5c784e8;hb=5a7da4aedae5c204bc55c187717193e5950f9a44;hp=5f9bef0c1865923b1905d2cadf641e5a467d4838;hpb=52ed5f9ca1bbe477fecfe703566993fed4e8895a;p=clitk.git diff --git a/segmentation/clitkExtractLymphStationsFilter.txx b/segmentation/clitkExtractLymphStationsFilter.txx index 5f9bef0..64455a8 100644 --- a/segmentation/clitkExtractLymphStationsFilter.txx +++ b/segmentation/clitkExtractLymphStationsFilter.txx @@ -50,21 +50,27 @@ template clitk::ExtractLymphStationsFilter:: ExtractLymphStationsFilter(): - clitk::FilterBase(), - clitk::FilterWithAnatomicalFeatureDatabaseManagement(), - itk::ImageToImageFilter() + clitk::StructuresExtractionFilter() { this->SetNumberOfRequiredInputs(1); SetBackgroundValue(0); SetForegroundValue(1); - ComputeStationsSupportsFlagOn(); + ForceSupportsFlagOn(); + SetSupportLimitsFilename("none"); + CheckSupportFlagOff(); // Default values - ExtractStation_8_SetDefaultValues(); ExtractStation_3P_SetDefaultValues(); ExtractStation_2RL_SetDefaultValues(); ExtractStation_3A_SetDefaultValues(); + ExtractStation_1RL_SetDefaultValues(); + ExtractStation_4RL_SetDefaultValues(); + ExtractStation_5_SetDefaultValues(); + ExtractStation_6_SetDefaultValues(); + + // TODO ExtractStation_7_SetDefaultValues(); + ExtractStation_8_SetDefaultValues(); } //-------------------------------------------------------------------- @@ -75,78 +81,81 @@ void clitk::ExtractLymphStationsFilter:: GenerateOutputInformation() { // Get inputs - LoadAFDB(); + this->LoadAFDB(); m_Input = dynamic_cast(itk::ProcessObject::GetInput(0)); - m_Mediastinum = GetAFDB()->template GetImage ("Mediastinum"); + m_Mediastinum = this->GetAFDB()->template GetImage ("Mediastinum"); + + // DD(this->GetVerboseMemoryFlag()); + // clitk::PrintMemory(this->GetVerboseMemoryFlag(), "Start"); // Clean some computer landmarks to force the recomputation - GetAFDB()->RemoveTag("AntPostVesselsSeparation"); - - // Global supports for stations - if (GetComputeStationsSupportsFlag()) { - StartNewStep("Supports for stations"); - StartSubStep(); - GetAFDB()->RemoveTag("CarinaZ"); - GetAFDB()->RemoveTag("ApexOfTheChestZ"); - GetAFDB()->RemoveTag("ApexOfTheChest"); - GetAFDB()->RemoveTag("RightBronchus"); - GetAFDB()->RemoveTag("LeftBronchus"); - GetAFDB()->RemoveTag("SuperiorBorderOfAorticArchZ"); - GetAFDB()->RemoveTag("SuperiorBorderOfAorticArch"); - GetAFDB()->RemoveTag("InferiorBorderOfAorticArchZ"); - GetAFDB()->RemoveTag("InferiorBorderOfAorticArch"); - ExtractStationSupports(); - StopSubStep(); - } - else { - m_ListOfSupports["S1R"] = GetAFDB()->template GetImage("Support_S1R"); - m_ListOfSupports["S1L"] = GetAFDB()->template GetImage("Support_S1L"); - m_ListOfSupports["S2R"] = GetAFDB()->template GetImage("Support_S2R"); - m_ListOfSupports["S2L"] = GetAFDB()->template GetImage("Support_S2L"); - m_ListOfSupports["S4R"] = GetAFDB()->template GetImage("Support_S4R"); - m_ListOfSupports["S4L"] = GetAFDB()->template GetImage("Support_S4L"); - - m_ListOfSupports["S3A"] = GetAFDB()->template GetImage("Support_S3A"); - m_ListOfSupports["S3P"] = GetAFDB()->template GetImage("Support_S3P"); - m_ListOfSupports["S5"] = GetAFDB()->template GetImage("Support_S5"); - m_ListOfSupports["S6"] = GetAFDB()->template GetImage("Support_S6"); - m_ListOfSupports["S7"] = GetAFDB()->template GetImage("Support_S7"); - m_ListOfSupports["S8"] = GetAFDB()->template GetImage("Support_S8"); - m_ListOfSupports["S9"] = GetAFDB()->template GetImage("Support_S9"); - m_ListOfSupports["S10"] = GetAFDB()->template GetImage("Support_S10"); - m_ListOfSupports["S11"] = GetAFDB()->template GetImage("Support_S11"); + // FIXME -> to put elsewhere ? + this->GetAFDB()->RemoveTag("AntPostVesselsSeparation"); + + // Must I compute the supports ? + bool supportsExist = true; + if (!GetForceSupportsFlag()) { + try { + m_ListOfSupports["S1R"] = this->GetAFDB()->template GetImage("Support_S1R"); + m_ListOfSupports["S1L"] = this->GetAFDB()->template GetImage("Support_S1L"); + m_ListOfSupports["S2R"] = this->GetAFDB()->template GetImage("Support_S2R"); + m_ListOfSupports["S2L"] = this->GetAFDB()->template GetImage("Support_S2L"); + m_ListOfSupports["S4R"] = this->GetAFDB()->template GetImage("Support_S4R"); + m_ListOfSupports["S4L"] = this->GetAFDB()->template GetImage("Support_S4L"); + + m_ListOfSupports["S3A"] = this->GetAFDB()->template GetImage("Support_S3A"); + m_ListOfSupports["S3P"] = this->GetAFDB()->template GetImage("Support_S3P"); + m_ListOfSupports["S5"] = this->GetAFDB()->template GetImage("Support_S5"); + m_ListOfSupports["S6"] = this->GetAFDB()->template GetImage("Support_S6"); + m_ListOfSupports["S7"] = this->GetAFDB()->template GetImage("Support_S7"); + m_ListOfSupports["S8"] = this->GetAFDB()->template GetImage("Support_S8"); + m_ListOfSupports["S9"] = this->GetAFDB()->template GetImage("Support_S9"); + m_ListOfSupports["S10"] = this->GetAFDB()->template GetImage("Support_S10"); + m_ListOfSupports["S11"] = this->GetAFDB()->template GetImage("Support_S11"); + } catch(clitk::ExceptionObject o) { + supportsExist = false; + } } - // Extract Station8 - ExtractStation_8(); + if (!supportsExist || GetForceSupportsFlag()) { + this->StartNewStep("Supports for stations"); + this->StartSubStep(); + + // FIXME : why should I remove theses tags ??? + this->GetAFDB()->RemoveTag("CarinaZ"); + this->GetAFDB()->RemoveTag("ApexOfTheChestZ"); + this->GetAFDB()->RemoveTag("ApexOfTheChest"); + this->GetAFDB()->RemoveTag("RightBronchus"); + this->GetAFDB()->RemoveTag("LeftBronchus"); + this->GetAFDB()->RemoveTag("SuperiorBorderOfAorticArchZ"); + this->GetAFDB()->RemoveTag("SuperiorBorderOfAorticArch"); + this->GetAFDB()->RemoveTag("InferiorBorderOfAorticArchZ"); + this->GetAFDB()->RemoveTag("InferiorBorderOfAorticArch"); + ExtractStationSupports(); + this->StopSubStep(); + } - // Extract Station3P + // Extract Stations + ExtractStation_1RL(); + ExtractStation_2RL(); ExtractStation_3P(); - - // Extract Station3A ExtractStation_3A(); + ExtractStation_4R(); + ExtractStation_4L(); + ExtractStation_5(); + ExtractStation_6(); - // HERE + // ---------- todo ----------------------- - // Extract Station2RL - StartNewStep("Station 2RL"); - StartSubStep(); - ExtractStation_2RL(); - StopSubStep(); + // Extract Station8 + // ExtractStation_8(); // Extract Station7 - StartNewStep("Station 7"); - StartSubStep(); - ExtractStation_7(); - StopSubStep(); - - if (0) { // temporary suppress - // Extract Station4RL - StartNewStep("Station 4RL"); - StartSubStep(); - //ExtractStation_4RL(); - StopSubStep(); - } + //this->StartNewStep("Station 7"); + //this->StartSubStep(); + //ExtractStation_7(); + //this->StopSubStep(); + } //-------------------------------------------------------------------- @@ -167,7 +176,7 @@ void clitk::ExtractLymphStationsFilter:: GenerateData() { // Final Step -> graft output (if SetNthOutput => redo) - this->GraftOutput(m_ListOfStations["8"]); + // this->GraftOutput(m_ListOfStations["8"]); } //-------------------------------------------------------------------- @@ -182,25 +191,29 @@ CheckForStation(std::string station) std::string s = "Station"+station; - // Check if station already exist in DB - bool found = false; - if (GetAFDB()->TagExist(s)) { - m_ListOfStations[station] = GetAFDB()->template GetImage(s); - found = true; - } - // Define the starting support - if (found && GetComputeStation(station)) { - std::cout << "Station " << station << " already exists, but re-computation forced." << std::endl; - } - if (!found || GetComputeStation(station)) { - m_Working_Support = m_Mediastinum = GetAFDB()->template GetImage("Mediastinum", true); + // if (GetComputeStation(station)) { + // std::cout << "Station " << station << " already exists, but re-computation forced." << std::endl; + // } + if (GetComputeStation(station)) { + m_Working_Support = m_Mediastinum = this->GetAFDB()->template GetImage("Mediastinum", true); return true; } - else { - std::cout << "Station " << station << " found. I used it" << std::endl; - return false; + else return false; + // else { + // std::cout << "Station " << station << " found. I used it" << std::endl; + // return false; + // } + + // Check if station already exist in DB + + // FIXME -> do nothing if not on the command line. Is it what I want ? + //bool found = false; + if (this->GetAFDB()->TagExist(s)) { + m_ListOfStations[station] = this->GetAFDB()->template GetImage(s); + //found = true; } + } //-------------------------------------------------------------------- @@ -305,23 +318,6 @@ void ComputeImageBoundariesCoordinates(typename ImageType::Pointer image, //-------------------------------------------------------------------- -//-------------------------------------------------------------------- -template -void -clitk::ExtractLymphStationsFilter:: -ExtractStation_4RL() { - DD("TODO"); - exit(0); - /* - WARNING ONLY 4R FIRST !!! (not same inf limits) - */ - ExtractStation_4RL_SI_Limits(); - ExtractStation_4RL_LR_Limits(); - ExtractStation_4RL_AP_Limits(); -} -//-------------------------------------------------------------------- - - //-------------------------------------------------------------------- template void @@ -329,8 +325,8 @@ clitk::ExtractLymphStationsFilter:: Remove_Structures(std::string station, std::string s) { try { - StartNewStep("[Station"+station+"] Remove "+s); - MaskImagePointer Structure = GetAFDB()->template GetImage(s); + this->StartNewStep("[Station"+station+"] Remove "+s); + MaskImagePointer Structure = this->GetAFDB()->template GetImage(s); clitk::AndNot(m_Working_Support, Structure, GetBackgroundValue()); } catch(clitk::ExceptionObject e) { @@ -415,22 +411,22 @@ FindLineForS7S8Separation(MaskImagePointType & A, MaskImagePointType & B) // B = lower border of bronchus intermedius (BI) or RightMiddleLobeBronchus try { - GetAFDB()->GetPoint3D("LineForS7S8Separation_Begin", A); - GetAFDB()->GetPoint3D("LineForS7S8Separation_End", B); + this->GetAFDB()->GetPoint3D("LineForS7S8Separation_Begin", A); + this->GetAFDB()->GetPoint3D("LineForS7S8Separation_End", B); } catch(clitk::ExceptionObject & o) { DD("FindLineForS7S8Separation"); // Load LeftLowerLobeBronchus and get centroid point MaskImagePointer LeftLowerLobeBronchus = - GetAFDB()->template GetImage ("LeftLowerLobeBronchus"); + this->GetAFDB()->template GetImage ("LeftLowerLobeBronchus"); std::vector c; clitk::ComputeCentroids(LeftLowerLobeBronchus, GetBackgroundValue(), c); A = c[1]; // Load RightMiddleLobeBronchus and get superior point (not centroid here) MaskImagePointer RightMiddleLobeBronchus = - GetAFDB()->template GetImage ("RightMiddleLobeBronchus"); + this->GetAFDB()->template GetImage ("RightMiddleLobeBronchus"); bool b = FindExtremaPointInAGivenDirection(RightMiddleLobeBronchus, GetBackgroundValue(), 2, false, B); @@ -439,8 +435,8 @@ FindLineForS7S8Separation(MaskImagePointType & A, MaskImagePointType & B) } // Insert into the DB - GetAFDB()->SetPoint3D("LineForS7S8Separation_Begin", A); - GetAFDB()->SetPoint3D("LineForS7S8Separation_End", B); + this->GetAFDB()->SetPoint3D("LineForS7S8Separation_Begin", A); + this->GetAFDB()->SetPoint3D("LineForS7S8Separation_End", B); } } //-------------------------------------------------------------------- @@ -454,24 +450,24 @@ FindCarina() { double z; try { - z = GetAFDB()->GetDouble("CarinaZ"); + z = this->GetAFDB()->GetDouble("CarinaZ"); } catch(clitk::ExceptionObject e) { - DD("FindCarinaSlicePosition"); + //DD("FindCarinaSlicePosition"); // Get Carina - MaskImagePointer Carina = GetAFDB()->template GetImage("Carina"); + MaskImagePointer Carina = this->GetAFDB()->template GetImage("Carina"); // Get Centroid and Z value std::vector centroids; clitk::ComputeCentroids(Carina, GetBackgroundValue(), centroids); // We dont need Carina structure from now - GetAFDB()->template ReleaseImage("Carina"); + this->GetAFDB()->template ReleaseImage("Carina"); // Put inside the AFDB - GetAFDB()->SetPoint3D("CarinaPoint", centroids[1]); - GetAFDB()->SetDouble("CarinaZ", centroids[1][2]); - WriteAFDB(); + this->GetAFDB()->SetPoint3D("CarinaPoint", centroids[1]); + this->GetAFDB()->SetDouble("CarinaZ", centroids[1][2]); + this->WriteAFDB(); z = centroids[1][2]; } return z; @@ -487,24 +483,43 @@ FindApexOfTheChest() { double z; try { - z = GetAFDB()->GetDouble("ApexOfTheChestZ"); + z = this->GetAFDB()->GetDouble("ApexOfTheChestZ"); } catch(clitk::ExceptionObject e) { - DD("FindApexOfTheChestPosition"); - MaskImagePointer Lungs = GetAFDB()->template GetImage("Lungs"); + + /* + //DD("FindApexOfTheChestPosition"); + MaskImagePointer Lungs = this->GetAFDB()->template GetImage("Lungs"); MaskImagePointType p; p[0] = p[1] = p[2] = 0.0; // to avoid warning clitk::FindExtremaPointInAGivenDirection(Lungs, GetBackgroundValue(), 2, false, p); // We dont need Lungs structure from now - GetAFDB()->template ReleaseImage("Lungs"); + this->GetAFDB()->template ReleaseImage("Lungs"); // Put inside the AFDB - GetAFDB()->SetPoint3D("ApexOfTheChest", p); + this->GetAFDB()->SetPoint3D("ApexOfTheChest", p); p[2] -= 5; // We consider 5 mm lower - GetAFDB()->SetDouble("ApexOfTheChestZ", p[2]); - WriteAFDB(); + this->GetAFDB()->SetDouble("ApexOfTheChestZ", p[2]); + this->WriteAFDB(); z = p[2]; + */ + + // the superior border becomes the more inferior of the two apices + MaskImagePointer RightLung = this->GetAFDB()->template GetImage("RightLung"); + MaskImagePointer LeftLung = this->GetAFDB()->template GetImage("LeftLung"); + MaskImagePointType pr; + MaskImagePointType pl; + clitk::FindExtremaPointInAGivenDirection(RightLung, GetBackgroundValue(), 2, false, pr); + clitk::FindExtremaPointInAGivenDirection(LeftLung, GetBackgroundValue(), 2, false, pl); + // We dont need Lungs structure from now + this->GetAFDB()->template ReleaseImage("RightLung"); + this->GetAFDB()->template ReleaseImage("LeftLung"); + // Put inside the AFDB + if (pr[2] < pl[2]) z = pr[2]; + else z = pl[2]; + this->GetAFDB()->SetDouble("ApexOfTheChestZ", z); + this->WriteAFDB(); } return z; } @@ -518,8 +533,8 @@ clitk::ExtractLymphStationsFilter:: FindLeftAndRightBronchi() { try { - m_RightBronchus = GetAFDB()->template GetImage ("RightBronchus"); - m_LeftBronchus = GetAFDB()->template GetImage ("LeftBronchus"); + m_RightBronchus = this->GetAFDB()->template GetImage ("RightBronchus"); + m_LeftBronchus = this->GetAFDB()->template GetImage ("LeftBronchus"); } catch(clitk::ExceptionObject & o) { @@ -528,7 +543,7 @@ FindLeftAndRightBronchi() // a Left and Right bronchus. // Get the trachea - MaskImagePointer Trachea = GetAFDB()->template GetImage("Trachea"); + MaskImagePointer Trachea = this->GetAFDB()->template GetImage("Trachea"); // Get the Carina position double m_CarinaZ = FindCarina(); @@ -595,9 +610,9 @@ FindLeftAndRightBronchi() LeftBronchus = clitk::AutoCrop(LeftBronchus, GetBackgroundValue()); // Insert int AFDB if need after - GetAFDB()->template SetImage ("RightBronchus", "seg/rightBronchus.mhd", + this->GetAFDB()->template SetImage ("RightBronchus", "seg/rightBronchus.mhd", RightBronchus, true); - GetAFDB()->template SetImage ("LeftBronchus", "seg/leftBronchus.mhd", + this->GetAFDB()->template SetImage ("LeftBronchus", "seg/leftBronchus.mhd", LeftBronchus, true); } } @@ -612,23 +627,23 @@ FindSuperiorBorderOfAorticArch() { double z; try { - z = GetAFDB()->GetDouble("SuperiorBorderOfAorticArchZ"); + z = this->GetAFDB()->GetDouble("SuperiorBorderOfAorticArchZ"); } catch(clitk::ExceptionObject e) { - DD("FindSuperiorBorderOfAorticArch"); - MaskImagePointer Aorta = GetAFDB()->template GetImage("Aorta"); + // DD("FindSuperiorBorderOfAorticArch"); + MaskImagePointer Aorta = this->GetAFDB()->template GetImage("Aorta"); MaskImagePointType p; p[0] = p[1] = p[2] = 0.0; // to avoid warning clitk::FindExtremaPointInAGivenDirection(Aorta, GetBackgroundValue(), 2, false, p); p[2] += Aorta->GetSpacing()[2]; // the slice above // We dont need Lungs structure from now - GetAFDB()->template ReleaseImage("Aorta"); + this->GetAFDB()->template ReleaseImage("Aorta"); // Put inside the AFDB - GetAFDB()->SetPoint3D("SuperiorBorderOfAorticArch", p); - GetAFDB()->SetDouble("SuperiorBorderOfAorticArchZ", p[2]); - WriteAFDB(); + this->GetAFDB()->SetPoint3D("SuperiorBorderOfAorticArch", p); + this->GetAFDB()->SetDouble("SuperiorBorderOfAorticArchZ", p[2]); + this->WriteAFDB(); z = p[2]; } return z; @@ -644,11 +659,11 @@ FindInferiorBorderOfAorticArch() { double z; try { - z = GetAFDB()->GetDouble("InferiorBorderOfAorticArchZ"); + z = this->GetAFDB()->GetDouble("InferiorBorderOfAorticArchZ"); } catch(clitk::ExceptionObject e) { - DD("FindInferiorBorderOfAorticArch"); - MaskImagePointer Aorta = GetAFDB()->template GetImage("Aorta"); + //DD("FindInferiorBorderOfAorticArch"); + MaskImagePointer Aorta = this->GetAFDB()->template GetImage("Aorta"); std::vector slices; clitk::ExtractSlices(Aorta, 2, slices); bool found=false; @@ -671,12 +686,12 @@ FindInferiorBorderOfAorticArch() Aorta->TransformIndexToPhysicalPoint(index, lower); // We dont need Lungs structure from now - GetAFDB()->template ReleaseImage("Aorta"); + this->GetAFDB()->template ReleaseImage("Aorta"); // Put inside the AFDB - GetAFDB()->SetPoint3D("InferiorBorderOfAorticArch", lower); - GetAFDB()->SetDouble("InferiorBorderOfAorticArchZ", lower[2]); - WriteAFDB(); + this->GetAFDB()->SetPoint3D("InferiorBorderOfAorticArch", lower); + this->GetAFDB()->SetDouble("InferiorBorderOfAorticArchZ", lower[2]); + this->WriteAFDB(); z = lower[2]; } return z; @@ -688,7 +703,7 @@ FindInferiorBorderOfAorticArch() template typename clitk::ExtractLymphStationsFilter::MaskImagePointer clitk::ExtractLymphStationsFilter:: -FindAntPostVessels() +FindAntPostVesselsOLD() { // ----------------------------------------------------- /* Rod says: "The anterior border, as with the Atlas – UM, is @@ -704,11 +719,9 @@ FindAntPostVessels() bool found = true; MaskImagePointer binarizedContour; try { - DD("FindAntPostVessels try to get"); - binarizedContour = GetAFDB()->template GetImage ("AntPostVesselsSeparation"); + binarizedContour = this->GetAFDB()->template GetImage ("AntPostVesselsSeparation"); } catch(clitk::ExceptionObject e) { - DD("not found"); found = false; } if (found) { @@ -733,22 +746,22 @@ FindAntPostVessels() */ // Read structures - MaskImagePointer BrachioCephalicArtery = GetAFDB()->template GetImage("BrachioCephalicArtery"); - MaskImagePointer BrachioCephalicVein = GetAFDB()->template GetImage("BrachioCephalicVein"); - MaskImagePointer CommonCarotidArtery = GetAFDB()->template GetImage("CommonCarotidArtery"); - MaskImagePointer SubclavianArtery = GetAFDB()->template GetImage("SubclavianArtery"); - MaskImagePointer Thyroid = GetAFDB()->template GetImage("Thyroid"); - MaskImagePointer Aorta = GetAFDB()->template GetImage("Aorta"); - MaskImagePointer Trachea = GetAFDB()->template GetImage("Trachea"); + MaskImagePointer BrachioCephalicArtery = this->GetAFDB()->template GetImage("BrachioCephalicArtery"); + MaskImagePointer BrachioCephalicVein = this->GetAFDB()->template GetImage("BrachioCephalicVein"); + MaskImagePointer CommonCarotidArtery = this->GetAFDB()->template GetImage("CommonCarotidArtery"); + MaskImagePointer SubclavianArtery = this->GetAFDB()->template GetImage("SubclavianArtery"); + MaskImagePointer Thyroid = this->GetAFDB()->template GetImage("Thyroid"); + MaskImagePointer Aorta = this->GetAFDB()->template GetImage("Aorta"); + MaskImagePointer Trachea = this->GetAFDB()->template GetImage("Trachea"); // Create a temporay support // From first slice of BrachioCephalicVein to end of 3A - MaskImagePointer support = GetAFDB()->template GetImage("Support_Sup_Carina"); + MaskImagePointer support = this->GetAFDB()->template GetImage("Support_Sup_Carina"); MaskImagePointType p; p[0] = p[1] = p[2] = 0.0; // to avoid warning clitk::FindExtremaPointInAGivenDirection(BrachioCephalicVein, GetBackgroundValue(), 2, true, p); double inf = p [2]; - clitk::FindExtremaPointInAGivenDirection(GetAFDB()->template GetImage("Support_S3A"), + clitk::FindExtremaPointInAGivenDirection(this->GetAFDB()->template GetImage("Support_S3A"), GetBackgroundValue(), 2, false, p); double sup = p [2]; support = clitk::CropImageAlongOneAxis(support, 2, inf, sup, @@ -1009,9 +1022,9 @@ FindAntPostVessels() binarizedContour = clitk::CropImageAlongOneAxis(binarizedContour, 2, inf, sup, false, GetBackgroundValue()); // Update the AFDB - writeImage(binarizedContour, "seg/AntPostVesselsSeparation.mhd"); - GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mhd"); - WriteAFDB(); + writeImage(binarizedContour, "seg/AntPostVesselsSeparation.mha"); + this->GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mha"); + this->WriteAFDB(); return binarizedContour; /* @@ -1046,21 +1059,6 @@ FindAntPostVessels() //-------------------------------------------------------------------- - - - - - - - - - - - - - - - //-------------------------------------------------------------------- template typename clitk::ExtractLymphStationsFilter::MaskImagePointer @@ -1081,11 +1079,9 @@ FindAntPostVessels2() bool found = true; MaskImagePointer binarizedContour; try { - DD("FindAntPostVessels try to get"); - binarizedContour = GetAFDB()->template GetImage ("AntPostVesselsSeparation"); + binarizedContour = this->GetAFDB()->template GetImage ("AntPostVesselsSeparation"); } catch(clitk::ExceptionObject e) { - DD("not found"); found = false; } if (found) { @@ -1112,28 +1108,33 @@ FindAntPostVessels2() // Read structures std::map MapOfStructures; typedef std::map::iterator MapIter; - MapOfStructures["BrachioCephalicArtery"] = GetAFDB()->template GetImage("BrachioCephalicArtery"); - MapOfStructures["BrachioCephalicVein"] = GetAFDB()->template GetImage("BrachioCephalicVein"); - MapOfStructures["CommonCarotidArteryLeft"] = GetAFDB()->template GetImage("CommonCarotidArteryLeft"); - MapOfStructures["CommonCarotidArteryRight"] = GetAFDB()->template GetImage("CommonCarotidArteryRight"); - MapOfStructures["SubclavianArteryLeft"] = GetAFDB()->template GetImage("SubclavianArteryLeft"); - MapOfStructures["SubclavianArteryRight"] = GetAFDB()->template GetImage("SubclavianArteryRight"); - MapOfStructures["Thyroid"] = GetAFDB()->template GetImage("Thyroid"); - MapOfStructures["Aorta"] = GetAFDB()->template GetImage("Aorta"); - MapOfStructures["Trachea"] = GetAFDB()->template GetImage("Trachea"); + MapOfStructures["BrachioCephalicArtery"] = this->GetAFDB()->template GetImage("BrachioCephalicArtery"); + MapOfStructures["BrachioCephalicVein"] = this->GetAFDB()->template GetImage("BrachioCephalicVein"); + MapOfStructures["CommonCarotidArteryLeft"] = this->GetAFDB()->template GetImage("LeftCommonCarotidArtery"); + MapOfStructures["CommonCarotidArteryRight"] = this->GetAFDB()->template GetImage("RightCommonCarotidArtery"); + MapOfStructures["SubclavianArteryLeft"] = this->GetAFDB()->template GetImage("LeftSubclavianArtery"); + MapOfStructures["SubclavianArteryRight"] = this->GetAFDB()->template GetImage("RightSubclavianArtery"); + MapOfStructures["Thyroid"] = this->GetAFDB()->template GetImage("Thyroid"); + MapOfStructures["Aorta"] = this->GetAFDB()->template GetImage("Aorta"); + MapOfStructures["Trachea"] = this->GetAFDB()->template GetImage("Trachea"); std::vector ListOfStructuresNames; // Create a temporay support - // From first slice of BrachioCephalicVein to end of 3A - MaskImagePointer support = GetAFDB()->template GetImage("Support_Sup_Carina"); + // From first slice of BrachioCephalicVein to end of 3A or end of 2RL + MaskImagePointer support = this->GetAFDB()->template GetImage("Support_Sup_Carina"); MaskImagePointType p; p[0] = p[1] = p[2] = 0.0; // to avoid warning clitk::FindExtremaPointInAGivenDirection(MapOfStructures["BrachioCephalicVein"], GetBackgroundValue(), 2, true, p); double inf = p[2]; - clitk::FindExtremaPointInAGivenDirection(GetAFDB()->template GetImage("Support_S3A"), + clitk::FindExtremaPointInAGivenDirection(this->GetAFDB()->template GetImage("Support_S3A"), GetBackgroundValue(), 2, false, p); + MaskImagePointType p2; + clitk::FindExtremaPointInAGivenDirection(this->GetAFDB()->template GetImage("Support_S2L"), + GetBackgroundValue(), 2, false, p2); + if (p2[2] > p[2]) p = p2; + double sup = p[2]+support->GetSpacing()[2];//one slice more ? support = clitk::CropImageAlongOneAxis(support, 2, inf, sup, false, GetBackgroundValue()); @@ -1380,9 +1381,9 @@ FindAntPostVessels2() false, GetBackgroundValue()); // Update the AFDB - writeImage(binarizedContour, "seg/AntPostVesselsSeparation.mhd"); - GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mhd"); - WriteAFDB(); + writeImage(binarizedContour, "seg/AntPostVesselsSeparation.mha"); + this->GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mha"); + this->WriteAFDB(); return binarizedContour; /* @@ -1416,6 +1417,65 @@ FindAntPostVessels2() } //-------------------------------------------------------------------- +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +WriteImageSupport(std::string support) +{ + writeImage(m_ListOfSupports[support], this->GetAFDBPath()+"/"+"seg/Support_"+support+".mha"); + this->GetAFDB()->SetImageFilename("Support_"+support, "seg/Support_"+support+".mha"); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +WriteImageStation(std::string station) +{ + writeImage(m_ListOfStations[station], GetAFDB()->GetPath()+"/seg/Station"+station+".mha"); + GetAFDB()->SetImageFilename("Station"+station, "seg/Station"+station+".mha"); + WriteAFDB(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +ComputeOverlapWithRef(std::string station) +{ + if (GetComputeStation(station)) { + MaskImagePointer ref = this->GetAFDB()->template GetImage ("Station"+station+"_Ref"); + typedef clitk::LabelImageOverlapMeasureFilter FilterType; + typename FilterType::Pointer filter = FilterType::New(); + filter->SetInput(0, m_ListOfStations[station]); + filter->SetInput(1, ref); + filter->Update(); + } +} +//-------------------------------------------------------------------- +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +ReadSupportLimits(std::string filename) +{ + m_ListOfSupportLimits.clear(); + ifstream is; + openFileForReading(is, filename); + while (is) { + skipComment(is); + SupportLimitsType s; + s.Read(is); + if (is) m_ListOfSupportLimits.push_back(s); + } +} +//-------------------------------------------------------------------- #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX +