X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=segmentation%2FclitkExtractLymphStation_7.txx;fp=segmentation%2FclitkExtractLymphStation_7.txx;h=278efc8e076e3eb9f6e4410a92fb281863286e37;hb=d30d301ddbebb5f290f8d9c0104dc6448ea531e1;hp=e1cbe1f7750f47ae1319c5f8d8ef5c28c1580386;hpb=fbeb37a42e28477c9e92e866e3610f99e57f2449;p=clitk.git diff --git a/segmentation/clitkExtractLymphStation_7.txx b/segmentation/clitkExtractLymphStation_7.txx index e1cbe1f..278efc8 100644 --- a/segmentation/clitkExtractLymphStation_7.txx +++ b/segmentation/clitkExtractLymphStation_7.txx @@ -1,46 +1,41 @@ + //-------------------------------------------------------------------- template void clitk::ExtractLymphStationsFilter:: ExtractStation_7_SI_Limits() { - // Local variables - double m_CarinaZPositionInMM; - double m_MiddleLobeBronchusZPositionInMM; - // Get Inputs - m_Trachea = GetAFDB()->template GetImage ("trachea"); - m_CarinaZPositionInMM = GetAFDB()->GetPoint3D("carina", 2); - DD(m_CarinaZPositionInMM); - m_MiddleLobeBronchusZPositionInMM = GetAFDB()->GetPoint3D("rightMiddleLobeBronchus", 2); - DD(m_MiddleLobeBronchusZPositionInMM); + MaskImagePointer Trachea = GetAFDB()->template GetImage ("Trachea"); + double m_CarinaZ = GetAFDB()->GetPoint3D("Carina", 2); + DD(m_CarinaZ); + double m_OriginOfRightMiddleLobeBronchusZ = GetAFDB()->GetPoint3D("OriginOfRightMiddleLobeBronchus", 2); + DD(m_OriginOfRightMiddleLobeBronchusZ); /* Crop support : - Superior limit = carina - Inferior limit = origin right middle lobe bronchus */ - StartNewStep("Inf/Sup mediastinum limits with carina/bronchus"); + Superior limit = carina + Inferior limit = origin right middle lobe bronchus */ + StartNewStep("[Station7] Inf/Sup mediastinum limits with carina/bronchus"); m_Working_Support = - clitk::CropImageAlongOneAxis(m_Support, 2, - m_MiddleLobeBronchusZPositionInMM, - m_CarinaZPositionInMM, true, + clitk::CropImageAlongOneAxis(m_Working_Support, 2, + m_OriginOfRightMiddleLobeBronchusZ, + m_CarinaZ, true, GetBackgroundValue()); - StopCurrentStep(m_Working_Support); - /* Crop trachea - Superior limit = carina - Inferior limit = origin right middle lobe bronchus*/ - StartNewStep("Inf/Sup trachea limits with carina/bronchus"); + Superior limit = carina + Inferior limit = origin right middle lobe bronchus*/ m_working_trachea = - clitk::CropImageAlongOneAxis(m_Trachea, 2, - m_MiddleLobeBronchusZPositionInMM, - m_CarinaZPositionInMM, true, + clitk::CropImageAlongOneAxis(Trachea, 2, + m_OriginOfRightMiddleLobeBronchusZ, + m_CarinaZ, true, GetBackgroundValue()); - StopCurrentStep(m_working_trachea); - m_Station7 = m_Working_Support; + StopCurrentStep(m_Working_Support); + m_ListOfStations["7"] = m_Working_Support; } //-------------------------------------------------------------------- + //-------------------------------------------------------------------- template void @@ -49,13 +44,14 @@ ExtractStation_7_RL_Limits() { // ---------------------------------------------------------------- // Separate trachea in two CCL - StartNewStep("Separate trachea under carina"); + StartNewStep("[Station7] Separate trachea under carina"); // Labelize and consider two main labels m_working_trachea = Labelize(m_working_trachea, 0, true, 1); - // Carina position must at the first slice that separate the two main bronchus (not superiorly) - // Check that upper slice is composed of at least two labels + // Carina position must at the first slice that separate the two + // main bronchus (not superiorly) Check that upper slice is composed + // of at least two labels typedef itk::ImageSliceIteratorWithIndex SliceIteratorType; SliceIteratorType iter(m_working_trachea, m_working_trachea->GetLargestPossibleRegion()); iter.SetFirstDirection(0); @@ -64,7 +60,6 @@ ExtractStation_7_RL_Limits() int maxLabel=0; while (!iter.IsAtReverseEndOfSlice()) { while (!iter.IsAtReverseEndOfLine()) { - // DD(iter.GetIndex()); if (iter.Get() > maxLabel) maxLabel = iter.Get(); --iter; } @@ -74,70 +69,65 @@ ExtractStation_7_RL_Limits() clitkExceptionMacro("First slice form Carina does not seems to seperate the two main bronchus. Abort"); } - // Compute centroid of both parts to identify the left from the right bronchus - typedef long LabelType; - static const unsigned int Dim = ImageType::ImageDimension; - typedef itk::ShapeLabelObject< LabelType, Dim > LabelObjectType; - typedef itk::LabelMap< LabelObjectType > LabelMapType; - typedef itk::LabelImageToLabelMapFilter ImageToMapFilterType; - typename ImageToMapFilterType::Pointer imageToLabelFilter = ImageToMapFilterType::New(); - typedef itk::ShapeLabelMapFilter ShapeFilterType; - typename ShapeFilterType::Pointer statFilter = ShapeFilterType::New(); - imageToLabelFilter->SetBackgroundValue(GetBackgroundValue()); - imageToLabelFilter->SetInput(m_working_trachea); - statFilter->SetInput(imageToLabelFilter->GetOutput()); - statFilter->Update(); - typename LabelMapType::Pointer labelMap = statFilter->GetOutput(); - - ImagePointType C1 = labelMap->GetLabelObject(1)->GetCentroid(); - ImagePointType C2 = labelMap->GetLabelObject(2)->GetCentroid(); + // Compute 3D centroids of both parts to identify the left from the + // right bronchus + std::vector c; + clitk::ComputeCentroids(m_working_trachea, GetBackgroundValue(), c); + ImagePointType C1 = c[1]; + ImagePointType C2 = c[2]; ImagePixelType leftLabel; ImagePixelType rightLabel; if (C1[0] < C2[0]) { leftLabel = 1; rightLabel = 2; } else { leftLabel = 2; rightLabel = 1; } - DD(leftLabel); - DD(rightLabel); StopCurrentStep(m_working_trachea); //----------------------------------------------------- - StartNewStep("Left limits with bronchus (slice by slice)"); // Select LeftLabel (set one label to Backgroundvalue) m_LeftBronchus = SetBackground(m_working_trachea, m_working_trachea, - rightLabel, GetBackgroundValue()); + rightLabel, GetBackgroundValue(), false); m_RightBronchus = SetBackground(m_working_trachea, m_working_trachea, - leftLabel, GetBackgroundValue()); - writeImage(m_LeftBronchus, "left.mhd"); - writeImage(m_RightBronchus, "right.mhd"); + leftLabel, GetBackgroundValue(), false); + StartNewStep("[Station7] Limits with bronchus (slice by slice) : RightTo left bronchus"); m_Working_Support = clitk::SliceBySliceRelativePosition(m_Working_Support, m_LeftBronchus, 2, GetFuzzyThreshold(), "RightTo", true, 4); + + StartNewStep("[Station7] Limits with bronchus (slice by slice) : LeftTo right bronchus"); m_Working_Support = clitk::SliceBySliceRelativePosition(m_Working_Support, m_RightBronchus, 2, GetFuzzyThreshold(), "LeftTo", true, 4); + + StartNewStep("[Station7] Limits with bronchus (slice by slice) : not AntTo left bronchus"); m_Working_Support = clitk::SliceBySliceRelativePosition(m_Working_Support, m_LeftBronchus, 2, GetFuzzyThreshold(), "AntTo", true, 4, true); // NOT + + StartNewStep("[Station7] Limits with bronchus (slice by slice) : not AntTo right bronchus"); m_Working_Support = clitk::SliceBySliceRelativePosition(m_Working_Support, m_RightBronchus, 2, GetFuzzyThreshold(), "AntTo", true, 4, true); + + StartNewStep("[Station7] Limits with bronchus (slice by slice) : not PostTo left bronchus"); m_Working_Support = clitk::SliceBySliceRelativePosition(m_Working_Support, m_LeftBronchus, 2, GetFuzzyThreshold(), "PostTo", true, 4, true); + + StartNewStep("[Station7] Limits with bronchus (slice by slice) : not PostTo right bronchus"); m_Working_Support = clitk::SliceBySliceRelativePosition(m_Working_Support, m_RightBronchus, @@ -155,92 +145,46 @@ void clitk::ExtractLymphStationsFilter:: ExtractStation_7_Posterior_Limits() { - StartNewStep("Posterior limits"); - - // Left Bronchus slices - typedef clitk::ExtractSliceFilter ExtractSliceFilterType; - typedef typename ExtractSliceFilterType::SliceType SliceType; - typename ExtractSliceFilterType::Pointer - extractSliceFilter = ExtractSliceFilterType::New(); - extractSliceFilter->SetInput(m_LeftBronchus); - extractSliceFilter->SetDirection(2); - extractSliceFilter->Update(); - std::vector leftBronchusSlices; - extractSliceFilter->GetOutputSlices(leftBronchusSlices); - - // Right Bronchus slices - extractSliceFilter = ExtractSliceFilterType::New(); - extractSliceFilter->SetInput(m_RightBronchus); - extractSliceFilter->SetDirection(2); - extractSliceFilter->Update(); - std::vector rightBronchusSlices ; - extractSliceFilter->GetOutputSlices(rightBronchusSlices); - - assert(leftBronchusSlices.size() == rightBronchusSlices.size()); - - std::vector leftPoints; - std::vector rightPoints; - for(uint i=0; i(leftBronchusSlices[i], 0, true, 10); - leftBronchusSlices[i] = KeepLabels(leftBronchusSlices[i], - GetBackgroundValue(), - GetForegroundValue(), 1, 1, true); - rightBronchusSlices[i] = Labelize(rightBronchusSlices[i], 0, true, 10); - rightBronchusSlices[i] = KeepLabels(rightBronchusSlices[i], - GetBackgroundValue(), - GetForegroundValue(), 1, 1, true); - double distance_max_from_center_point = 15; - - // ------- Find point in left Bronchus ------- - // find right most point in left = rightMost - SliceType::PointType a; - SliceType::PointType rightMost = - clitk::FindExtremaPointInAGivenDirection(leftBronchusSlices[i], - GetBackgroundValue(), - 0, false, a, 0); - // find post most point in left, not far away from rightMost - SliceType::PointType p = - clitk::FindExtremaPointInAGivenDirection(leftBronchusSlices[i], - GetBackgroundValue(), - 1, false, rightMost, - distance_max_from_center_point); - MaskImageType::PointType pp; - pp[0] = p[0]; pp[1] = p[1]; - pp[2] = i*m_LeftBronchus->GetSpacing()[2] + m_LeftBronchus->GetOrigin()[2]; - leftPoints.push_back(pp); - - // ------- Find point in right Bronchus ------- - // find left most point in right = leftMost - SliceType::PointType leftMost = - clitk::FindExtremaPointInAGivenDirection(rightBronchusSlices[i], - GetBackgroundValue(), - 0, true, a, 0); - // find post most point in left, not far away from leftMost - p = clitk::FindExtremaPointInAGivenDirection(rightBronchusSlices[i], - GetBackgroundValue(), - 1, false, leftMost, - distance_max_from_center_point); - pp[0] = p[0]; pp[1] = p[1]; - pp[2] = i*m_RightBronchus->GetSpacing()[2] + m_RightBronchus->GetOrigin()[2]; - rightPoints.push_back(pp); - } + StartNewStep("[Station7] Posterior limits -> must be AntTo post wall of the bronchi"); + // Search for points that are the most left/post/ant and most + // right/post/ant of the left and right bronchus + + // extract, loop slices, label/keep, find extrema x 3 + FindExtremaPointsInBronchus(m_LeftBronchus, 0, 15, + m_RightMostInLeftBronchus, + m_AntMostInLeftBronchus, + m_PostMostInLeftBronchus); + FindExtremaPointsInBronchus(m_RightBronchus, 1, 15, + m_LeftMostInRightBronchus, + m_AntMostInRightBronchus, + m_PostMostInRightBronchus); // DEBUG - std::ofstream osl; - openFileForWriting(osl, "left.txt"); - osl << "LANDMARKS1" << std::endl; - std::ofstream osr; - openFileForWriting(osr, "right.txt"); - osr << "LANDMARKS1" << std::endl; - for(uint i=0; i