diff --git a/Modules/DiffusionCmdApps/FiberProcessing/CMakeLists.txt b/Modules/DiffusionCmdApps/FiberProcessing/CMakeLists.txt index 0d5ac15..7cbb616 100644 --- a/Modules/DiffusionCmdApps/FiberProcessing/CMakeLists.txt +++ b/Modules/DiffusionCmdApps/FiberProcessing/CMakeLists.txt @@ -1,48 +1,49 @@ option(BUILD_DiffusionFiberProcessingCmdApps "Build commandline tools for diffusion fiber processing" OFF) if(BUILD_DiffusionFiberProcessingCmdApps OR MITK_BUILD_ALL_APPS) # needed include directories include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) # list of diffusion cmdapps # if an app requires additional dependencies # they are added after a "^^" and separated by "_" set( diffusionFiberProcessingcmdapps TractDensity^^ Sift2WeightCopy^^ FiberExtraction^^ FiberExtractionRoi^^ FiberProcessing^^ FitFibersToImage^^ FiberDirectionExtraction^^ FiberJoin^^ FiberClustering^^ TractDensityFilter^^ PrintFiberStatistics^^ + CalculateDistanceToSegmentation^^ ) foreach(diffusionFiberProcessingcmdapp ${diffusionFiberProcessingcmdapps}) # extract cmd app name and dependencies string(REPLACE "^^" "\\;" cmdapp_info ${diffusionFiberProcessingcmdapp}) set(cmdapp_info_list ${cmdapp_info}) list(GET cmdapp_info_list 0 appname) list(GET cmdapp_info_list 1 raw_dependencies) string(REPLACE "_" "\\;" dependencies "${raw_dependencies}") set(dependencies_list ${dependencies}) mitkFunctionCreateCommandLineApp( NAME ${appname} DEPENDS MitkDiffusionCmdApps MitkMriSimulation MitkFiberTracking ${dependencies_list} PACKAGE_DEPENDS ) endforeach() if(EXECUTABLE_IS_ENABLED) MITK_INSTALL_TARGETS(EXECUTABLES ${EXECUTABLE_TARGET}) endif() endif() diff --git a/Modules/DiffusionCmdApps/FiberProcessing/CalculateDistanceToSegmentation.cpp b/Modules/DiffusionCmdApps/FiberProcessing/CalculateDistanceToSegmentation.cpp new file mode 100644 index 0000000..ded8d8b --- /dev/null +++ b/Modules/DiffusionCmdApps/FiberProcessing/CalculateDistanceToSegmentation.cpp @@ -0,0 +1,90 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center. + +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 +#include "mitkDiffusionCommandLineParser.h" +#include +#include +#include +#include +#include + +typedef itk::Image ItkFloatImgType; + +/*! +\brief +*/ +int main(int argc, char* argv[]) +{ + mitkDiffusionCommandLineParser parser; + + parser.setTitle("Calcualte distance between segmentation mesh and fibers in form of a mask or TDI"); + parser.setCategory("Fiber Tracking and Processing Methods"); + parser.setContributor("MIC"); + + parser.setArgumentPrefix("--", "-"); + parser.addArgument("", "t", mitkDiffusionCommandLineParser::String, "TDI:", "input tract density image", us::Any(), false, false, false, mitkDiffusionCommandLineParser::Input); + parser.addArgument("", "s", mitkDiffusionCommandLineParser::String, "Segmentation:", "input segmentation mesh (.vtp)", us::Any(), false, false, false, mitkDiffusionCommandLineParser::Input); + parser.addArgument("", "o", mitkDiffusionCommandLineParser::String, "Output:", "output image", us::Any(), false, false, false, mitkDiffusionCommandLineParser::Output); + + std::map parsedArgs = parser.parseArguments(argc, argv); + if (parsedArgs.size()==0) + return EXIT_FAILURE; + + std::string inTDI = us::any_cast(parsedArgs["t"]); + std::string inSeg = us::any_cast(parsedArgs["s"]); + std::string outImageFile = us::any_cast(parsedArgs["o"]); + + try + { + mitk::Image::Pointer inputTDI= mitk::IOUtil::Load(inTDI); + + ItkFloatImgType::Pointer inputItkTDI = ItkFloatImgType::New(); + mitk::CastToItkImage(inputTDI, inputItkTDI); + + mitk::Surface::Pointer inputSeg = mitk::IOUtil::Load(inSeg); + + typedef itk::DistanceFromSegmentationImageFilter< float > ImageGeneratorType; + ImageGeneratorType::Pointer filter = ImageGeneratorType::New(); + filter->SetInput(inputItkTDI); + filter->SetSegmentationSurface(inputSeg); + filter->Update(); + auto outImg = filter->GetOutput(); + + // get output image + mitk::Image::Pointer img = mitk::Image::New(); + img->InitializeByItk(outImg); + img->SetVolume(outImg->GetBufferPointer()); + + mitk::IOUtil::Save(img, outImageFile ); + } + catch (const itk::ExceptionObject& e) + { + std::cout << e.what(); + return EXIT_FAILURE; + } + catch (std::exception& e) + { + std::cout << e.what(); + return EXIT_FAILURE; + } + catch (...) + { + std::cout << "ERROR!?!"; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} diff --git a/Modules/FiberTracking/Algorithms/itkDistanceFromSegmentationImageFilter.cpp b/Modules/FiberTracking/Algorithms/itkDistanceFromSegmentationImageFilter.cpp new file mode 100644 index 0000000..410f21f --- /dev/null +++ b/Modules/FiberTracking/Algorithms/itkDistanceFromSegmentationImageFilter.cpp @@ -0,0 +1,78 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center. + +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. + +===================================================================*/ + +#ifndef __itkDistanceFromSegmentationImageFilter_txx +#define __itkDistanceFromSegmentationImageFilter_txx + +#include "itkDistanceFromSegmentationImageFilter.h" +#include +#include +#include +#include +#include + +namespace itk { + +template< class TPixelType > +DistanceFromSegmentationImageFilter< TPixelType >::DistanceFromSegmentationImageFilter() +{ + +} + +template< class TPixelType > +void DistanceFromSegmentationImageFilter< TPixelType >::GenerateData() +{ + typename InputImageType::Pointer input_tdi = static_cast< InputImageType * >( this->ProcessObject::GetInput(0) ); + ImageRegionConstIterator< InputImageType > tdi_it(input_tdi, input_tdi->GetLargestPossibleRegion()); + + typename OutputImageType::Pointer outputImage = this->GetOutput(); + outputImage->SetOrigin( input_tdi->GetOrigin() ); + outputImage->SetRegions( input_tdi->GetLargestPossibleRegion() ); + outputImage->SetSpacing( input_tdi->GetSpacing() ); + outputImage->SetDirection( input_tdi->GetDirection() ); + outputImage->Allocate(); + outputImage->FillBuffer(0.0); + ImageRegionIterator< InputImageType > out_it(outputImage, outputImage->GetLargestPossibleRegion()); + + vtkSmartPointer vtkFilter = vtkSmartPointer::New(); + vtkFilter->SetInput(m_SegmentationSurface->GetVtkPolyData()); + + float min_distance = 999999; + + while( !tdi_it.IsAtEnd() ) + { + TPixelType tdi_val = tdi_it.Get(); + if (tdi_val>0) + { + auto idx = tdi_it.GetIndex(); + itk::Point point3D; + input_tdi->TransformIndexToPhysicalPoint(idx, point3D); + double dist = vtkFilter->EvaluateFunction(point3D[0], point3D[1], point3D[2]); + out_it.Set(dist); + + if (dist +#include +#include + +namespace itk{ + +/** +* \brief */ + +template< class TPixelType > +class DistanceFromSegmentationImageFilter : public ImageToImageFilter< Image< TPixelType, 3 >, Image< TPixelType, 3 > > +{ + +public: + + typedef DistanceFromSegmentationImageFilter Self; + typedef SmartPointer Pointer; + typedef SmartPointer ConstPointer; + typedef ImageToImageFilter< Image< TPixelType, 3 >, Image< TPixelType, 3 > > Superclass; + + /** Method for creation through the object factory. */ + itkFactorylessNewMacro(Self) + itkCloneMacro(Self) + + /** Runtime information support. */ + itkTypeMacro(DistanceFromSegmentationImageFilter, ImageToImageFilter) + + itkSetMacro( SegmentationSurface, mitk::Surface::Pointer ) + + typedef typename Superclass::InputImageType InputImageType; + typedef typename Superclass::OutputImageType OutputImageType; + typedef typename Superclass::OutputImageRegionType OutputImageRegionType; + +protected: + DistanceFromSegmentationImageFilter(); + ~DistanceFromSegmentationImageFilter() override {} + + void GenerateData() override; + +private: + + mitk::Surface::Pointer m_SegmentationSurface; +}; + +} + +#ifndef ITK_MANUAL_INSTANTIATION +#include "itkDistanceFromSegmentationImageFilter.cpp" +#endif + +#endif //__itkDistanceFromSegmentationImageFilter_h_ + diff --git a/Modules/FiberTracking/files.cmake b/Modules/FiberTracking/files.cmake index 6e5c97c..2638cc3 100644 --- a/Modules/FiberTracking/files.cmake +++ b/Modules/FiberTracking/files.cmake @@ -1,71 +1,72 @@ set(CPP_FILES mitkStreamlineTractographyParameters.cpp # Tractography Algorithms/GibbsTracking/mitkParticleGrid.cpp Algorithms/GibbsTracking/mitkMetropolisHastingsSampler.cpp Algorithms/GibbsTracking/mitkEnergyComputer.cpp Algorithms/GibbsTracking/mitkGibbsEnergyComputer.cpp Algorithms/GibbsTracking/mitkFiberBuilder.cpp Algorithms/GibbsTracking/mitkSphereInterpolator.cpp Algorithms/mitkTractClusteringFilter.cpp Algorithms/itkStreamlineTrackingFilter.cpp Algorithms/TrackingHandlers/mitkTrackingDataHandler.cpp Algorithms/TrackingHandlers/mitkTrackingHandlerTensor.cpp Algorithms/TrackingHandlers/mitkTrackingHandlerPeaks.cpp Algorithms/TrackingHandlers/mitkTrackingHandlerOdf.cpp ) set(H_FILES mitkStreamlineTractographyParameters.h # Algorithms Algorithms/itkTractDensityImageFilter.h Algorithms/itkTractsToFiberEndingsImageFilter.h Algorithms/itkTractsToRgbaImageFilter.h Algorithms/itkTractsToVectorImageFilter.h Algorithms/itkEvaluateDirectionImagesFilter.h Algorithms/itkEvaluateTractogramDirectionsFilter.h Algorithms/itkFiberCurvatureFilter.h Algorithms/mitkTractClusteringFilter.h Algorithms/itkTractDistanceFilter.h Algorithms/itkFiberExtractionFilter.h Algorithms/itkTdiToVolumeFractionFilter.h + Algorithms/itkDistanceFromSegmentationImageFilter.h # Tractography Algorithms/TrackingHandlers/mitkTrackingDataHandler.h Algorithms/TrackingHandlers/mitkTrackingHandlerRandomForest.h Algorithms/TrackingHandlers/mitkTrackingHandlerTensor.h Algorithms/TrackingHandlers/mitkTrackingHandlerPeaks.h Algorithms/TrackingHandlers/mitkTrackingHandlerOdf.h Algorithms/itkGibbsTrackingFilter.h Algorithms/itkStochasticTractographyFilter.h Algorithms/GibbsTracking/mitkParticle.h Algorithms/GibbsTracking/mitkParticleGrid.h Algorithms/GibbsTracking/mitkMetropolisHastingsSampler.h Algorithms/GibbsTracking/mitkSimpSamp.h Algorithms/GibbsTracking/mitkEnergyComputer.h Algorithms/GibbsTracking/mitkGibbsEnergyComputer.h Algorithms/GibbsTracking/mitkSphereInterpolator.h Algorithms/GibbsTracking/mitkFiberBuilder.h Algorithms/itkStreamlineTrackingFilter.h # Clustering Algorithms/ClusteringMetrics/mitkClusteringMetric.h Algorithms/ClusteringMetrics/mitkClusteringMetricEuclideanMean.h Algorithms/ClusteringMetrics/mitkClusteringMetricEuclideanMax.h Algorithms/ClusteringMetrics/mitkClusteringMetricEuclideanStd.h Algorithms/ClusteringMetrics/mitkClusteringMetricAnatomic.h Algorithms/ClusteringMetrics/mitkClusteringMetricScalarMap.h Algorithms/ClusteringMetrics/mitkClusteringMetricInnerAngles.h Algorithms/ClusteringMetrics/mitkClusteringMetricLength.h ) set(RESOURCE_FILES # Binary directory resources FiberTrackingLUTBaryCoords.bin FiberTrackingLUTIndices.bin )