Commit a11c26e5 authored by remicres's avatar remicres
Browse files

Merge keeping the mpised version

parents db607164 1110a9c6
......@@ -2,6 +2,7 @@
#define __LSGRM_GRAPH_OPERATIONS_H
#include "lsgrmHeader.h"
#include "lsrmGraphOperations.h"
#include "otbImage.h"
#include "otbImageFileReader.h"
namespace lsgrm
......
......@@ -79,6 +79,7 @@ namespace lsgrm
}
}
<<<<<<< HEAD
if (myrank == 0)
{
std::cout << "\nAchieve segmentation process..." << std::endl;
......@@ -106,6 +107,31 @@ namespace lsgrm
clusterWriter->Update();
}
}
=======
std::cout << "\nAchieve segmentation process..." << std::endl;
// Segmentation of the graph
segmenter.SetImageWidth(imageWidth);
segmenter.SetImageHeight(imageHeight);
segmenter.SetNumberOfComponentsPerPixel(imageBands);
segmenter.SetParam(params);
segmenter.SetThreshold(threshold);
segmenter.SetDoBFSegmentation(true);
segmenter.SetNumberOfIterations(75);
lsrm::GraphOperations<TSegmenter>::PerfomAllIterationsWithLMBFAndConstThreshold(segmenter);
// Write output graph to the output graph directory
WriteGraph<TSegmenter>(segmenter.m_Graph, outputGraphDirectory, 0, 0);
typedef unsigned long int LabelPixelType;
typedef otb::Image<LabelPixelType, 2> LabelImageType;
typedef otb::ImageFileWriter<LabelImageType> LabelImageWriterType;
auto labelWriter = LabelImageWriterType::New();
labelWriter->SetFileName("out/labelImage.tiff");
labelWriter->SetInput(segmenter.GetLabeledClusteredOutput());
labelWriter->Update();
>>>>>>> upstream/master
}
template<class TSegmenter>
......
......@@ -57,7 +57,7 @@ namespace lsrm
std = std::sqrt((square_mean - 2*mean*sum + a_sum * mean* mean) / a_sum);
spect_cost += (a_sum * std - a1 * n1->m_Std[b] - a2 * n2->m_Std[b]);
}
spect_cost *= this->m_Param.m_ShapeWeight;
spect_cost *= this->m_Param.m_SpectralWeight;
if(spect_cost < this->m_Threshold)
{
......@@ -79,7 +79,7 @@ namespace lsrm
shape_cost = this->m_Param.m_ShapeWeight * compact_f + (1-this->m_Param.m_ShapeWeight) * smooth_f;
return (spect_cost + (1-this->m_Param.m_ShapeWeight)*shape_cost);
return (spect_cost + (1-this->m_Param.m_SpectralWeight)*shape_cost);
}
else
return spect_cost;
......
......@@ -26,18 +26,12 @@ namespace lsrm
typedef typename NodeList::const_iterator NodeConstIterator;
typedef unsigned long int LabelPixelType;
typedef otb::Image<LabelPixelType, 2> LabelImageType;
typedef unsigned char ClusterPixelType;
typedef otb::VectorImage<ClusterPixelType, 2> ClusteredImageType;
using ContourOperator = lp::ContourOperations;
LabelImageType::Pointer GetLabelImage(const GraphType& graph,
const unsigned int width,
const unsigned int height);
ClusteredImageType::Pointer GetClusteredOutput(const GraphType& graph,
const unsigned int width,
const unsigned int height);
};
} // end of namespace lsrm
......
#ifndef __LSRM_GRAPH_TO_OTBIMAGE_H
#define __LSRM_GRAPH_TO_OTBIMAGE_H
#include <itkRGBPixel.h>
#include <itkImageRegion.h>
#include <otbImage.h>
#include <otbVectorImage.h>
#include <otbImageFileReader.h>
#include <otbImageFileWriter.h>
#include "lsrmGraph.h"
#include <string>
#include <stdlib.h>
#include <time.h>
#include "lpContour.h"
namespace lsrm
{
template<class TGraph>
class GraphToOtbImage
{
public:
/* Some convenient typedefs */
typedef TGraph GraphType;
typedef typename GraphType::NodeType NodeType;
typedef std::vector< std::shared_ptr<NodeType> > NodeList;
typedef typename NodeList::const_iterator NodeConstIterator;
typedef unsigned long int LabelPixelType;
typedef otb::Image<LabelPixelType, 2> LabelImageType;
typedef unsigned char ClusterPixelType;
typedef otb::VectorImage<ClusterPixelType, 2> ClusteredImageType;
using ContourOperator = lp::ContourOperations;
LabelImageType::Pointer GetLabelImage(const GraphType& graph,
const unsigned int width,
const unsigned int height);
ClusteredImageType::Pointer GetClusteredOutput(const GraphType& graph,
const unsigned int width,
const unsigned int height);
};
} // end of namespace lsrm
#include "lsrmGraphToOtbImage.txx"
#endif
......@@ -2,6 +2,7 @@
#define __LSRM_GRAPH_TO_OTBIMAGE_TXX
#include "lsrmGraphToOtbImage.h"
#include "itkImageRegionIterator.h"
#include "itkGrayscaleFillholeImageFilter.h"
namespace lsrm
{
......@@ -45,83 +46,13 @@ namespace lsrm
++label;
}
long unsigned int pixelValue = 0;
for(it.GoToBegin(); !it.IsAtEnd(); ++it)
{
auto pixel = it.Get();
if(pixel == 0)
it.Set(pixelValue);
else
pixelValue = pixel;
}
return label_img;
}
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);
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;
}
// Fill holes
typedef itk::GrayscaleFillholeImageFilter<LabelImageType,LabelImageType> FillholeFilterType;
FillholeFilterType::Pointer fillFilter = FillholeFilterType::New();
fillFilter->SetInput(label_img);
fillFilter->Update();
return clusterImg;
return fillFilter->GetOutput();
}
} // end of namespace lsrm
......
#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);
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
......@@ -24,7 +24,6 @@ namespace lsrm
typedef typename GraphOperatorType::NodePointerType NodePointerType;
typedef GraphToOtbImage<GraphType> IOType;
typedef typename IOType::LabelImageType LabelImageType;
typedef typename IOType::ClusteredImageType ClusteredImageType;
/* Default constructor and destructor */
......@@ -81,13 +80,6 @@ namespace lsrm
auto labelImg = io.GetLabelImage(this->m_Graph, this->m_ImageWidth, this->m_ImageHeight);
return labelImg;
}
inline typename ClusteredImageType::Pointer GetClusteredImageOutput()
{
IOType io;
auto clusteredImg = io.GetClusteredOutput(this->m_Graph, this->m_ImageWidth, this->m_ImageHeight);
return clusteredImg;
}
/* Set methods */
SetMacro(bool, DoBFSegmentation);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment