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; }
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())); }