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