From 972a814a6005ff47ccc691360a71a96c777481b0 Mon Sep 17 00:00:00 2001 From: remicres <remi.cresson@teledetection.fr> Date: Wed, 10 Aug 2016 08:38:21 +0000 Subject: [PATCH] ENH: sort objects labels from left to right, then top to bottom --- include/lsrmGraphToOtbImage.txx | 38 +++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/include/lsrmGraphToOtbImage.txx b/include/lsrmGraphToOtbImage.txx index 79348be..68bf468 100644 --- a/include/lsrmGraphToOtbImage.txx +++ b/include/lsrmGraphToOtbImage.txx @@ -12,17 +12,17 @@ namespace lsrm const unsigned int width, const unsigned int height) { - LabelImageType::IndexType index; - LabelImageType::SizeType size; - LabelImageType::RegionType region; + LabelImageType::IndexType labelImageRegionStart; + LabelImageType::SizeType labelImageRegionSize; + LabelImageType::RegionType labelImageRegion; - index[0] = 0; index[1] = 0; - size[0] = width; size[1] = height; - region.SetIndex(index); - region.SetSize(size); + labelImageRegionStart[0] = 0; labelImageRegionStart[1] = 0; + labelImageRegionSize[0] = width; labelImageRegionSize[1] = height; + labelImageRegion.SetIndex(labelImageRegionStart); + labelImageRegion.SetSize(labelImageRegionSize); LabelImageType::Pointer label_img = LabelImageType::New(); - label_img->SetRegions(region); + label_img->SetRegions(labelImageRegion); label_img->Allocate(); using LabelImageIterator = itk::ImageRegionIterator<LabelImageType>; @@ -39,13 +39,29 @@ namespace lsrm for (auto& pix: borderPixels) { - index[0] = pix % width; - index[1] = pix / width; - label_img->SetPixel(index, label); + labelImageRegionStart[0] = pix % width; + labelImageRegionStart[1] = pix / width; + label_img->SetPixel(labelImageRegionStart, label); } ++label; } + // Sort labels in their appearance order from left->right to top->bottom + const LabelImageType::InternalPixelType noDataLabel = 0; + vnl_vector<LabelImageType::InternalPixelType> lut(label,noDataLabel); + label=1; + for(it.GoToBegin();!it.IsAtEnd(); ++it) + { + unsigned int inputLabel = it.Get(); + if (lut[ inputLabel ] == noDataLabel) + { + lut[ inputLabel ] = label; + label++; + } + } + for(it.GoToBegin();!it.IsAtEnd(); ++it) + it.Set(lut[it.Get()]); + // Fill holes typedef itk::GrayscaleFillholeImageFilter<LabelImageType,LabelImageType> FillholeFilterType; FillholeFilterType::Pointer fillFilter = FillholeFilterType::New(); -- GitLab