From 3d7065ae672987ae8f188b482817607a79cd1bd0 Mon Sep 17 00:00:00 2001 From: remicres <remi.cresson@teledetection.fr> Date: Tue, 6 Sep 2016 13:16:11 +0000 Subject: [PATCH] FIX: FIXED THE FUG (issue was graph-->image process on LSGRM final graph) --- include/lsgrmGraphOperations.h | 1 + include/lsgrmGraphOperations.txx | 50 +++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/include/lsgrmGraphOperations.h b/include/lsgrmGraphOperations.h index 71485c1..ea975fb 100644 --- a/include/lsgrmGraphOperations.h +++ b/include/lsgrmGraphOperations.h @@ -5,6 +5,7 @@ #include "grmGraphOperations.h" #include "otbVectorImage.h" #include "otbMultiChannelExtractROI.h" +#include "itkGrayscaleFillholeImageFilter.h" namespace lsgrm { diff --git a/include/lsgrmGraphOperations.txx b/include/lsgrmGraphOperations.txx index 9b11508..1a64a72 100644 --- a/include/lsgrmGraphOperations.txx +++ b/include/lsgrmGraphOperations.txx @@ -94,27 +94,45 @@ MergeAllGraphsAndAchieveSegmentation( // // Write output graph to the output graph directory // WriteGraph<TSegmenter>(segmenter.m_Graph, tmpDir, 0, 0); - // Convert graph to label image - typename TSegmenter::LabelImageType::Pointer labelImage = segmenter.GetLabeledClusteredOutput(); + // Generate the label image + typename TSegmenter::LabelImageType::IndexType index; + index.Fill(0); + typename TSegmenter::LabelImageType::SizeType size; + size[0] = imageWidth; + size[1] = imageHeight; + typename TSegmenter::LabelImageType::RegionType region(index, size); + const typename TSegmenter::LabelImageType::InternalPixelType noDataLabel = 0; + typename TSegmenter::LabelImageType::Pointer labelImage = TSegmenter::LabelImageType::New(); + labelImage->SetRegions(region); + labelImage->Allocate(); + labelImage->FillBuffer(noDataLabel); - // Re-order nodes labels (left->right to top->bottom) using LabelImageIterator = itk::ImageRegionIterator<typename TSegmenter::LabelImageType>; LabelImageIterator it(labelImage, labelImage->GetLargestPossibleRegion()); - const typename TSegmenter::LabelImageType::InternalPixelType noDataLabel = 0; - typename TSegmenter::LabelImageType::InternalPixelType label; - // Get the maximum label value - for(it.GoToBegin();!it.IsAtEnd(); ++it) - if (it.Get() > label) - label = it.Get(); + // Start at 1 (value 0 can be used for invalid pixels) + unsigned int label = 1; + for(auto& node : segmenter.m_Graph.m_Nodes) + { + lp::CellLists borderPixels; + lp::ContourOperations::GenerateBorderCells(borderPixels, node->m_Contour, node->m_Id, imageWidth); + + for (auto& pix: borderPixels) + { + index[0] = pix % imageWidth; + index[1] = pix / imageWidth; + labelImage->SetPixel(index, label); + } + ++label; + } - // Compute LUT + // Re-order nodes labels (left->right to top->bottom) vnl_vector<typename TSegmenter::LabelImageType::InternalPixelType> lut(label,noDataLabel); label = 1; for(it.GoToBegin();!it.IsAtEnd(); ++it) { unsigned int inputLabel = it.Get(); - if (lut[ inputLabel ] == noDataLabel) + if (lut[ inputLabel ] == noDataLabel && inputLabel != noDataLabel) { lut[ inputLabel ] = label; label++; @@ -125,8 +143,14 @@ MergeAllGraphsAndAchieveSegmentation( for(it.GoToBegin();!it.IsAtEnd(); ++it) it.Set(lut[it.Get()]); - return labelImage; -} + // Fill holes + typedef itk::GrayscaleFillholeImageFilter<typename TSegmenter::LabelImageType, + typename TSegmenter::LabelImageType> FillholeFilterType; + typename FillholeFilterType::Pointer fillFilter = FillholeFilterType::New(); + fillFilter->SetInput(labelImage); + fillFilter->Update(); + + return fillFilter->GetOutput();} template<class TSegmenter> long long unsigned int RunPartialSegmentation(const typename TSegmenter::ParamType& params, -- GitLab