lsrmGraphToOtbImage.txx 3.38 KiB
#ifndef __LSRM_GRAPH_TO_OTBIMAGE_TXX
#define __LSRM_GRAPH_TO_OTBIMAGE_TXX
#include "lsrmGraphToOtbImage.h"
#include "itkImageRegionIterator.h"
#include "itkGrayscaleFillholeImageFilter.h"
namespace lsrm
	template<class TGraph>
	typename GraphToOtbImage<TGraph>::LabelImageType::Pointer
	GraphToOtbImage<TGraph>::GetLabelImage(const GraphType& graph,
										   const unsigned int width,
										   const unsigned int height)
		LabelImageType::IndexType index;
		LabelImageType::SizeType size;
		LabelImageType::RegionType region;
		index[0] = 0; index[1] = 0;
		size[0] = width; size[1] = height;
		region.SetIndex(index);
		region.SetSize(size);
		LabelImageType::Pointer label_img = LabelImageType::New();
		label_img->SetRegions(region);
		label_img->Allocate();
		using LabelImageIterator = itk::ImageRegionIterator<LabelImageType>;
		LabelImageIterator it(label_img, label_img->GetLargestPossibleRegion());
		for(it.GoToBegin();!it.IsAtEnd(); ++it)
			it.Set(0);
		// Start at 1 (value 0 can be used for invalid pixels)
		long unsigned int label = 1;
		for(auto& region : graph.m_Nodes)
			lp::CellLists borderPixels;
			ContourOperator::GenerateBorderCells(borderPixels, region->m_Contour, region->m_Id, width);
			for (auto& pix: borderPixels)
				index[0] = pix % width;
				index[1] = pix / width;
				label_img->SetPixel(index, label);
			++label;
        // Fill holes
		typedef itk::GrayscaleFillholeImageFilter<LabelImageType,LabelImageType>  FillholeFilterType;
		FillholeFilterType::Pointer fillFilter = FillholeFilterType::New();
		fillFilter->SetInput(label_img);
		fillFilter->Update();
		return fillFilter->GetOutput();
	/*template<class TGraph>
	typename GraphToOtbImage<TGraph>::ClusteredImageType::Pointer
	GraphToOtbImage<TGraph>::GetClusteredOutput(const GraphType& graph,
												const unsigned int width,
												const unsigned int height)
		ClusteredImageType::IndexType index;
		ClusteredImageType::SizeType size;
		ClusteredImageType::RegionType region;
		index[0] = 0; index[1] = 0;
		size[0] = width; size[1] = height;
		region.SetIndex(index);
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
region.SetSize(size); ClusteredImageType::Pointer clusterImg = ClusteredImageType::New(); clusterImg->SetRegions(region); clusterImg->SetNumberOfComponentsPerPixel(3); clusterImg->Allocate(); ClusteredImageType::PixelType pixelValue; pixelValue.Reserve(3); pixelValue[0] = 0; pixelValue[1] = 0; pixelValue[2] = 0; using ClusterImageIterator = itk::ImageRegionIterator<ClusteredImageType>; ClusterImageIterator it(clusterImg, clusterImg->GetLargestPossibleRegion()); for(it.GoToBegin();!it.IsAtEnd(); ++it) it.Set(pixelValue); srand(time(NULL)); unsigned char c1, c2, c3; for(auto& region : graph.m_Nodes) { c1 = rand() % 256; c2 = rand() % 256; c3 = rand() % 256; lp::CellLists borderPixels; ContourOperator::GenerateBorderCells(borderPixels, region->m_Contour, region->m_Id, width); for (auto& pix : borderPixels) { index[0] = pix % width; index[1] = pix / width; pixelValue[0] = c1; pixelValue[1] = c2; pixelValue[2] = c3; clusterImg->SetPixel(index, pixelValue); } } for(it.GoToBegin(); !it.IsAtEnd(); ++it) { auto pixel = it.Get(); if(pixel[0] == 0 && pixel[1] == 0 && pixel[2] == 0) it.Set(pixelValue); else pixelValue = pixel; } return clusterImg; }*/ } // end of namespace lsrm #endif