X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=segmentation%2FclitkExtractLymphStationsFilter.txx;h=aec05d782df8553d4a0bdd861f7e5d40fdf8eedb;hb=119a42cb1444930c78314e862e590f54c2f7678d;hp=ea514a6d643924af6834d3c3a921b82b98411d05;hpb=d30d301ddbebb5f290f8d9c0104dc6448ea531e1;p=clitk.git diff --git a/segmentation/clitkExtractLymphStationsFilter.txx b/segmentation/clitkExtractLymphStationsFilter.txx index ea514a6..aec05d7 100644 --- a/segmentation/clitkExtractLymphStationsFilter.txx +++ b/segmentation/clitkExtractLymphStationsFilter.txx @@ -52,18 +52,11 @@ ExtractLymphStationsFilter(): SetBackgroundValue(0); SetForegroundValue(1); - // Station 8 - SetDistanceMaxToAnteriorPartOfTheSpine(10); - MaskImagePointType p; - p[0] = 15; p[1] = 2; p[2] = 1; - SetEsophagusDiltationForAnt(p); - p[0] = 5; p[1] = 10; p[2] = 1; - SetEsophagusDiltationForRight(p); - SetFuzzyThresholdForS8(0.5); - - // Station 7 - SetFuzzyThreshold(0.5); - SetStation7Filename("station7.mhd"); + // Default values + ExtractStation_8_SetDefaultValues(); + ExtractStation_3P_SetDefaultValues(); + ExtractStation_3A_SetDefaultValues(); + ExtractStation_7_SetDefaultValues(); } //-------------------------------------------------------------------- @@ -84,22 +77,25 @@ GenerateOutputInformation() { ExtractStation_8(); StopSubStep(); - // Compute some interesting points in trachea - // ( ALTERNATIVE -> SKELETON ANALYSIS ? - // Pb : not sufficient for mostXX points ... ) + // Extract Station3P + StartNewStep("Station 3P"); + StartSubStep(); + ExtractStation_3P(); + StopSubStep(); - /* ==> todo (but why ???) - ComputeTracheaCentroidsAboveCarina(); - ComputeBronchusExtremaPointsBelowCarina(); - */ + // Extract Station3A + StartNewStep("Station 3A"); + StartSubStep(); + ExtractStation_3A(); + StopSubStep(); - if (0) { // temporary suppress - // Extract Station7 - StartNewStep("Station 7"); - StartSubStep(); - ExtractStation_7(); - StopSubStep(); + // Extract Station7 + StartNewStep("Station 7"); + StartSubStep(); + ExtractStation_7(); + StopSubStep(); + if (0) { // temporary suppress // Extract Station4RL StartNewStep("Station 4RL"); StartSubStep(); @@ -129,7 +125,7 @@ template void clitk::ExtractLymphStationsFilter:: GenerateInputRequestedRegion() { - DD("GenerateInputRequestedRegion (nothing?)"); + //DD("GenerateInputRequestedRegion (nothing?)"); } //-------------------------------------------------------------------- @@ -139,8 +135,6 @@ template void clitk::ExtractLymphStationsFilter:: GenerateData() { - DD("GenerateData, graft output"); - // Final Step -> graft output (if SetNthOutput => redo) this->GraftOutput(m_ListOfStations["8"]); } @@ -149,21 +143,55 @@ GenerateData() { //-------------------------------------------------------------------- template -void +bool clitk::ExtractLymphStationsFilter:: -ExtractStation_8() { +CheckForStation(std::string station) +{ + // Compute Station name + std::string s = "Station"+station; + - // Check if m_ListOfStations["8"] exist. If yes -> use it as initial - // support instead of m_Mediastinum - if (m_ListOfStations["8"]) { - DD("Station 8 support already exist -> use it"); - m_Working_Support = m_ListOfStations["8"]; + // Check if station already exist in DB + bool found = false; + if (GetAFDB()->TagExist(s)) { + m_ListOfStations[station] = GetAFDB()->template GetImage(s); + found = true; } - else m_Working_Support = m_Mediastinum; - ExtractStation_8_SI_Limits(); - ExtractStation_8_AP_Limits(); - // ExtractStation_8_LR_Limits(); + // 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); + return true; + } + else { + std::cout << "Station " << station << " found. I used it" << std::endl; + return false; + } +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +bool +clitk::ExtractLymphStationsFilter:: +GetComputeStation(std::string station) +{ + return (m_ComputeStationMap.find(station) != m_ComputeStationMap.end()); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +AddComputeStation(std::string station) +{ + m_ComputeStationMap[station] = true; } //-------------------------------------------------------------------- @@ -172,15 +200,86 @@ ExtractStation_8() { template void clitk::ExtractLymphStationsFilter:: -ExtractStation_7() { - if (m_ListOfStations["7"]) { - DD("Station 7 support already exist -> use it"); - m_Working_Support = m_ListOfStations["7"]; +ExtractStation_8() +{ + if (CheckForStation("8")) { + ExtractStation_8_SI_Limits(); + ExtractStation_8_Post_Limits(); + ExtractStation_8_Ant_Sup_Limits(); + ExtractStation_8_Ant_Inf_Limits(); + ExtractStation_8_LR_1_Limits(); + ExtractStation_8_LR_2_Limits(); + ExtractStation_8_LR_Limits(); + ExtractStation_8_Ant_Injected_Limits(); + ExtractStation_8_Single_CCL_Limits(); + ExtractStation_8_Remove_Structures(); + // Store image filenames into AFDB + writeImage(m_ListOfStations["8"], "seg/Station8.mhd"); + GetAFDB()->SetImageFilename("Station8", "seg/Station8.mhd"); + WriteAFDB(); + } +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +ExtractStation_3P() +{ + if (CheckForStation("3P")) { + ExtractStation_3P_SI_Limits(); + ExtractStation_3P_Ant_Limits(); + ExtractStation_3P_Post_Limits(); + ExtractStation_3P_LR_sup_Limits(); + // ExtractStation_3P_LR_sup_Limits_2(); + ExtractStation_3P_LR_inf_Limits(); + ExtractStation_8_Single_CCL_Limits(); // YES 8 ! + ExtractStation_3P_Remove_Structures(); // after CCL + // Store image filenames into AFDB + writeImage(m_ListOfStations["3P"], "seg/Station3P.mhd"); + GetAFDB()->SetImageFilename("Station3P", "seg/Station3P.mhd"); + WriteAFDB(); } - else m_Working_Support = m_Mediastinum; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +ExtractStation_7() { + if (CheckForStation("7")) { ExtractStation_7_SI_Limits(); ExtractStation_7_RL_Limits(); ExtractStation_7_Posterior_Limits(); + // ExtractStation_8_Single_CCL_Limits(); // Yes the same than 8 + ExtractStation_7_Remove_Structures(); + // Store image filenames into AFDB + writeImage(m_ListOfStations["7"], "seg/Station7.mhd"); + GetAFDB()->SetImageFilename("Station7", "seg/Station7.mhd"); + WriteAFDB(); + } +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::ExtractLymphStationsFilter:: +ExtractStation_3A() +{ + if (CheckForStation("3A")) { + ExtractStation_3A_SI_Limits(); + ExtractStation_3A_Ant_Limits(); + // Store image filenames into AFDB + writeImage(m_ListOfStations["3A"], "seg/Station3A.mhd"); + GetAFDB()->SetImageFilename("Station3A", "seg/Station3A.mhd"); + WriteAFDB(); + } } //-------------------------------------------------------------------- @@ -190,6 +289,8 @@ template void clitk::ExtractLymphStationsFilter:: ExtractStation_4RL() { + DD("TODO"); + exit(0); /* WARNING ONLY 4R FIRST !!! (not same inf limits) */ @@ -201,72 +302,22 @@ ExtractStation_4RL() { //-------------------------------------------------------------------- -template +template void -clitk::ExtractLymphStationsFilter:: -FindExtremaPointsInBronchus(MaskImagePointer input, - int direction, - double distance_max_from_center_point, - ListOfPointsType & LR, - ListOfPointsType & Ant, - ListOfPointsType & Post) +clitk::ExtractLymphStationsFilter:: +Remove_Structures(std::string s) { - - // Other solution ==> with auto bounding box ! (but pb to prevent to - // be too distant from the center point - - // Extract slices - std::vector slices; - clitk::ExtractSlices(input, 2, slices); - - // Loop on slices - bool found; - for(uint i=0; i(slices[i], 0, true, 10); - slices[i] = KeepLabels(slices[i], - GetBackgroundValue(), - GetForegroundValue(), 1, 1, true); - */ - - // ------- Find rightmost or leftmost point ------- - MaskSliceType::PointType LRMost; - found = - clitk::FindExtremaPointInAGivenDirection(slices[i], - GetBackgroundValue(), - 0, // axis XY - (direction==0?false:true), // right or left according to direction - LRMost); - // ------- Find postmost point ------- - MaskSliceType::PointType postMost; - found = - clitk::FindExtremaPointInAGivenDirection(slices[i], - GetBackgroundValue(), - 1, false, LRMost, - distance_max_from_center_point, - postMost); - // ------- Find antmost point ------- - MaskSliceType::PointType antMost; - found = - clitk::FindExtremaPointInAGivenDirection(slices[i], - GetBackgroundValue(), - 1, true, LRMost, - distance_max_from_center_point, - antMost); - // Only add point if found - if (found) { - // ------- Convert 2D to 3D points -------- - MaskImageType::PointType p; - clitk::PointsUtils::Convert2DTo3D(LRMost, input, i, p); - LR.push_back(p); - clitk::PointsUtils::Convert2DTo3D(antMost, input, i, p); - Ant.push_back(p); - clitk::PointsUtils::Convert2DTo3D(postMost, input, i, p); - Post.push_back(p); - } + try { + StartNewStep("[Station7] Remove "+s); + MaskImagePointer Structure = GetAFDB()->template GetImage(s); + clitk::AndNot(m_Working_Support, Structure, GetBackgroundValue()); } -} + catch(clitk::ExceptionObject e) { + std::cout << s << " not found, skip." << std::endl; + } +} //-------------------------------------------------------------------- + + #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX