diff --git a/Modules/DiffusionImaging/MiniApps/FiberExtraction.cpp b/Modules/DiffusionImaging/MiniApps/FiberExtraction.cpp new file mode 100755 index 0000000000..4489c1cd34 --- /dev/null +++ b/Modules/DiffusionImaging/MiniApps/FiberExtraction.cpp @@ -0,0 +1,132 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "MiniAppManager.h" +#include +#include +#include "ctkCommandLineParser.h" +#include +#include +#include +#include +#include +#include +#include + +#define _USE_MATH_DEFINES +#include + +int FiberExtraction(int argc, char* argv[]) +{ + ctkCommandLineParser parser; + parser.setArgumentPrefix("--", "-"); + parser.addArgument("input", "i", ctkCommandLineParser::String, "input tractogram (.fib, vtk ascii file format)", us::Any(), false); + parser.addArgument("out", "o", ctkCommandLineParser::String, "output tractogram", us::Any(), false); + parser.addArgument("planfirgure1", "pf1", ctkCommandLineParser::String, "first planar figure", us::Any(), false); + parser.addArgument("planfirgure2", "pf2", ctkCommandLineParser::String, "second planar figure", us::Any()); + parser.addArgument("operation", "op", ctkCommandLineParser::String, "logical operation (AND, OR, NOT)", us::Any()); + + + map parsedArgs = parser.parseArguments(argc, argv); + if (parsedArgs.size()==0) + return EXIT_FAILURE; + + string inFib = us::any_cast(parsedArgs["input"]); + string outFib = us::any_cast(parsedArgs["out"]); + string pf1_path = us::any_cast(parsedArgs["planfirgure1"]); + + string operation(""); + string pf2_path(""); + if (parsedArgs.count("operation")) + { + operation = us::any_cast(parsedArgs["operation"]); + if (parsedArgs.count("planfirgure2") && (operation=="AND" || operation=="OR")) + pf2_path = us::any_cast(parsedArgs["planfirgure2"]); + } + + try + { + typedef itk::Image ItkUcharImgType; + + // load fiber bundle + mitk::FiberBundleX::Pointer inputTractogram = dynamic_cast(mitk::IOUtil::LoadDataNode(inFib)->GetData()); + mitk::PlanarFigure::Pointer pf1 = dynamic_cast(mitk::IOUtil::LoadDataNode(pf1_path)->GetData()); + mitk::PlanarFigure::Pointer pf2; + if (!pf2_path.empty()) + pf2 = dynamic_cast(mitk::IOUtil::LoadDataNode(pf2_path)->GetData()); + + mitk::PlanarFigureComposite::Pointer pfc = mitk::PlanarFigureComposite::New(); + + mitk::FiberBundleX::Pointer result; + if (operation.empty()) + { + result = inputTractogram->ExtractFiberSubset(pf1); + } + else if (operation=="NOT") + { + pfc->setOperationType(mitk::PFCOMPOSITION_NOT_OPERATION); + pfc->addPlanarFigure(pf1); + result = inputTractogram->ExtractFiberSubset(pfc); + } + else if (operation=="AND" && pf2.IsNotNull()) + { + pfc->setOperationType(mitk::PFCOMPOSITION_AND_OPERATION); + pfc->addPlanarFigure(pf1); + pfc->addPlanarFigure(pf2); + result = inputTractogram->ExtractFiberSubset(pfc); + } + else if (operation=="OR" && pf2.IsNotNull()) + { + pfc->setOperationType(mitk::PFCOMPOSITION_OR_OPERATION); + pfc->addPlanarFigure(pf1); + pfc->addPlanarFigure(pf2); + result = inputTractogram->ExtractFiberSubset(pfc); + } + else + { + MITK_INFO << "Could not process input:"; + MITK_INFO << pf1_path; + MITK_INFO << pf2_path; + MITK_INFO << operation; + } + + if (result.IsNotNull()) + { + mitk::IOUtil::SaveBaseData(result, outFib); + } + else + MITK_INFO << "No valid fiber bundle extracted."; + + MITK_INFO << "DONE"; + } + catch (itk::ExceptionObject e) + { + MITK_INFO << e; + return EXIT_FAILURE; + } + catch (std::exception e) + { + MITK_INFO << e.what(); + return EXIT_FAILURE; + } + catch (...) + { + MITK_INFO << "ERROR!?!"; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} +RegisterDiffusionMiniApp(FiberExtraction); diff --git a/Modules/DiffusionImaging/MiniApps/files.cmake b/Modules/DiffusionImaging/MiniApps/files.cmake index b66622d41c..da00a46da5 100644 --- a/Modules/DiffusionImaging/MiniApps/files.cmake +++ b/Modules/DiffusionImaging/MiniApps/files.cmake @@ -1,29 +1,30 @@ set(CPP_FILES mitkDiffusionMiniApps.cpp MiniAppManager.cpp BatchedFolderRegistration.cpp DicomFolderDump.cpp FileFormatConverter.cpp TensorReconstruction.cpp TensorDerivedMapsExtraction.cpp QballReconstruction.cpp DiffusionIndices.cpp ExtractImageStatistics.cpp CopyGeometry.cpp GibbsTracking.cpp StreamlineTracking.cpp FiberProcessing.cpp LocalDirectionalFiberPlausibility.cpp #TractogramAngularError.cpp FiberDirectionExtraction.cpp ImageResampler.cpp PeakExtraction.cpp PeaksAngularError.cpp MultishellMethods.cpp #FiberFoxProcessing.cpp ExportShImage.cpp NetworkCreation.cpp NetworkStatistics.cpp DwiDenoising.cpp + FiberExtraction.cpp )