#include <iostream>
static void CreateImage(UnsignedCharImageType::Pointer image);
static void PerformSegmentation(FloatImageType::Pointer image, const float threshold, const float level);
int main( int argc, char *argv[] )
{
if (argc < 3 )
{
std::cerr << "Parameters " << std::endl;
std::cerr << " threshold level" << std::endl;
return 1;
}
std::string strThreshold = argv[1];
float threshold = 0.0;
std::stringstream ssThreshold;
ssThreshold << strThreshold;
ssThreshold >> threshold;
std::string strLevel = argv[2];
float level = 0.0;
std::stringstream ssLevel;
ssLevel << strLevel;
ssLevel >> level;
std::cout << "Running with:" << std::endl
<< "Threshold: " << threshold << std::endl
<< "Level: " << level << std::endl;
UnsignedCharImageType::Pointer image = UnsignedCharImageType::New();
CreateImage(image);
UnsignedCharImageType, FloatImageType > GradientMagnitudeImageFilterType;
GradientMagnitudeImageFilterType::Pointer gradientMagnitudeImageFilter = GradientMagnitudeImageFilterType::New();
gradientMagnitudeImageFilter->SetInput(image);
gradientMagnitudeImageFilter->Update();
PerformSegmentation(gradientMagnitudeImageFilter->GetOutput(), threshold, level);
PerformSegmentation(gradientMagnitudeImageFilter->GetOutput(), .0025, .25);
PerformSegmentation(gradientMagnitudeImageFilter->GetOutput(), .005, .5);
PerformSegmentation(gradientMagnitudeImageFilter->GetOutput(), .0075, .75);
PerformSegmentation(gradientMagnitudeImageFilter->GetOutput(), .009, .9);
return EXIT_SUCCESS;
}
void CreateImage(UnsignedCharImageType::Pointer image)
{
image->SetRegions(region);
image->Allocate();
image->FillBuffer(255);
while(!imageIterator.IsAtEnd())
{
if(imageIterator.GetIndex()[0] > 20 && imageIterator.GetIndex()[0] < 50 &&
imageIterator.GetIndex()[1] > 20 && imageIterator.GetIndex()[1] < 50)
imageIterator.Set(50);
++imageIterator;
}
imageIterator.GoToBegin();
while(!imageIterator.IsAtEnd())
{
if(imageIterator.GetIndex()[0] > 60 && imageIterator.GetIndex()[0] < 80 &&
imageIterator.GetIndex()[1] > 60 && imageIterator.GetIndex()[1] < 80)
imageIterator.Set(100);
++imageIterator;
}
imageIterator.GoToBegin();
while(!imageIterator.IsAtEnd())
{
if(imageIterator.GetIndex()[0] > 100 && imageIterator.GetIndex()[0] < 130 &&
imageIterator.GetIndex()[1] > 100 && imageIterator.GetIndex()[1] < 130)
imageIterator.Set(150);
++imageIterator;
}
FileWriterType::Pointer writer = FileWriterType::New();
writer->SetFileName("input.png");
writer->SetInput(image);
writer->Update();
}
void PerformSegmentation(FloatImageType::Pointer image, const float threshold, const float level)
{
WatershedFilterType::Pointer watershed = WatershedFilterType::New();
watershed->SetThreshold(threshold);
watershed->SetLevel(level);
watershed->SetInput(image);
watershed->Update();
RGBFilterType::Pointer colormapImageFilter = RGBFilterType::New();
colormapImageFilter->SetInput(watershed->GetOutput());
colormapImageFilter->SetColormap( RGBFilterType::Jet );
colormapImageFilter->Update();
std::stringstream ss;
ss << "output_" << threshold << "_" << level << ".png";
FileWriterType::Pointer writer = FileWriterType::New();
writer->SetFileName(ss.str());
writer->SetInput(colormapImageFilter->GetOutput());
writer->Update();
}