diff --git a/CMake/BuildConfigurations/DiffusionCmdApps_NoPython.cmake b/CMake/BuildConfigurations/DiffusionCmdApps_NoPython.cmake new file mode 100644 index 0000000..7a03b13 --- /dev/null +++ b/CMake/BuildConfigurations/DiffusionCmdApps_NoPython.cmake @@ -0,0 +1,38 @@ +set(BUILD_TESTING OFF CACHE BOOL "" FORCE) +set(MITK_BUILD_ALL_PLUGINS OFF CACHE BOOL "Build all MITK plugins" FORCE) +set(MITK_BUILD_EXAMPLES OFF CACHE BOOL "Build the MITK examples" FORCE) +set(BUILD_TESTING OFF CACHE BOOL "Build the MITK tests" FORCE) + + +set(MITK_USE_BLUEBERRY OFF CACHE BOOL "" FORCE) +set(MITK_USE_CTK OFF CACHE BOOL "" FORCE) +set(MITK_USE_Qt5 OFF CACHE BOOL "" FORCE) +set(MITK_USE_Qwt OFF CACHE BOOL "" FORCE) + +set(MITK_DOXYGEN_GENERATE_QCH_FILES OFF CACHE BOOL "Use doxygen to generate Qt compressed help files for MITK docs" FORCE) +set(BLUEBERRY_USE_QT_HELP OFF CACHE BOOL "Enable support for integrating bundle documentation into Qt Help" FORCE) + +set(MITK_USE_Vigra ON CACHE BOOL "MITK Use Vigra Library" FORCE) +set(MITK_USE_HDF5 ON CACHE BOOL "MITK Use HDF5 Library" FORCE) +set(MITK_USE_MatchPoint ON CACHE BOOL "" FORCE) +set(MITK_USE_DCMTK ON CACHE BOOL "" FORCE) +set(MITK_USE_DCMQI ON CACHE BOOL "" FORCE) +set(MITK_USE_OpenMP ON CACHE BOOL "" FORCE) +set(MITK_USE_Python3 OFF CACHE BOOL "" FORCE) + +# Activate Diffusion Mini Apps +set(BUILD_DiffusionFiberProcessingCmdApps ON CACHE BOOL "Build commandline tools for diffusion fiber processing" FORCE) +set(BUILD_DiffusionFiberfoxCmdApps ON CACHE BOOL "Build commandline tools for diffusion data simulation (Fiberfox)" FORCE) +set(BUILD_DiffusionMiscCmdApps ON CACHE BOOL "Build miscellaneous commandline tools for diffusion" FORCE) +set(BUILD_DiffusionQuantificationCmdApps ON CACHE BOOL "Build commandline tools for diffusion quantification (IVIM, ADC, ...)" FORCE) +set(BUILD_DiffusionTractographyCmdApps ON CACHE BOOL "Build commandline tools for diffusion fiber tractography" FORCE) +set(BUILD_DiffusionTractographyEvaluationCmdApps ON CACHE BOOL "Build commandline tools for diffusion fiber tractography evaluation" FORCE) +set(BUILD_DiffusionConnectomicsCmdApps OFF CACHE BOOL "Build commandline tools for diffusion connectomics" FORCE) +set(BUILD_DiffusionPythonCmdApps OFF CACHE BOOL "Build commandline tools for diffusion with python" FORCE) + +## Build neither all plugins nor examples +#set(MITK_WHITELIST "DiffusionQuantificationCmdApps" CACHE STRING "" FORCE) + +#if(NOT MITK_USE_SUPERBUILD) +# set(BUILD_DiffusionQuantificationCmdApps ON CACHE BOOL "" FORCE) +#endif() diff --git a/Modules/DiffusionCmdApps/Quantification/DiffusionIvimFit.cpp b/Modules/DiffusionCmdApps/Quantification/DiffusionIvimFit.cpp index e5460a5..7afeb33 100644 --- a/Modules/DiffusionCmdApps/Quantification/DiffusionIvimFit.cpp +++ b/Modules/DiffusionCmdApps/Quantification/DiffusionIvimFit.cpp @@ -1,189 +1,189 @@ /*=================================================================== 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 "mitkDiffusionCommandLineParser.h" #include #include #include #include #include "mitkImage.h" #include #include #include #include "mitkIOUtil.h" #include #include //vnl_includes #include "vnl/vnl_math.h" #include "vnl/vnl_cost_function.h" #include "vnl/vnl_least_squares_function.h" #include "vnl/algo/vnl_lbfgsb.h" #include "vnl/algo/vnl_lbfgs.h" #include "vnl/algo/vnl_levenberg_marquardt.h" typedef mitk::DiffusionPropertyHelper DPH; #include #include #include #include #include #include #include void IvimMapComputation( mitk::Image::Pointer input, std::string output_prefix , std::string output_type, double b_thresh, int type) { MITK_INFO << "Starting fit"; DPH::ImageType::Pointer vectorImage = DPH::ImageType::New(); mitk::CastToItkImage( input, vectorImage ); typedef itk::DiffusionIntravoxelIncoherentMotionReconstructionImageFilter IVIMFilterType; IVIMFilterType::Pointer ivim_filter = IVIMFilterType::New(); ivim_filter->SetInput( vectorImage ); ivim_filter->SetBValue( DPH::GetReferenceBValue( input.GetPointer() ) ); ivim_filter->SetGradientDirections( DPH::GetGradientContainer( input.GetPointer() ) ); switch (type) { case 0: ivim_filter->SetMethod(IVIMFilterType::IVIM_FIT_ALL); break; case 1: ivim_filter->SetMethod(IVIMFilterType::IVIM_DSTAR_FIX); break; case 2: ivim_filter->SetMethod(IVIMFilterType::IVIM_D_THEN_DSTAR); break; case 3: ivim_filter->SetMethod(IVIMFilterType::IVIM_LINEAR_D_THEN_F); break; default: ivim_filter->SetMethod(IVIMFilterType::IVIM_D_THEN_DSTAR); } ivim_filter->SetBThres(b_thresh); ivim_filter->SetS0Thres(0); ivim_filter->SetFitDStar(true); ivim_filter->SetNumberOfThreads(1); try { ivim_filter->Update(); } catch( const itk::ExceptionObject& e) { mitkThrow() << "IVIM fit failed with an ITK Exception: " << e.what(); } mitk::Image::Pointer f_image = mitk::Image::New(); f_image->InitializeByItk( ivim_filter->GetOutput() ); f_image->SetVolume( ivim_filter->GetOutput()->GetBufferPointer() ); mitk::Image::Pointer d_image = mitk::Image::New(); d_image->InitializeByItk( ivim_filter->GetOutput(1) ); d_image->SetVolume( ivim_filter->GetOutput(1)->GetBufferPointer() ); mitk::Image::Pointer dstar_image = mitk::Image::New(); dstar_image->InitializeByItk( ivim_filter->GetOutput(1) ); dstar_image->SetVolume( ivim_filter->GetOutput(2)->GetBufferPointer() ); std::string outputf_FileName = output_prefix + "_f_map." + output_type; std::string outputD_FileName = output_prefix + "_D_map." + output_type; std::string outputDstar_FileName = output_prefix + "_Dstar_map." + output_type; try { mitk::IOUtil::Save( dstar_image, outputDstar_FileName ); mitk::IOUtil::Save( d_image, outputD_FileName ); mitk::IOUtil::Save( f_image, outputf_FileName ); } catch( const itk::ExceptionObject& e) { mitkThrow() << "Failed to save the KurtosisFit Results due to exception: " << e.what(); } } int main( int argc, char* argv[] ) { mitkDiffusionCommandLineParser parser; parser.setTitle("Diffusion IVIM Fit"); parser.setCategory("Diffusion Related Measures"); parser.setContributor("MIC"); parser.setDescription("Fitting IVIM"); parser.setArgumentPrefix("--","-"); // mandatory arguments parser.addArgument("", "i", mitkDiffusionCommandLineParser::String, "Input: ", "input image (DWI)", us::Any(), false, false, false, mitkDiffusionCommandLineParser::Input); - parser.addArgument("", "o", mitkDiffusionCommandLineParser::String, "Output Preifx: ", "Prefix for the output images, will append _ADC, _AKC accordingly ", us::Any(), false); + parser.addArgument("", "o", mitkDiffusionCommandLineParser::String, "Output Preifx: ", "Prefix for the output images", us::Any(), false); parser.addArgument("output_type", "", mitkDiffusionCommandLineParser::String, "Output Type: ", "choose data type of output image, e.g. '.nii' or '.nrrd' ", std::string(".nrrd")); parser.addArgument("b_threshold", "", mitkDiffusionCommandLineParser::Float, "b-threshold:", "Omit smaller b-values for first fit^", 170.0); parser.addArgument("fit_type", "", mitkDiffusionCommandLineParser::Int, "Fit:", "Jointly fit D, f and D* (0); Fit D&f with fixed D* (1); Fit D&f (high b), then fit D* (2); Linearly fit D&f (high b), then fit D* (3)", 2); std::map parsedArgs = parser.parseArguments(argc, argv); if (parsedArgs.size()==0) return EXIT_FAILURE; // mandatory arguments std::string inFileName = us::any_cast(parsedArgs["i"]); std::string out_prefix = us::any_cast(parsedArgs["o"]); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor({"Diffusion Weighted Images"}, std::vector()); mitk::Image::Pointer inputImage = mitk::IOUtil::Load(inFileName, &functor); double b_thresh = 170; int fit_type = 2; std::string out_type = "nrrd"; if (parsedArgs.count("output_type")) out_type = us::any_cast(parsedArgs["output_type"]); if (parsedArgs.count("b_threshold")) b_thresh = us::any_cast(parsedArgs["b_threshold"]); if (parsedArgs.count("fit_type")) fit_type = us::any_cast(parsedArgs["fit_type"]); if( !DPH::IsDiffusionWeightedImage( inputImage ) ) { MITK_ERROR("DiffusionIVIMFit.Input") << "No valid diffusion-weighted image provided, failed to load " << inFileName << " as DW Image. Aborting..."; return EXIT_FAILURE; } IvimMapComputation( inputImage, out_prefix , out_type, b_thresh, fit_type); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.python/resources/tractseg.py b/Plugins/org.mitk.gui.qt.diffusionimaging.python/resources/tractseg.py index e2253dd..978cf85 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.python/resources/tractseg.py +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.python/resources/tractseg.py @@ -1,112 +1,110 @@ error_string = None del error_string try: import nibabel as nib import numpy as np from tractseg.python_api import run_tractseg from tractseg.python_api import img_utils data = sitk.GetArrayFromImage(in_image) data = np.nan_to_num(data) - swapaxes = False data = np.swapaxes(data, 0, 2) - swapaxes = True affine = np.zeros((4, 4)) affine[0, 0] = in_image.GetDirection()[0] * in_image.GetSpacing()[0] affine[1, 0] = in_image.GetDirection()[1] * in_image.GetSpacing()[0] affine[2, 0] = in_image.GetDirection()[2] * in_image.GetSpacing()[0] affine[0, 1] = in_image.GetDirection()[3] * in_image.GetSpacing()[1] affine[1, 1] = in_image.GetDirection()[4] * in_image.GetSpacing()[1] affine[2, 1] = in_image.GetDirection()[5] * in_image.GetSpacing()[1] affine[0, 2] = in_image.GetDirection()[6] * in_image.GetSpacing()[2] affine[1, 2] = in_image.GetDirection()[7] * in_image.GetSpacing()[2] affine[2, 2] = in_image.GetDirection()[8] * in_image.GetSpacing()[2] affine[0, 3] = in_image.GetOrigin()[0] affine[1, 3] = in_image.GetOrigin()[1] affine[2, 3] = in_image.GetOrigin()[2] affine[3, 3] = 1 data, flip_axis = img_utils.flip_peaks_to_correct_orientation_if_needed(nib.Nifti1Image(data, affine=affine), do_flip=True) print('flip_axis', flip_axis) print('output_type', output_type) print('get_probs', get_probs) print('dropout_sampling', dropout_sampling) print('threshold', threshold) seg = run_tractseg(data=data, output_type=output_type, input_type="peaks", verbose=verbose, get_probs=get_probs, dropout_sampling=dropout_sampling, threshold=threshold, postprocess=False, nr_cpus=1) # bla = nib.Nifti1Image(seg, affine) # nib.save(bla, '/home/neher/test.nii.gz') seg = np.swapaxes(seg, 0, 2) print('Output shape: ' + str(seg.shape)) if output_type == "tract_segmentation": if not get_probs and not dropout_sampling: if collapse: temp = np.zeros((seg.shape[0], seg.shape[1], seg.shape[2])) for l in range(seg.shape[3]): temp[np.where(seg[:, :, :, l] > 0)] = l + 1 seg = temp segmentation = sitk.GetImageFromArray(seg.astype(np.uint8)) else: segmentation = sitk.GetImageFromArray(seg) segmentation.SetOrigin(in_image.GetOrigin()) segmentation.SetSpacing(in_image.GetSpacing()) segmentation.SetDirection(in_image.GetDirection()) elif output_type == "endings_segmentation": print("endings_segmentation", get_probs, dropout_sampling) if not get_probs and not dropout_sampling: # merge start and end into labelmap temp = np.zeros((seg.shape[0], seg.shape[1], seg.shape[2], seg.shape[3] // 2)) for l in range(temp.shape[3]): temp[:, :, :, l][np.where(seg[:, :, :, l * 2] > 0)] = 1 temp[:, :, :, l][np.where(seg[:, :, :, l * 2 + 1] > 0)] = 2 seg = temp if collapse: temp = np.zeros((seg.shape[0], seg.shape[1], seg.shape[2])) for l in range(seg.shape[3]): temp[np.where(seg[:, :, :, l] == 1)] = 2*l + 1 temp[np.where(seg[:, :, :, l] == 2)] = 2*l + 2 seg = temp segmentation = sitk.GetImageFromArray(seg.astype(np.uint8)) else: temp = np.zeros((seg.shape[0], seg.shape[1], seg.shape[2], seg.shape[3] // 2)) for l in range(temp.shape[3]): temp[:, :, :, l] += seg[:, :, :, l * 2] temp[:, :, :, l] += seg[:, :, :, l * 2 + 1] seg = temp segmentation = sitk.GetImageFromArray(seg) segmentation.SetOrigin(in_image.GetOrigin()) segmentation.SetSpacing(in_image.GetSpacing()) segmentation.SetDirection(in_image.GetDirection()) elif output_type == "TOM": if not collapse: for x in range(0, 72): tom = sitk.GetImageFromArray(seg[:, :, :, x * 3:x * 3 + 3]) tom.SetOrigin(in_image.GetOrigin()) tom.SetSpacing(in_image.GetSpacing()) tom.SetDirection(in_image.GetDirection()) globals()['tom%s' % x] = tom else: tom0 = sitk.GetImageFromArray(seg) tom0.SetOrigin(in_image.GetOrigin()) tom0.SetSpacing(in_image.GetSpacing()) tom0.SetDirection(in_image.GetDirection()) except Exception as e: error_string = str(e) print(error_string)