diff --git a/Modules/FiberTracking/Algorithms/mitkTractometry.cpp b/Modules/FiberTracking/Algorithms/mitkTractometry.cpp deleted file mode 100644 index 6f27c46..0000000 --- a/Modules/FiberTracking/Algorithms/mitkTractometry.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/*=================================================================== - -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 "mitkTractometry.h" - -#define _USE_MATH_DEFINES -#include -#include -#include -#include -#include -#include - -namespace mitk{ - -bool Tractometry::Flip(vtkSmartPointer< vtkPolyData > polydata1, int i, vtkSmartPointer< vtkPolyData > ref_poly) -{ - double d_direct = 0; - double d_flipped = 0; - - vtkCell* cell1 = polydata1->GetCell(0); - if (ref_poly!=nullptr) - cell1 = ref_poly->GetCell(0); - auto numPoints1 = cell1->GetNumberOfPoints(); - vtkPoints* points1 = cell1->GetPoints(); - - std::vector> ref_points; - for (int j=0; jGetPoint(j); - itk::Point itk_p; - itk_p[0] = p1[0]; - itk_p[1] = p1[1]; - itk_p[2] = p1[2]; - ref_points.push_back(itk_p); - } - - vtkCell* cell2 = polydata1->GetCell(i); - vtkPoints* points2 = cell2->GetPoints(); - - for (int j=0; jGetPoint(j); - d_direct += (p1[0]-p2[0])*(p1[0]-p2[0]) + (p1[1]-p2[1])*(p1[1]-p2[1]) + (p1[2]-p2[2])*(p1[2]-p2[2]); - - double* p3 = points2->GetPoint(numPoints1-j-1); - d_flipped += (p1[0]-p3[0])*(p1[0]-p3[0]) + (p1[1]-p3[1])*(p1[1]-p3[1]) + (p1[2]-p3[2])*(p1[2]-p3[2]); - } - - if (d_direct>d_flipped) - return true; - return false; -} - - -void Tractometry::ResampleIfNecessary(mitk::FiberBundle::Pointer fib, unsigned int num_points) -{ - auto poly = fib->GetFiberPolyData(); - bool resample = false; - for (int i=0; iGetNumberOfCells(); i++) - { - vtkCell* cell = poly->GetCell(i); - if (cell->GetNumberOfPoints()!=num_points) - { - resample = true; - MITK_INFO << "Resampling required!"; - break; - } - } - - if (resample) - fib->ResampleToNumPoints(num_points); -} - -unsigned int Tractometry::EstimateNumSamplingPoints(itk::Image::Pointer ref_image, mitk::FiberBundle::Pointer fib, unsigned int voxels) -{ - auto spacing = ref_image->GetSpacing(); - float f = (spacing[0] + spacing[1] + spacing[2])/3; - float num_voxels_passed = 0; - for (unsigned int i=0; iGetNumFibers(); ++i) - num_voxels_passed += fib->GetFiberLength(i)/f; - num_voxels_passed /= fib->GetNumFibers(); - unsigned int parcels = std::ceil(num_voxels_passed/voxels); - - MITK_INFO << "Estimated number of sampling points " << parcels; - - return parcels; -} - - -std::vector> Tractometry::NearestCentroidPointTractometry(itk::Image::Pointer itkImage, mitk::FiberBundle::Pointer working_fib, unsigned int num_points, unsigned int max_centroids, float cluster_size, mitk::FiberBundle::Pointer ref_fib) -{ - vtkSmartPointer< vtkPolyData > polydata = working_fib->GetFiberPolyData(); - vtkSmartPointer< vtkPolyData > ref_polydata = nullptr; - if (ref_fib!=nullptr) - { - ResampleIfNecessary(ref_fib, num_points); - ref_polydata = ref_fib->GetFiberPolyData(); - } - - auto interpolator = itk::LinearInterpolateImageFunction< itk::Image, float >::New(); - interpolator->SetInputImage(itkImage); - - mitk::LookupTable::Pointer lookupTable = mitk::LookupTable::New(); - lookupTable->SetType(mitk::LookupTable::MULTILABEL); - - std::vector> output_temp; - for(unsigned int i=0; i metrics; - metrics.push_back({new mitk::ClusteringMetricEuclideanStd()}); - - mitk::FiberBundle::Pointer resampled = working_fib->GetDeepCopy(); - ResampleIfNecessary(resampled, num_points); - - std::vector centroids; - std::shared_ptr< mitk::TractClusteringFilter > clusterer = std::make_shared(); - int c=0; - while (c<30 && (centroids.empty() || centroids.size()>max_centroids)) - { - float cs = cluster_size + cluster_size*c*0.2; - float max_d = 0; - int i=1; - std::vector< float > distances; - while (max_d < resampled->GetGeometry()->GetDiagonalLength()/2) - { - distances.push_back(cs*i); - max_d = cs*i; - ++i; - } - - clusterer->SetDistances(distances); - clusterer->SetTractogram(resampled); - clusterer->SetMetrics(metrics); - clusterer->SetMergeDuplicateThreshold(cs); - clusterer->SetDoResampling(false); - clusterer->SetNumPoints(num_points); - if (c==29) - clusterer->SetMaxClusters(max_centroids); - clusterer->SetMinClusterSize(1); - clusterer->Update(); - centroids = clusterer->GetOutCentroids(); - ++c; - } - - for (unsigned int i=0; iGetNumFibers(); ++i) - { - vtkCell* cell = polydata->GetCell(i); - auto numPoints = cell->GetNumberOfPoints(); - vtkPoints* points = cell->GetPoints(); - - vnl_vector values; values.set_size(numPoints); - - for (int j=0; jGetPoint(j); - - int min_bin = 0; - float d=999999; - for (auto centroid : centroids) - { - auto centroid_polydata = centroid->GetFiberPolyData(); - - vtkCell* centroid_cell = centroid_polydata->GetCell(0); - auto centroid_numPoints = centroid_cell->GetNumberOfPoints(); - vtkPoints* centroid_points = centroid_cell->GetPoints(); - - bool centroid_flip = Flip(centroid_polydata, 0, ref_polydata); - - for (int bin=0; binGetPoint(bin); - float temp_d = std::sqrt((p[0]-centroid_p[0])*(p[0]-centroid_p[0]) + (p[1]-centroid_p[1])*(p[1]-centroid_p[1]) + (p[2]-centroid_p[2])*(p[2]-centroid_p[2])); - if (temp_dGetColor(min_bin+1, rgb); - working_fib->ColorSinglePoint(i, j, rgb); - - double pixelValue = mitk::imv::GetImageValue(mitk::imv::GetItkPoint(p), true, interpolator); - output_temp.at(min_bin).push_back(pixelValue); - } - } - - std::vector> output; - for (auto row_v : output_temp) - { - vnl_vector row; row.set_size(row_v.size()); - int i = 0; - for (auto v : row_v) - { - row.put(i, v); - ++i; - } - output.push_back(row); - } - - return output; -} - -vnl_matrix Tractometry::StaticResamplingTractometry(itk::Image::Pointer itkImage, mitk::FiberBundle::Pointer working_fib, unsigned int num_points, mitk::FiberBundle::Pointer ref_fib) -{ - - ResampleIfNecessary(working_fib, num_points); - vtkSmartPointer< vtkPolyData > polydata = working_fib->GetFiberPolyData(); - vtkSmartPointer< vtkPolyData > ref_polydata = nullptr; - if (ref_fib!=nullptr) - { - ResampleIfNecessary(ref_fib, num_points); - ref_polydata = ref_fib->GetFiberPolyData(); - } - - auto interpolator = itk::LinearInterpolateImageFunction< itk::Image, float >::New(); - interpolator->SetInputImage(itkImage); - - mitk::LookupTable::Pointer lookupTable = mitk::LookupTable::New(); - lookupTable->SetType(mitk::LookupTable::MULTILABEL); - - vnl_matrix output; output.set_size(num_points, working_fib->GetNumFibers()); - output.fill(0.0); - - for (unsigned int i=0; iGetNumFibers(); ++i) - { - vtkCell* cell = polydata->GetCell(i); - auto numPoints = cell->GetNumberOfPoints(); - vtkPoints* points = cell->GetPoints(); - - bool flip = Flip(polydata, i, ref_polydata); - - for (int j=0; jGetColor(j+1, rgb); - - double* p; - if (flip) - { - auto p_idx = numPoints - j - 1; - p = points->GetPoint(p_idx); - - working_fib->ColorSinglePoint(i, p_idx, rgb); - } - else - { - p = points->GetPoint(j); - - working_fib->ColorSinglePoint(i, j, rgb); - } - - double pixelValue = mitk::imv::GetImageValue(mitk::imv::GetItkPoint(p), true, interpolator); - output.put(j, i, pixelValue); - } - } - - return output; -} - -} - - - - diff --git a/Modules/FiberTracking/Algorithms/mitkTractometry.h b/Modules/FiberTracking/Algorithms/mitkTractometry.h deleted file mode 100644 index 3e6c64b..0000000 --- a/Modules/FiberTracking/Algorithms/mitkTractometry.h +++ /dev/null @@ -1,59 +0,0 @@ -/*=================================================================== - -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 TractometryFilter_h -#define TractometryFilter_h - -// MITK -#include -#include -#include -#include - -// ITK -#include - -// VTK -#include -#include -#include -#include -#include - -namespace mitk{ - -/** -* \brief */ - -class MITKFIBERTRACKING_EXPORT Tractometry -{ -public: - - static vnl_matrix StaticResamplingTractometry(itk::Image::Pointer itkImage, mitk::FiberBundle::Pointer fib, unsigned int num_points, mitk::FiberBundle::Pointer ref_fib); - - static std::vector> NearestCentroidPointTractometry(itk::Image::Pointer itkImage, mitk::FiberBundle::Pointer fib, unsigned int num_points, unsigned int max_centroids, float cluster_size, mitk::FiberBundle::Pointer ref_fib); - - static unsigned int EstimateNumSamplingPoints(itk::Image::Pointer ref_image, mitk::FiberBundle::Pointer fib, unsigned int voxels); - - static void ResampleIfNecessary(mitk::FiberBundle::Pointer fib, unsigned int num_points); - -protected: - - static bool Flip(vtkSmartPointer< vtkPolyData > polydata1, int i, vtkSmartPointer< vtkPolyData > ref_poly=nullptr); - -}; -} - -#endif diff --git a/Modules/FiberTracking/files.cmake b/Modules/FiberTracking/files.cmake index cc72a1f..2638cc3 100644 --- a/Modules/FiberTracking/files.cmake +++ b/Modules/FiberTracking/files.cmake @@ -1,74 +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 - Algorithms/mitkTractometry.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 - Algorithms/mitkTractometry.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 ) diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/files.cmake b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/files.cmake index 0f586c9..3c3c626 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/files.cmake +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/files.cmake @@ -1,63 +1,59 @@ set(SRC_CPP_FILES ) set(INTERNAL_CPP_FILES mitkPluginActivator.cpp QmitkFiberQuantificationView.cpp QmitkFiberProcessingView.cpp QmitkFiberClusteringView.cpp QmitkFiberFitView.cpp - QmitkTractometryView.cpp Perspectives/QmitkFiberProcessingPerspective.cpp ) set(UI_FILES src/internal/QmitkFiberQuantificationViewControls.ui src/internal/QmitkFiberProcessingViewControls.ui src/internal/QmitkFiberClusteringViewControls.ui src/internal/QmitkFiberFitViewControls.ui - src/internal/QmitkTractometryViewControls.ui ) set(MOC_H_FILES src/internal/mitkPluginActivator.h src/internal/QmitkFiberQuantificationView.h src/internal/QmitkFiberProcessingView.h src/internal/QmitkFiberClusteringView.h src/internal/QmitkFiberFitView.h - src/internal/QmitkTractometryView.h src/internal/Perspectives/QmitkFiberProcessingPerspective.h ) set(CACHED_RESOURCE_FILES plugin.xml resources/FiberBundleOperations.png resources/FiberQuantification.png resources/FiberClustering.png resources/FiberFit.png - resources/Tractometry.png resources/circle.png resources/polygon.png ) set(QRC_FILES resources/QmitkFiberprocessing.qrc ) set(CPP_FILES ) foreach(file ${SRC_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/${file}) endforeach(file ${SRC_CPP_FILES}) foreach(file ${INTERNAL_CPP_FILES}) set(CPP_FILES ${CPP_FILES} src/internal/${file}) endforeach(file ${INTERNAL_CPP_FILES}) diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/Tractometry.png b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/Tractometry.png deleted file mode 100644 index 85c6c25..0000000 Binary files a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/Tractometry.png and /dev/null differ diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/Perspectives/QmitkFiberProcessingPerspective.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/Perspectives/QmitkFiberProcessingPerspective.cpp index 038ed58..5cea14d 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/Perspectives/QmitkFiberProcessingPerspective.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/Perspectives/QmitkFiberProcessingPerspective.cpp @@ -1,52 +1,51 @@ /*=================================================================== 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 "QmitkFiberProcessingPerspective.h" #include "berryIViewLayout.h" void QmitkFiberProcessingPerspective::CreateInitialLayout(berry::IPageLayout::Pointer layout) { ///////////////////////////////////////////////////// // all di-app perspectives should have the following: ///////////////////////////////////////////////////// QString editorArea = layout->GetEditorArea(); layout->AddStandaloneViewPlaceholder("org.mitk.views.viewnavigatorview", berry::IPageLayout::LEFT, 0.3f, editorArea, false); layout->AddStandaloneView("org.mitk.views.datamanager", false, berry::IPageLayout::LEFT, 0.3f, editorArea); layout->AddStandaloneView("org.mitk.views.controlvisualizationpropertiesview", false, berry::IPageLayout::BOTTOM, .15f, "org.mitk.views.datamanager"); berry::IFolderLayout::Pointer left = layout->CreateFolder("org.mbi.diffusionimaginginternal.leftcontrols", berry::IPageLayout::BOTTOM, 0.15f, "org.mitk.views.controlvisualizationpropertiesview"); layout->AddStandaloneViewPlaceholder("org.mitk.views.imagenavigator", berry::IPageLayout::BOTTOM, .7f, "org.mbi.diffusionimaginginternal.leftcontrols", false); ///////////////////////////////////////////// // here goes the perspective specific stuff ///////////////////////////////////////////// left->AddView("org.mitk.views.fiberprocessing"); left->AddView("org.mitk.views.fiberquantification"); left->AddView("org.mitk.views.fiberclustering"); left->AddView("org.mitk.views.fiberfit"); - left->AddView("org.mitk.views.tractometry"); } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryView.cpp deleted file mode 100644 index 70a1423..0000000 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryView.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/*=================================================================== - -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 - -#include "QmitkTractometryView.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -const std::string QmitkTractometryView::VIEW_ID = "org.mitk.views.tractometry"; -using namespace mitk; - -QmitkTractometryView::QmitkTractometryView() - : QmitkAbstractView() - , m_Controls( nullptr ) - , m_Visible(false) -{ - -} - -// Destructor -QmitkTractometryView::~QmitkTractometryView() -{ - -} - -void QmitkTractometryView::CreateQtPartControl( QWidget *parent ) -{ - // build up qt view, unless already done - if ( !m_Controls ) - { - // create GUI widgets from the Qt Designer's .ui file - m_Controls = new Ui::QmitkTractometryViewControls; - m_Controls->setupUi( parent ); - - connect( m_Controls->m_MethodBox, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateGui()) ); - connect( m_Controls->m_StartButton, SIGNAL(clicked()), this, SLOT(StartTractometry()) ); - - mitk::TNodePredicateDataType::Pointer imageP = mitk::TNodePredicateDataType::New(); - mitk::NodePredicateDimension::Pointer dimP = mitk::NodePredicateDimension::New(3); - - m_Controls->m_ImageBox->SetDataStorage(this->GetDataStorage()); - m_Controls->m_ImageBox->SetPredicate(mitk::NodePredicateAnd::New(imageP, dimP)); - - m_Controls->m_ChartWidget->SetXAxisLabel("Tract position"); - m_Controls->m_ChartWidget->SetYAxisLabel("Image Value"); - - m_Controls->m_ChartWidget->SetTheme(QmitkChartWidget::ColorTheme::darkstyle); - } -} - -void QmitkTractometryView::SetFocus() -{ -} - -void QmitkTractometryView::UpdateGui() -{ - berry::IWorkbenchPart::Pointer nullPart; - OnSelectionChanged(nullPart, QList(m_CurrentSelection)); -} - -void QmitkTractometryView::StaticResamplingTractometry(mitk::Image::Pointer image, mitk::DataNode::Pointer node, std::vector > &data, std::string& clipboard_string) -{ - itk::Image::Pointer itkImage = itk::Image::New(); - CastToItkImage(image, itkImage); - - mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); - - unsigned int num_points = m_NumSamplingPoints; - mitk::FiberBundle::Pointer working_fib = fib->GetDeepCopy(); - - vnl_matrix output = mitk::Tractometry::StaticResamplingTractometry(itkImage, working_fib, num_points, m_ReferenceFib); - - std::vector< double > std_values1; - std::vector< double > std_values2; - std::vector< double > mean_values; - - for (unsigned int i=0; i(mean); - clipboard_string += " "; - clipboard_string += boost::lexical_cast(stdev); - clipboard_string += "\n"; - - mean_values.push_back(mean); - std_values1.push_back(mean + stdev); - std_values2.push_back(mean - stdev); - } - clipboard_string += "\n"; - - data.push_back(mean_values); - data.push_back(std_values1); - data.push_back(std_values2); - - if (m_Controls->m_ShowBinned->isChecked()) - { - mitk::DataNode::Pointer new_node = mitk::DataNode::New(); - new_node->SetData(working_fib); - new_node->SetName("binned_static"); - new_node->SetVisibility(true); - node->SetVisibility(false); - GetDataStorage()->Add(new_node, node); - } -} - -void QmitkTractometryView::NearestCentroidPointTractometry(mitk::Image::Pointer image, mitk::DataNode::Pointer node, std::vector< std::vector< double > >& data, std::string& clipboard_string) -{ - mitk::FiberBundle::Pointer fib = dynamic_cast(node->GetData()); - - unsigned int num_points = m_NumSamplingPoints; - - mitk::FiberBundle::Pointer working_fib = fib->GetDeepCopy(); - working_fib->ResampleSpline(1.0); - - itk::Image::Pointer itkImage = itk::Image::New(); - CastToItkImage(image, itkImage); - - auto output = mitk::Tractometry::NearestCentroidPointTractometry(itkImage, working_fib, num_points, m_Controls->m_MaxCentroids->value(), m_Controls->m_ClusterSize->value(), m_ReferenceFib); - - std::vector< double > std_values1; - std::vector< double > std_values2; - std::vector< double > mean_values; - - for (auto row : output) - { - float mean = row.mean(); - double stdev = 0; - - for (unsigned int j=0; j(mean); - clipboard_string += " "; - clipboard_string += boost::lexical_cast(stdev); - clipboard_string += "\n"; - - mean_values.push_back(mean); - std_values1.push_back(mean + stdev); - std_values2.push_back(mean - stdev); - } - clipboard_string += "\n"; - - data.push_back(mean_values); - data.push_back(std_values1); - data.push_back(std_values2); - - if (m_Controls->m_ShowBinned->isChecked()) - { - mitk::DataNode::Pointer new_node = mitk::DataNode::New(); - new_node->SetData(working_fib); - new_node->SetName("binned_centroid"); - new_node->SetVisibility(true); - node->SetVisibility(false); - GetDataStorage()->Add(new_node, node); - } -} - -void QmitkTractometryView::Activated() -{ - -} - -void QmitkTractometryView::Deactivated() -{ - -} - -void QmitkTractometryView::Visible() -{ - m_Visible = true; - QList selection = GetDataManagerSelection(); - berry::IWorkbenchPart::Pointer nullPart; - OnSelectionChanged(nullPart, selection); -} - -void QmitkTractometryView::Hidden() -{ - m_Visible = false; -} - -std::string QmitkTractometryView::RGBToHexString(double *rgb) -{ - std::ostringstream os; - for (int i = 0; i < 3; ++i) - { - os << std::setw(2) << std::setfill('0') << std::hex - << static_cast(rgb[i] * 255); - } - return os.str(); -} - -void QmitkTractometryView::StartTractometry() -{ - m_ReferenceFib = dynamic_cast(m_CurrentSelection.at(0)->GetData())->GetDeepCopy(); - - mitk::Image::Pointer image = dynamic_cast(m_Controls->m_ImageBox->GetSelectedNode()->GetData()); - - MITK_INFO << "Resanmpling reference fibers"; - if (m_Controls->m_SamplingPointsBox->value()<3) - { - typedef itk::Image ParcellationImageType; - ParcellationImageType::Pointer itkImage = ParcellationImageType::New(); - CastToItkImage(image, itkImage); - - m_NumSamplingPoints = mitk::Tractometry::EstimateNumSamplingPoints(itkImage, m_ReferenceFib, 5); - } - else - m_NumSamplingPoints = m_Controls->m_SamplingPointsBox->value(); - m_ReferenceFib->ResampleToNumPoints(m_NumSamplingPoints); - - double color[3] = {0,0,0}; - mitk::LookupTable::Pointer lookupTable = mitk::LookupTable::New(); - lookupTable->SetType(mitk::LookupTable::MULTILABEL); - - this->m_Controls->m_ChartWidget->Clear(); - std::string clipboardString = ""; - int c = 1; - for (auto node : m_CurrentSelection) - { - clipboardString += node->GetName() + "\n"; - clipboardString += "mean stdev\n"; - - std::vector< std::vector< double > > data; - switch (m_Controls->m_MethodBox->currentIndex()) - { - case 0: - { - StaticResamplingTractometry( image, node, data, clipboardString ); - break; - } - case 1: - { - NearestCentroidPointTractometry( image, node, data, clipboardString ); - break; - } - default: - { - StaticResamplingTractometry( image, node, data, clipboardString ); - } - } - - m_Controls->m_ChartWidget->AddData1D(data.at(0), node->GetName() + " Mean", QmitkChartWidget::ChartType::line); - m_Controls->m_ChartWidget->SetLineStyle(node->GetName() + " Mean", QmitkChartWidget::LineStyle::solid); - if (m_Controls->m_StDevBox->isChecked()) - { - m_Controls->m_ChartWidget->AddData1D(data.at(1), node->GetName() + " +STDEV", QmitkChartWidget::ChartType::line); - m_Controls->m_ChartWidget->AddData1D(data.at(2), node->GetName() + " -STDEV", QmitkChartWidget::ChartType::line); - m_Controls->m_ChartWidget->SetLineStyle(node->GetName() + " +STDEV", QmitkChartWidget::LineStyle::dashed); - m_Controls->m_ChartWidget->SetLineStyle(node->GetName() + " -STDEV", QmitkChartWidget::LineStyle::dashed); - } - - lookupTable->GetTableValue(c, color); - this->m_Controls->m_ChartWidget->SetColor(node->GetName() + " Mean", RGBToHexString(color)); - - if (m_Controls->m_StDevBox->isChecked()) - { - color[0] *= 0.5; - color[1] *= 0.5; - color[2] *= 0.5; - this->m_Controls->m_ChartWidget->SetColor(node->GetName() + " +STDEV", RGBToHexString(color)); - this->m_Controls->m_ChartWidget->SetColor(node->GetName() + " -STDEV", RGBToHexString(color)); - } - - this->m_Controls->m_ChartWidget->Show(true); - this->m_Controls->m_ChartWidget->SetShowDataPoints(false); - ++c; - } - - QApplication::clipboard()->setText(clipboardString.c_str(), QClipboard::Clipboard); -} - -void QmitkTractometryView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) -{ - m_Controls->m_StartButton->setEnabled(false); - - if (!m_Visible) - return; - - if (m_Controls->m_MethodBox->currentIndex()==0) - m_Controls->m_ClusterFrame->setVisible(false); - else - m_Controls->m_ClusterFrame->setVisible(true); - - m_CurrentSelection.clear(); - if(m_Controls->m_ImageBox->GetSelectedNode().IsNull()) - return; - - for (auto node: nodes) - if ( dynamic_cast(node->GetData()) ) - m_CurrentSelection.push_back(node); - if (!m_CurrentSelection.empty()) - m_Controls->m_StartButton->setEnabled(true); -} diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryView.h deleted file mode 100644 index b408767..0000000 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryView.h +++ /dev/null @@ -1,82 +0,0 @@ -/*=================================================================== - -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 QmitkTractometryView_h -#define QmitkTractometryView_h - -#include -#include "ui_QmitkTractometryViewControls.h" -#include -#include -#include -#include -#include -#include - -/*! -\brief Weight fibers by linearly fitting them to the image data. - -*/ -class QmitkTractometryView : public QmitkAbstractView, public mitk::ILifecycleAwarePart -{ - // this is needed for all Qt objects that should have a Qt meta-object - // (everything that derives from QObject and wants to have signal/slots) - Q_OBJECT - -public: - - static const std::string VIEW_ID; - - QmitkTractometryView(); - virtual ~QmitkTractometryView(); - - virtual void CreateQtPartControl(QWidget *parent) override; - - void StaticResamplingTractometry(mitk::Image::Pointer image, mitk::DataNode::Pointer node, std::vector< std::vector< double > >& data, std::string& clipboard_string); - - void NearestCentroidPointTractometry(mitk::Image::Pointer image, mitk::DataNode::Pointer node, std::vector< std::vector< double > >& data, std::string& clipboard_string); - - virtual void SetFocus() override; - - virtual void Activated() override; - virtual void Deactivated() override; - virtual void Visible() override; - virtual void Hidden() override; - -protected slots: - - void UpdateGui(); - void StartTractometry(); - -protected: - - /// \brief called by QmitkAbstractView when DataManager's selection has changed - virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; - - Ui::QmitkTractometryViewControls* m_Controls; - - std::string RGBToHexString(double *rgb); - - mitk::FiberBundle::Pointer m_ReferenceFib; - QList m_CurrentSelection; - unsigned int m_NumSamplingPoints; - bool m_Visible; -}; - - - -#endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED - diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryViewControls.ui deleted file mode 100644 index effdb61..0000000 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkTractometryViewControls.ui +++ /dev/null @@ -1,223 +0,0 @@ - - - QmitkTractometryViewControls - - - - 0 - 0 - 484 - 951 - - - - Form - - - QCommandLinkButton:disabled { - border: none; -} - -QGroupBox { - background-color: transparent; -} - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Show STDEV - - - true - - - - - - - Show binned tract - - - true - - - - - - - - 0 - 600 - - - - - - - - Centroid Options - - - - - - 1 - - - 9999 - - - 1 - - - - - - - Cluster Size: - - - - - - - Max. Number of Centroids: - - - - - - - 99999.000000000000000 - - - 99999.000000000000000 - - - - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 6 - - - - - - - - - - - - Binning Method: - - - - - - - Input Image: - - - - - - - 0 - - - - Static Resampling - - - - - Centroid Based - - - - - - - - Sampling Points: - - - - - - - 0 - - - 99999 - - - 0 - - - - - - - - - - Start Tractometry - - - - - - - - QmitkDataStorageComboBox - QComboBox -
QmitkDataStorageComboBox.h
-
- - QmitkChartWidget - QWidget -
QmitkChartWidget.h
-
-
- - -
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/mitkPluginActivator.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/mitkPluginActivator.cpp index 042b6c0..f099cc5 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/mitkPluginActivator.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/mitkPluginActivator.cpp @@ -1,51 +1,49 @@ /*=================================================================== 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 "mitkPluginActivator.h" #include "src/internal/Perspectives/QmitkFiberProcessingPerspective.h" #include "src/internal/QmitkFiberProcessingView.h" #include "src/internal/QmitkFiberQuantificationView.h" #include "src/internal/QmitkFiberClusteringView.h" #include "src/internal/QmitkFiberFitView.h" -#include "src/internal/QmitkTractometryView.h" ctkPluginContext* mitk::PluginActivator::m_Context = nullptr; ctkPluginContext* mitk::PluginActivator::GetContext() { return m_Context; } void mitk::PluginActivator::start(ctkPluginContext* context) { BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberProcessingPerspective, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberQuantificationView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberProcessingView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberClusteringView, context) BERRY_REGISTER_EXTENSION_CLASS(QmitkFiberFitView, context) - BERRY_REGISTER_EXTENSION_CLASS(QmitkTractometryView, context) m_Context = context; } void mitk::PluginActivator::stop(ctkPluginContext* context) { Q_UNUSED(context) m_Context = nullptr; } diff --git a/README.md b/README.md index 6960dd2..ee205da 100644 --- a/README.md +++ b/README.md @@ -1,255 +1,253 @@ MITK Diffusion ============== Copyright © German Cancer Research Center (DKFZ), [Division of Medical Image Computing (MIC)](https://www.dkfz.de/en/mic/index.php). Please make sure that your usage of this code is in compliance with the code [license](https://github.com/MIC-DKFZ/MITK-Diffusion/blob/master/LICENSE.txt). [![DOI](https://zenodo.org/badge/195387051.svg)](https://zenodo.org/badge/latestdoi/195387051) The MITK Diffusion application [[1,2]](#References) offers a selection of image analysis algorithms for the processing of diffusion-weighted MR images. It encompasses the research of the Division of Medical Image Computing at the German Cancer Research Center (DKFZ). * [Downloads](#Downloads) * [Requirements](#Requirements) * [Features](#Features) * [Related Links](#Related-Links) * [Image Gallery](#Image-Gallery) * [Building MITK Diffusion from source](#Building-MITK-Diffusion-from-source) * [User Manual](http://docs.mitk.org/diffusion/nightly/) * [Report a Bug](https://phabricator.mitk.org/maniphest/task/edit/form/29/) * [References](#References) * [Contact](#Contact) ## Downloads Please have a look at the [requirements](#Requirements) for running MITK Diffusion with all its features successfully! The nightly builds come as executable setup wizards that install MITK Diffusion on your system or alternatively as simple .tar.gz or .zip archive where you can execute MITK Diffusion and the command line apps "manually". Should there be no new installer for a while, please [contact](#Contact) us and report the issue. **Without Python Support (standard)**: * [Ubuntu 20.04 executable installer](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_ubuntu-20.04_NoPython.run.html) * [Ubuntu 20.04 tarball archive](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_ubuntu-20.04_NoPython.tar.gz.html) * [Windows 10 executable installer](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_Windows-10_NoPython.exe.html) * [Windows 10 zip archive](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_Windows-10_NoPython.zip.html) **With Python Support (experimental)**: * [Ubuntu 20.04 executable installer](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_ubuntu-20.04_Python.run.html) * [Ubuntu 20.04 tarball archive](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_ubuntu-20.04_Python.tar.gz.html) * [Windows 10 executable installer](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_Windows-10_Python.exe.html) * [Windows 10 zip archive](http://www.mitk.org/download/diffusion/nightly/MITK-Diffusion_Windows-10_Python.zip.html) If you encounter any bugs, please report them in our [bugtracking](https://phabricator.mitk.org/maniphest/task/edit/form/29/) system or use the [MITK-users mailing list](http://mitk.org/wiki/MITK_Mailinglist). We are grateful for any feedback! ### Requirements * Install Python 3.X: `sudo apt install python3 python3-pip` (Ubuntu) or from https://www.python.org/downloads/windows/ (Windows) * Download our Python requirements file: [PythonRequirements.txt](https://github.com/MIC-DKFZ/MITK-Diffusion/tree/master/PythonRequirements.txt) * Install the Python requirements: `pip3 install -r PythonRequirements.txt` * If your are behind a proxy use `pip3 --proxy install -r PythonRequirements.txt` **For Windows users**: MITK Diffusion requires the Microsoft Visual C++ 2017 Redistributable to be installed on the system. The MITK Diffusion installer automatically installs this redistributable for you if not already present on the system, but it needs administrative privileges to do so. So to install the redistributable, **run the MITK Diffusion installer as administrator**. ## Features **Support for most established image formats** * Images: DICOM, NIFTI, NRRD (peak and SH images compatible with MRtrix) * Tractograms: fib/vtk, tck and trk. **Image preprocessing** * Registration * Head-motion correction * Denoising * Skull stripping and brain mask segmentation (Linux only) * Resampling, cropping, flipping and merging * Header modifications * Single volume extraction **Diffusion gradient/b-value processing** * b-value rounding * Gradient direction flipping * Gradient direction subsampling * Averaging of gradient directions/volumes * Gradient direction and b-value visualization **ODF reconstruction and signal modelling** * Tensor and Q-ball reconstruction * Other reconstructions via Dipy wrapping (CSD, 3D SHORE, SFM) (Linux only) * ODF peak calculation * MRtrix or camino results can be imported **Quantification of diffusion-weighted/tensor/ODF images** * Intravoxel Incoherent Motion (IVIM) and diffusion kurtosis analysis * Calculation of many other derived indices such as ADC, MD, GFA, FA, RA, AD, RD * Image statistics **Segmentation** -* Automatic white matter bundle segmentation (TractSeg) [[3]](#References) (Linux only) * Automatic brain mask segmentation (Linux only) * Manual image segmentation and operations on segmentations -* SOON: automatic brain tissue segmentation **Fiber tractography** * Global tractography [[4]](#References) * Streamline tractography * Interactive (similar to [[5]](#References)) or seed image based * Deterministic or probabilistic * Peak, ODF, tensor and raw dMRI based. The latter one in conjunction with machine learning based tractography [[6]](#References) * Various possibilities for anatomical constraints. * Tractography priors in form of additional peak images, e.g. obtained using TractSeg **Fiber processing** * Tract dissection (parcellation or ROI based) * Tract filtering by * length * curvature * direction * weight * density * Tract resampling and compression * Tract transformation * Mirroring * Rotating and translating * Registration (apply transform of previously performed image registration) * Tract coloring * Curvature * Length * Weight * Scalar map (e.g. FA) * Other operations * Join * Subtract * Copy * Fiber clustering [[7]](#References) * Fiber fitting and weighting similar to SIFT2 and LiFE [[8,9]](#References) * Principal direction extraction (fibers --> peaks) * Tract derived images: * Tract density images * Tract endpoint images * Tract envelopes **Fiberfox dMRI simulations** [[10]](#References) * Multi-compartment signal modeling * Simulation of the k-space acquisition including * Compartment specific relaxation effects * Artifacts such as noise, spikes, ghosts, aliasing, distortions, signal drift, head motion, eddy currents and Gibbs ringing * Definition of important acquisition parameters such as bvalues and gradient directions, TE, TR, dwell time, partial Fourier, ... * Manual definition of fiber configurations, e.g. for evaluation purposes * Automatic generation of random fiber configurations **Other features** * Brain network statistics and visualization (connectomics) * Interactive Python console (Linux only) * Integrated screenshot maker * Command line tools for most functionalities ## Related Links * Great python package for logging your (MITK or other) command line experiments: * https://github.com/MIC-DKFZ/cmdint * `pip3 install cmdint` * TractSeg reference data of 72 semiautomatically defined bundles in 105 HCP subjects: https://zenodo.org/record/1285152 * TractSeg python package: https://github.com/MIC-DKFZ/TractSeg * Simulated dMRI images and ground truth of random fiber phantoms in various configurations: https://doi.org/10.5281/zenodo.2533250 * ISMRM 2015 Tractography Challenge Data: https://doi.org/10.5281/zenodo.572345 & https://doi.org/10.5281/zenodo.1007149 ## Image Gallery ![](http://mitk.org/images/8/8f/MitkDiffusion.png) Screenshot of the MITK Diffusion Welcome Screen


![](http://mitk.org/images/0/09/ScalarMaps.png) Scalar map visualization


![](http://mitk.org/images/3/3b/Data_Tensors.png) Tensor Visualization


![](http://mitk.org/images/5/5c/Data_ODF.png) ODF visualization


![](http://mitk.org/images/7/73/Data_Peaks.png) Peak visualization (uniform white coloring)


![](http://mitk.org/images/6/68/StreamlineTractography.png) Interactive tractography in MITK Diffusion. The tractogram updates automatically on parameter change and movement of the spherical seed region.


![](http://mitk.org/images/3/3a/Extraction_1.png) Tract dissection using manually drawn ROIs.


![](http://mitk.org/images/f/f5/FiberFit.png) Automatic streamline weighting (similar to SIFT2 or LiFE)


![](http://mitk.org/images/3/33/Fiberfox.png) Illustration of the dMRI phantom simulation process using Fiberfox.


\ Illustration of simulated dMRI images with various artifacts (a bit excessive for illustration purposes): eddy current distortions (1), motion and spike (2), intensity drift (3), motion, eddy and noise (4), ringing (5), B0 inhomogeneity distortions (6), from left to right.


![](http://mitk.org/images/0/08/RandomFibers_Example.png) Automatically generated random fiber configuration for Fiberfox simulations.


## Building MITK Diffusion from source * Install [Qt](https://www.qt.io/) on your system (5.12). * Clone MITK from [github](https://github.com/MIC-DKFZ/MITK-Diffusion.git) using [Git version control](https://git-scm.com/). * Clone MITK Diffusion from [github](https://github.com/MITK/MITK.git). * Configure the MITK Superbuild using [CMake](https://cmake.org/) (>= 3.18). * Choose the MITK source code directory and an empty binary directory. * Click "Configure". * Set the option MITK_EXTENSION_DIRS to "/path/to/my/mitk-diffusion-repository". * Click "Configure". * Set the option MITK_BUILD_CONFIGURATION to "DiffusionRelease". * Click "Generate". * macOS specifics (unclear if this still applies): * Use python 3.**6**, since python 3.**7** leads to build errors on macOS. * The cmake variables for python 3 might need to be set manually. It is probably enough to specify PYTHON_EXECUTABLE. * Openmp needs to be installed manually since it is not included in apple clang anymore: "brew install libomp" should do the trick. It might be necessary to set the corresponding make variables later in the MITK build manually: * OpenMP_CXX_FLAGS: -Xpreprocessor -fopenmp -I"/path/to/python3/includes/" * OpenMP_C_FLAGS: -Xpreprocessor -fopenmp -I"/path/to/python3/includes/" * OpenMPCXX_LIB_NAMES: libomp * OpenMPC_LIB_NAMES: libomp * OpenMP_libomp_LIBRARY: /path/to/libomp.dylib * Start the Superbuild: * Linux/maxOS: Open a console window, navigate to the build folder and type "make -j8" (optionally supply the number threads to be used for a parallel build with -j). * Windows (requires visual studio): Open the MITK Superbuild solution file and build all projects. * The Superbuild may take some time. * After the Superbuild has finished, change the cmake binary directory from "/path/to/my/build" to "/path/to/my/build/MITK-build" and configure+generate again. * Build again in "/path/to/my/build/MITK-build" using make (linux/mac) or the VS solution file. * The build may again take some time and should yield the binaries in "/path/to/my/build/MITK-build/bin" More detailed build instructions can be found in the [documentation](http://docs.mitk.org/nightly/BuildInstructionsPage.html). Continuous integration: https://cdash.mitk.org/index.php?project=MITK-Diffusion ## References All publications of the Division of Medical Image Computing can be found [https://www.dkfz.de/en/mic/publications/ here]. [1] Fritzsche, Klaus H., Peter F. Neher, Ignaz Reicht, Thomas van Bruggen, Caspar Goch, Marco Reisert, Marco Nolden, et al. “MITK Diffusion Imaging.” Methods of Information in Medicine 51, no. 5 (2012): 441. [2] Fritzsche, K., and H.-P. Meinzer. “MITK-DI A New Diffusion Imaging Component for MITK.” In Bildverarbeitung Für Die Medizin, n.d. [3] Wasserthal, Jakob, Peter Neher, and Klaus H. Maier-Hein. “TractSeg - Fast and Accurate White Matter Tract Segmentation.” NeuroImage 183 (August 4, 2018): 239–53. [4] Neher, P. F., B. Stieltjes, M. Reisert, I. Reicht, H.P. Meinzer, and K. Maier-Hein. “MITK Global Tractography.” In SPIE Medical Imaging: Image Processing, 2012. [5] Chamberland, M., K. Whittingstall, D. Fortin, D. Mathieu, und M. Descoteaux. „Real-time multi-peak tractography for instantaneous connectivity display“. Front Neuroinform 8 (2014): 59. doi:10.3389/fninf.2014.00059. [6] Neher, Peter F., Marc-Alexandre Côté, Jean-Christophe Houde, Maxime Descoteaux, and Klaus H. Maier-Hein. “Fiber Tractography Using Machine Learning.” NeuroImage. Accessed July 17, 2017. doi:10.1016/j.neuroimage.2017.07.028. [7] Garyfallidis, Eleftherios, Matthew Brett, Marta Morgado Correia, Guy B. Williams, and Ian Nimmo-Smith. “QuickBundles, a Method for Tractography Simplification.” Frontiers in Neuroscience 6 (2012). [8] Smith, Robert E., Jacques-Donald Tournier, Fernando Calamante, and Alan Connelly. “SIFT2: Enabling Dense Quantitative Assessment of Brain White Matter Connectivity Using Streamlines Tractography.” NeuroImage 119, no. Supplement C (October 1, 2015): 338–51. [9] Pestilli, Franco, Jason D. Yeatman, Ariel Rokem, Kendrick N. Kay, and Brian A. Wandell. “Evaluation and Statistical Inference for Human Connectomes.” Nature Methods 11, no. 10 (October 2014): 1058–63. [10] Neher, Peter F., Frederik B. Laun, Bram Stieltjes, and Klaus H. Maier-Hein. “Fiberfox: Facilitating the Creation of Realistic White Matter Software Phantoms.” Magnetic Resonance in Medicine 72, no. 5 (November 2014): 1460–70. doi:10.1002/mrm.25045. ## Contact If you have questions about the application or if you would like to give us feedback, don't hesitate to contact us using [our mailing list](http://mitk.org/wiki/MITK_Mailinglist) or, for questions that are of no interest for the community, [directly](https://www.dkfz.de/en/mic/team/people/Peter_Neher.html).