diff --git a/include/lsrmGraphToOtbImage.txx b/include/lsrmGraphToOtbImage.txx index 79348bef3a7c12fe2c12a019fcce0c4c234e8611..68bf468648a7f14b0801cf2aae81d9d3d6509c00 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();