Ejemplo n.º 1
0
int main(int argc, char *argv[])
{
  // Verify arguments
  if(argc != 5)
    {
    std::cerr << "Required arguments: image imageMask patchRadius outputPrefix" << std::endl;
    return EXIT_FAILURE;
    }

  // Parse arguments
  std::string imageFilename = argv[1];
  std::string maskFilename = argv[2];

  std::stringstream ssPatchRadius;
  ssPatchRadius << argv[3];
  int patchRadius = 0;
  ssPatchRadius >> patchRadius;

  std::string outputPrefix = argv[4];

  // Output arguments
  std::cout << "Reading image: " << imageFilename << std::endl;
  std::cout << "Reading mask: " << maskFilename << std::endl;
  std::cout << "Patch radius: " << patchRadius << std::endl;
  //std::cout << "Output: " << outputFilename << std::endl;

  typedef  itk::ImageFileReader< FloatVectorImageType > ImageReaderType;
  ImageReaderType::Pointer imageReader = ImageReaderType::New();
  imageReader->SetFileName(imageFilename.c_str());
  imageReader->Update();

  FloatVectorImageType::Pointer scaledImage = FloatVectorImageType::New();
  // Initialize
  Helpers::DeepCopy<FloatVectorImageType>(imageReader->GetOutput(), scaledImage);

  std::vector<float> maxValues = Helpers::MaxValuesVectorImage<float>(imageReader->GetOutput());

  // Scale all channels the same
//   for(unsigned int channel = 0; channel < imageReader->GetOutput()->GetNumberOfComponentsPerPixel(); ++channel)
//     {
//     Helpers::ScaleChannel<float>(imageReader->GetOutput(), channel, 1.0f, scaledImage);
//     }

  // Scale color channels
  for(unsigned int channel = 0; channel < 3; ++channel)
    {
    Helpers::ScaleChannel<float>(scaledImage, channel, 0.33f, scaledImage);
    }

  // Scale depth channel
  Helpers::ScaleChannel<float>(scaledImage, 3, 1.0f, scaledImage);

  Helpers::WriteImage<FloatVectorImageType>(scaledImage, "scaled.mha");

  typedef  itk::ImageFileReader< Mask > MaskReaderType;
  MaskReaderType::Pointer maskReader = MaskReaderType::New();
  maskReader->SetFileName(maskFilename.c_str());
  maskReader->Update();

  Mask::Pointer finalMask = Mask::New();
  ModifyMask(maskReader->GetOutput(), patchRadius, finalMask);

  cout.setf(ios::showpoint);

  std::vector<float> lambdas;
  for(unsigned int i = 0; i <= 10; ++i)
    {
    lambdas.push_back(0.1f * static_cast<float>(i));
    std::cout << "Using lambda " << lambdas[i] << std::endl;
    }

  std::shared_ptr<SelfPatchCompare> patchCompare(new SelfPatchCompare);
  patchCompare->SetNumberOfComponentsPerPixel(imageReader->GetOutput()->GetNumberOfComponentsPerPixel());
  //patchCompare->FunctionsToCompute.push_back(boost::bind(&SelfPatchCompare::SetPatchAverageAbsoluteSourceDifference,patchCompare,_1));
  patchCompare->FunctionsToCompute.push_back(boost::bind(&SelfPatchCompare::SetPatchColorDifference,patchCompare,_1));
  patchCompare->FunctionsToCompute.push_back(boost::bind(&SelfPatchCompare::SetPatchDepthDifference,patchCompare,_1));

  std::ofstream fout("scores.txt");

  fout.setf(ios::showpoint);
  for(unsigned int lambdaId = 0; lambdaId < lambdas.size(); ++lambdaId)
    {
    // Inpaint
    std::cout << "Inpainting with lambda = " << lambdas[lambdaId] << std::endl;

    PatchPair::DepthColorLambda = lambdas[lambdaId];

    CriminisiInpainting inpainting;
    //inpainting.SetDebugFunctionEnterLeave(true);
    inpainting.SetPatchRadius(patchRadius);
    inpainting.SetImage(scaledImage);
    inpainting.SetMask(finalMask);
    inpainting.SetMaxForwardLookPatches(3);
    inpainting.SetPatchCompare(patchCompare);

    inpainting.PatchSortFunction = &SortByDepthAndColor;
    //inpainting.PatchSortFunction = &SortByAverageAbsoluteDifference;

    //DepthAndColorDifference = ColorDifference * Lambda + (1.0 - Lambda) * DepthDifference;
    // When lambda = 0, only the depth is used
    // When lambda = 1, only the color is used

    inpainting.Initialize();
    inpainting.Inpaint();

    // Compute error
    itk::ImageRegionIterator<Mask> iterator(finalMask, finalMask->GetLargestPossibleRegion());
    float depthError = 0.0f;
    float colorError = 0.0f;

    while(!iterator.IsAtEnd())
      {
      if(finalMask->IsHole(iterator.GetIndex()))
	{
	colorError += ColorPixelDifference::Difference(scaledImage->GetPixel(iterator.GetIndex()), inpainting.GetCurrentOutputImage()->GetPixel(iterator.GetIndex()));
	depthError += DepthPixelDifference::Difference(scaledImage->GetPixel(iterator.GetIndex()), inpainting.GetCurrentOutputImage()->GetPixel(iterator.GetIndex()));
	}
      ++iterator;
      }
    std::cout << "colorError: " << colorError << std::endl;
    std::cout << "depthError: " << depthError << std::endl;

    fout << colorError << " " << depthError << std::endl;

    // Unscale all channels
    for(unsigned int channel = 0; channel < imageReader->GetOutput()->GetNumberOfComponentsPerPixel(); ++channel)
      {
      Helpers::ScaleChannel<float>(inpainting.GetCurrentOutputImage(), channel, maxValues[channel], inpainting.GetCurrentOutputImage());
      }

    std::stringstream ssFloat;
    ssFloat.setf(ios::showpoint);
    ssFloat << outputPrefix << "_float_lambda_" << lambdas[lambdaId] << ".mha";
    Helpers::WriteImage<FloatVectorImageType>(inpainting.GetCurrentOutputImage(), ssFloat.str());

    std::stringstream ssRGB;
    ssRGB.setf(ios::showpoint);
    ssRGB << outputPrefix << "_RGB_lambda_" << lambdas[lambdaId] << ".mha";
    Helpers::WriteVectorImageAsRGB(inpainting.GetCurrentOutputImage(), ssRGB.str());
    //Helpers::WriteVectorImageAsRGB(inpainting.GetCurrentOutputImage(), Helpers::ReplaceFileExtension(ss.str(), "png"));
    }

  fout.close();

  return EXIT_SUCCESS;
}
Ejemplo n.º 2
0
 void MdiEditor::createMenuBar()
 {
	pro_menu=menuBar()->addMenu("Project");
	new_pro=new QAction("&New Project", this);
	save_pro=new QAction("&Save Project", this);
	pro_menu->addAction(new_pro);
	pro_menu->addAction(save_pro);

	setting_menu=menuBar()->addMenu("Settings");
	mod_para=new QAction("&Parameters", this);
	setting_menu->addAction(mod_para);
	mod_mask=new QAction("&Masks", this);
	setting_menu->addAction(mod_mask);
	mod_layer=new QAction("&Layers", this);
	setting_menu->addAction(mod_layer);


	view_menu=menuBar()->addMenu("View");
	mask_view=view_menu->addMenu("Mask");
	show_mask=new QAction("&Show", this);
	mask_view->addAction(show_mask);
	hide_mask=new QAction("&Hide", this);
	mask_view->addAction(hide_mask);

	result_view=view_menu->addMenu("Results");
	show_halfway=new QAction("&Halfway Image", this);
	result_view->addAction(show_halfway);
	show_error=new QAction("&Error Image", this);
	result_view->addAction(show_error);

	color_view=view_menu->addMenu("Color from");
	show_image1=new QAction("&Image1", this);
	color_view->addAction(show_image1);
	show_image12=new QAction("&Both image1 & image2", this);
	color_view->addAction(show_image12);
	show_image2=new QAction("&Image2", this);
	color_view->addAction(show_image2);

	layer_view=view_menu->addMenu("Layer");
	show_multilayer=new QAction("&Multilayer", this);
	layer_view->addAction(show_multilayer);

	alg_menu=menuBar()->addMenu("Algorithm");
	cpu_alg=new QAction("&CPU", this);
	gpu_alg=new QAction("&GPU", this);
	alg_menu->addAction(cpu_alg);
	alg_menu->addAction(gpu_alg);


	show_mask->setCheckable(true);
	hide_mask->setCheckable(true);
	show_halfway->setCheckable(true);
	show_error->setCheckable(true);
	show_image1->setCheckable(true);
	show_image12->setCheckable(true);
	show_image2->setCheckable(true);
	show_multilayer->setCheckable(true);
	cpu_alg->setCheckable(true);
	gpu_alg->setCheckable(true);

	//right menu
	confirm=new QAction("&confirm",this);
	cancel=new QAction("&cancel",this);

	//signal
	connect(new_pro,SIGNAL(triggered()),this,SLOT(NewProject()));
	connect(save_pro,SIGNAL(triggered()),this,SLOT(SaveProject()));
	connect(mod_para,SIGNAL(triggered()),this,SLOT(ModifyPara()));
	connect(mod_mask,SIGNAL(triggered()),this,SLOT(ModifyMask()));
	connect(show_mask,SIGNAL(triggered()),this,SLOT(ShowMask()));
	connect(hide_mask,SIGNAL(triggered()),this,SLOT(HideMask()));
	connect(show_halfway,SIGNAL(triggered()),this,SLOT(ShowHalfway()));
	connect(show_error,SIGNAL(triggered()),this,SLOT(ShowError()));
	connect(show_image1,SIGNAL(triggered()),this,SLOT(ColorFromImage1()));
	connect(show_image12,SIGNAL(triggered()),this,SLOT(ColorFromImage12()));
	connect(show_image2,SIGNAL(triggered()),this,SLOT(ColorFromImage2()));
	connect(confirm,SIGNAL(triggered()),this,SLOT(Confirm()));
	connect(cancel,SIGNAL(triggered()),this,SLOT(Cancel()));
	connect(mod_layer,SIGNAL(triggered()),this,SLOT(ModifyLayer()));
	connect(show_multilayer,SIGNAL(triggered()),this,SLOT(MultyLayer()));
	connect(cpu_alg,SIGNAL(triggered()),this,SLOT(CPU_Alg()));
	connect(gpu_alg,SIGNAL(triggered()),this,SLOT(GPU_Alg()));


 }