//generate binary segment at actual CT image
BinaryImageTreeItem *CTImageTreeItem::generateSegment(void) {
	typedef itk::CastImageFilter< CTImageType, BinaryImageType> CastFilterType;
  
	bool ok;
	//show dialog for segment name
	QString segName = QInputDialog::getText(NULL, QObject::tr("Segment Name"),
						QObject::tr("Name:"), QLineEdit::Normal,
						QObject::tr("Unnamed Segment"), &ok);
	BinaryImageTreeItem::ImageType::Pointer seg;
	//if name is valid and dialog was closed with OK
	if (ok && !segName.isEmpty()) {
	    //create caster, that transforme the CT image to a binary image
		CastFilterType::Pointer caster = CastFilterType::New();
		caster->SetInput( getITKImage() );
		caster->Update();
		seg = caster->GetOutput();
		//fills the segment with zeros
		seg->FillBuffer(BinaryPixelOff);
		//create a binary tree item as child of this CT image
		BinaryImageTreeItem *result = new BinaryImageTreeItem(this, seg, segName);
		//insert child into the hierarchy
		insertChild(result);
		return result;
	}
	return NULL;
}
int main (int argc, char *argv[])
{
  // Verify arguments
  if(argc != 3)
    {
    std::cerr << "Required arguments: InputFileName OutputFileName" << std::endl;
    return EXIT_FAILURE;
    }

  // Parse arguments
  std::string inputFileName = argv[1];
  std::string outputFileName = argv[2];

  // Output arguments
  std::cout << "Input image: " << inputFileName << std::endl;
  std::cout << "Output image: " << outputFileName << std::endl;
  
  //typedef itk::Image<unsigned char, 2> ImageType;
  
  typedef itk::RGBPixel<float> RGBFloatPixelType; // We must use float pixels so that the averaging operation does not overflow
  typedef itk::Image<RGBFloatPixelType> RGBFloatImageType;
  
  typedef itk::ImageFileReader<RGBFloatImageType> ReaderType;
  ReaderType::Pointer reader = ReaderType::New();
  reader->SetFileName(inputFileName);
  reader->Update();
  
  SmallHoleFiller<RGBFloatImageType> smallHoleFiller;
  smallHoleFiller.SetImage(reader->GetOutput());
  
  RGBFloatImageType::PixelType green;
  green.SetRed(0);
  green.SetGreen(255);
  green.SetBlue(0);
  smallHoleFiller.SetHolePixel(green);

  smallHoleFiller.GenerateMaskFromImage();
  smallHoleFiller.Fill();
  
  typedef itk::RGBPixel<unsigned char> RGBUCharPixelType;
  typedef itk::Image<RGBUCharPixelType> RGBUCharImageType;
  typedef itk::CastImageFilter<RGBFloatImageType, RGBUCharImageType> CastFilterType;
  CastFilterType::Pointer castFilter = CastFilterType::New();
  castFilter->SetInput(smallHoleFiller.GetOutput());
  castFilter->Update();
  
  typedef  itk::ImageFileWriter< RGBUCharImageType  > WriterType;
  WriterType::Pointer writer = WriterType::New();
  writer->SetFileName(outputFileName);
  writer->SetInput(castFilter->GetOutput());
  writer->Update();
    
  return EXIT_SUCCESS;
}
ImageType::Pointer SBFilterUtils::GaussianSmoothImage(ImageType::Pointer image, float variance) {
	
	GaussianFilterType::Pointer gaussianFilter = GaussianFilterType::New();
	gaussianFilter->SetInput(image);
	gaussianFilter->SetVariance(variance);
	gaussianFilter->Update();

	CastFilterType::Pointer castFilter = CastFilterType::New();
	castFilter->SetInput(gaussianFilter->GetOutput());
	castFilter->Update();

	return castFilter->GetOutput();
}
//generate binary segment at actual CT image
BinaryImageTreeItem *CTImageTreeItem::generateSegment(QString name) {
	typedef itk::CastImageFilter< CTImageType, BinaryImageType> CastFilterType;
	
	BinaryImageTreeItem::ImageType::Pointer seg;
	//if name is valid and dialog was closed with OK
	if (!name.isEmpty()) {
	    //create caster, that transforme the CT image to a binary image
		CastFilterType::Pointer caster = CastFilterType::New();
		caster->SetInput( getITKImage() );
		caster->Update();
		seg = caster->GetOutput();
		//fills the segment with zeros
		seg->FillBuffer(BinaryPixelOff);
		//create a binary tree item as child of this CT image
		BinaryImageTreeItem *result = new BinaryImageTreeItem(this, seg, name);
		//insert child into the hierarchy
		insertChild(result);
		return result;
	}
	return NULL;
}