diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/files.cmake b/Plugins/org.mitk.gui.qt.diffusionimaging/files.cmake
index 11da03d696..6de80da70a 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/files.cmake
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/files.cmake
@@ -1,166 +1,151 @@
set(SRC_CPP_FILES
QmitkODFDetailsWidget.cpp
QmitkODFRenderWidget.cpp
QmitkPartialVolumeAnalysisWidget.cpp
QmitkIVIMWidget.cpp
QmitkTbssRoiAnalysisWidget.cpp
QmitkResidualAnalysisWidget.cpp
QmitkResidualViewWidget.cpp
- QmitkTensorModelParametersWidget.cpp
- QmitkZeppelinModelParametersWidget.cpp
- QmitkStickModelParametersWidget.cpp
- QmitkDotModelParametersWidget.cpp
- QmitkBallModelParametersWidget.cpp
- QmitkAstrosticksModelParametersWidget.cpp
)
set(INTERNAL_CPP_FILES
mitkPluginActivator.cpp
QmitkQBallReconstructionView.cpp
QmitkPreprocessingView.cpp
QmitkDiffusionDicomImportView.cpp
QmitkDiffusionQuantificationView.cpp
QmitkTensorReconstructionView.cpp
QmitkDiffusionImagingPublicPerspective.cpp
QmitkControlVisualizationPropertiesView.cpp
QmitkODFDetailsView.cpp
QmitkGibbsTrackingView.cpp
QmitkStochasticFiberTrackingView.cpp
QmitkStreamlineTrackingView.cpp
QmitkFiberProcessingView.cpp
QmitkFiberBundleDeveloperView.cpp
QmitkPartialVolumeAnalysisView.cpp
QmitkIVIMView.cpp
QmitkTractbasedSpatialStatisticsView.cpp
QmitkTbssTableModel.cpp
QmitkTbssMetaTableModel.cpp
QmitkTbssSkeletonizationView.cpp
Connectomics/QmitkConnectomicsDataView.cpp
Connectomics/QmitkConnectomicsNetworkOperationsView.cpp
Connectomics/QmitkConnectomicsStatisticsView.cpp
Connectomics/QmitkNetworkHistogramCanvas.cpp
QmitkDwiSoftwarePhantomView.cpp
QmitkOdfMaximaExtractionView.cpp
QmitkFiberfoxView.cpp
+ QmitkFiberExtractionView.cpp
)
set(UI_FILES
src/internal/QmitkQBallReconstructionViewControls.ui
src/internal/QmitkPreprocessingViewControls.ui
src/internal/QmitkDiffusionDicomImportViewControls.ui
src/internal/QmitkDiffusionQuantificationViewControls.ui
src/internal/QmitkTensorReconstructionViewControls.ui
src/internal/QmitkControlVisualizationPropertiesViewControls.ui
src/internal/QmitkODFDetailsViewControls.ui
src/internal/QmitkGibbsTrackingViewControls.ui
src/internal/QmitkStochasticFiberTrackingViewControls.ui
src/internal/QmitkStreamlineTrackingViewControls.ui
src/internal/QmitkFiberProcessingViewControls.ui
src/internal/QmitkFiberBundleDeveloperViewControls.ui
src/internal/QmitkPartialVolumeAnalysisViewControls.ui
src/internal/QmitkIVIMViewControls.ui
src/internal/QmitkTractbasedSpatialStatisticsViewControls.ui
src/internal/QmitkTbssSkeletonizationViewControls.ui
src/internal/Connectomics/QmitkConnectomicsDataViewControls.ui
src/internal/Connectomics/QmitkConnectomicsNetworkOperationsViewControls.ui
src/internal/Connectomics/QmitkConnectomicsStatisticsViewControls.ui
src/internal/QmitkDwiSoftwarePhantomViewControls.ui
src/internal/QmitkOdfMaximaExtractionViewControls.ui
src/internal/QmitkFiberfoxViewControls.ui
- src/QmitkTensorModelParametersWidgetControls.ui
- src/QmitkZeppelinModelParametersWidgetControls.ui
- src/QmitkStickModelParametersWidgetControls.ui
- src/QmitkDotModelParametersWidgetControls.ui
- src/QmitkBallModelParametersWidgetControls.ui
- src/QmitkAstrosticksModelParametersWidgetControls.ui
+ src/internal/QmitkFiberExtractionViewControls.ui
)
set(MOC_H_FILES
src/internal/mitkPluginActivator.h
src/internal/QmitkQBallReconstructionView.h
src/internal/QmitkPreprocessingView.h
src/internal/QmitkDiffusionDicomImportView.h
src/internal/QmitkDiffusionImagingPublicPerspective.h
src/internal/QmitkDiffusionQuantificationView.h
src/internal/QmitkTensorReconstructionView.h
src/internal/QmitkControlVisualizationPropertiesView.h
src/internal/QmitkODFDetailsView.h
src/QmitkODFRenderWidget.h
src/QmitkODFDetailsWidget.h
src/internal/QmitkGibbsTrackingView.h
src/internal/QmitkStochasticFiberTrackingView.h
src/internal/QmitkStreamlineTrackingView.h
src/internal/QmitkFiberProcessingView.h
src/internal/QmitkFiberBundleDeveloperView.h
src/internal/QmitkPartialVolumeAnalysisView.h
src/QmitkPartialVolumeAnalysisWidget.h
src/internal/QmitkIVIMView.h
src/internal/QmitkTractbasedSpatialStatisticsView.h
src/internal/QmitkTbssSkeletonizationView.h
src/QmitkTbssRoiAnalysisWidget.h
src/QmitkResidualAnalysisWidget.h
src/QmitkResidualViewWidget.h
src/internal/Connectomics/QmitkConnectomicsDataView.h
src/internal/Connectomics/QmitkConnectomicsNetworkOperationsView.h
src/internal/Connectomics/QmitkConnectomicsStatisticsView.h
src/internal/Connectomics/QmitkNetworkHistogramCanvas.h
src/internal/QmitkDwiSoftwarePhantomView.h
src/internal/QmitkOdfMaximaExtractionView.h
src/internal/QmitkFiberfoxView.h
- src/QmitkTensorModelParametersWidget.h
- src/QmitkZeppelinModelParametersWidget.h
- src/QmitkStickModelParametersWidget.h
- src/QmitkDotModelParametersWidget.h
- src/QmitkBallModelParametersWidget.h
- src/QmitkAstrosticksModelParametersWidget.h
+ src/internal/QmitkFiberExtractionView.h
)
set(CACHED_RESOURCE_FILES
# list of resource files which can be used by the plug-in
# system without loading the plug-ins shared library,
# for example the icon used in the menu and tabs for the
# plug-in views in the workbench
plugin.xml
resources/preprocessing.png
resources/dwiimport.png
resources/quantification.png
resources/reconodf.png
resources/recontensor.png
resources/vizControls.png
resources/OdfDetails.png
resources/GibbsTracking.png
resources/FiberBundleOperations.png
resources/PartialVolumeAnalysis_24.png
resources/IVIM_48.png
resources/stochFB.png
resources/tbss.png
resources/connectomics/QmitkConnectomicsDataViewIcon_48.png
resources/connectomics/QmitkConnectomicsNetworkOperationsViewIcon_48.png
resources/connectomics/QmitkConnectomicsStatisticsViewIcon_48.png
resources/arrow.png
resources/qball_peaks.png
resources/phantom.png
resources/tensor.png
resources/qball.png
resources/StreamlineTracking.png
resources/dwi2.png
resources/refresh.xpm
)
set(QRC_FILES
# uncomment the following line if you want to use Qt resources
resources/QmitkDiffusionImaging.qrc
#resources/QmitkTractbasedSpatialStatisticsView.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/plugin.xml b/Plugins/org.mitk.gui.qt.diffusionimaging/plugin.xml
index 28045e4f00..662563552d 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/plugin.xml
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/plugin.xml
@@ -1,167 +1,167 @@
+
+
+
+
-
-
-
-
+ icon="resources/phantom.png" />
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionView.cpp
similarity index 76%
copy from Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.cpp
copy to Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionView.cpp
index dfa9bd2b38..a5bb63977c 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.cpp
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionView.cpp
@@ -1,1703 +1,1352 @@
/*===================================================================
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.
===================================================================*/
// Blueberry
#include
#include
// Qmitk
-#include "QmitkFiberProcessingView.h"
+#include "QmitkFiberExtractionView.h"
#include
// Qt
#include
// MITK
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// ITK
#include
#include
#include
#include
#include
#include
#include
#include
-const std::string QmitkFiberProcessingView::VIEW_ID = "org.mitk.views.fiberprocessing";
+const std::string QmitkFiberExtractionView::VIEW_ID = "org.mitk.views.fiberextraction";
const std::string id_DataManager = "org.mitk.views.datamanager";
using namespace mitk;
-QmitkFiberProcessingView::QmitkFiberProcessingView()
+QmitkFiberExtractionView::QmitkFiberExtractionView()
: QmitkFunctionality()
, m_Controls( 0 )
, m_MultiWidget( NULL )
, m_CircleCounter(0)
, m_PolygonCounter(0)
, m_UpsamplingFactor(5)
{
}
// Destructor
-QmitkFiberProcessingView::~QmitkFiberProcessingView()
+QmitkFiberExtractionView::~QmitkFiberExtractionView()
{
}
-void QmitkFiberProcessingView::CreateQtPartControl( QWidget *parent )
+void QmitkFiberExtractionView::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::QmitkFiberProcessingViewControls;
+ m_Controls = new Ui::QmitkFiberExtractionViewControls;
m_Controls->setupUi( parent );
m_Controls->doExtractFibersButton->setDisabled(true);
m_Controls->PFCompoANDButton->setDisabled(true);
m_Controls->PFCompoORButton->setDisabled(true);
m_Controls->PFCompoNOTButton->setDisabled(true);
m_Controls->m_PlanarFigureButtonsFrame->setEnabled(false);
m_Controls->m_RectangleButton->setVisible(false);
- connect( m_Controls->doExtractFibersButton, SIGNAL(clicked()), this, SLOT(DoFiberExtraction()) );
connect( m_Controls->m_CircleButton, SIGNAL( clicked() ), this, SLOT( OnDrawCircle() ) );
connect( m_Controls->m_PolygonButton, SIGNAL( clicked() ), this, SLOT( OnDrawPolygon() ) );
connect(m_Controls->PFCompoANDButton, SIGNAL(clicked()), this, SLOT(GenerateAndComposite()) );
connect(m_Controls->PFCompoORButton, SIGNAL(clicked()), this, SLOT(GenerateOrComposite()) );
connect(m_Controls->PFCompoNOTButton, SIGNAL(clicked()), this, SLOT(GenerateNotComposite()) );
connect(m_Controls->m_JoinBundles, SIGNAL(clicked()), this, SLOT(JoinBundles()) );
connect(m_Controls->m_SubstractBundles, SIGNAL(clicked()), this, SLOT(SubstractBundles()) );
connect(m_Controls->m_GenerateRoiImage, SIGNAL(clicked()), this, SLOT(GenerateRoiImage()) );
- connect(m_Controls->m_Extract3dButton, SIGNAL(clicked()), this, SLOT(Extract3d()));
- connect( m_Controls->m_ProcessFiberBundleButton, SIGNAL(clicked()), this, SLOT(ProcessSelectedBundles()) );
- connect( m_Controls->m_ResampleFibersButton, SIGNAL(clicked()), this, SLOT(ResampleSelectedBundles()) );
- connect(m_Controls->m_FaColorFibersButton, SIGNAL(clicked()), this, SLOT(DoImageColorCoding()));
- connect( m_Controls->m_PruneFibersButton, SIGNAL(clicked()), this, SLOT(PruneBundle()) );
- connect( m_Controls->m_CurvatureThresholdButton, SIGNAL(clicked()), this, SLOT(ApplyCurvatureThreshold()) );
- connect( m_Controls->m_MirrorFibersButton, SIGNAL(clicked()), this, SLOT(MirrorFibers()) );
-
- connect( m_Controls->m_ExtractMask, SIGNAL(clicked()), this, SLOT(ExtractMask()) );
+
+ connect(m_Controls->m_Extract3dButton, SIGNAL(clicked()), this, SLOT(ExtractPassingMask()));
+ connect( m_Controls->m_ExtractMask, SIGNAL(clicked()), this, SLOT(ExtractEndingInMask()) );
+ connect( m_Controls->doExtractFibersButton, SIGNAL(clicked()), this, SLOT(DoFiberExtraction()) );
}
}
-void QmitkFiberProcessingView::ExtractMask()
+void QmitkFiberExtractionView::ExtractEndingInMask()
{
if (m_MaskImageNode.IsNull())
return;
mitk::Image::Pointer mitkMask = dynamic_cast(m_MaskImageNode->GetData());
for (int i=0; i(m_SelectedFB.at(i)->GetData());
QString name(m_SelectedFB.at(i)->GetName().c_str());
itkUCharImageType::Pointer mask = itkUCharImageType::New();
mitk::CastToItkImage(mitkMask, mask);
mitk::FiberBundleX::Pointer newFib = fib->ExtractFiberSubset(mask, false);
DataNode::Pointer newNode = DataNode::New();
newNode->SetData(newFib);
name += "_ending-in-mask";
newNode->SetName(name.toStdString());
GetDefaultDataStorage()->Add(newNode);
}
}
-void QmitkFiberProcessingView::Extract3d()
+void QmitkFiberExtractionView::ExtractPassingMask()
{
if (m_MaskImageNode.IsNull())
return;
mitk::Image::Pointer mitkMask = dynamic_cast(m_MaskImageNode->GetData());
for (int i=0; i(m_SelectedFB.at(i)->GetData());
QString name(m_SelectedFB.at(i)->GetName().c_str());
itkUCharImageType::Pointer mask = itkUCharImageType::New();
mitk::CastToItkImage(mitkMask, mask);
mitk::FiberBundleX::Pointer newFib = fib->ExtractFiberSubset(mask, true);
DataNode::Pointer newNode = DataNode::New();
newNode->SetData(newFib);
name += "_passing-mask";
newNode->SetName(name.toStdString());
GetDefaultDataStorage()->Add(newNode);
}
}
-void QmitkFiberProcessingView::GenerateRoiImage(){
+void QmitkFiberExtractionView::GenerateRoiImage(){
if (m_SelectedPF.empty())
return;
mitk::Geometry3D::Pointer geometry;
if (!m_SelectedFB.empty())
{
mitk::FiberBundleX::Pointer fib = dynamic_cast(m_SelectedFB.front()->GetData());
geometry = fib->GetGeometry();
}
else
return;
mitk::Vector3D spacing = geometry->GetSpacing();
spacing /= m_UpsamplingFactor;
mitk::Point3D newOrigin = geometry->GetOrigin();
mitk::Geometry3D::BoundsArrayType bounds = geometry->GetBounds();
newOrigin[0] += bounds.GetElement(0);
newOrigin[1] += bounds.GetElement(2);
newOrigin[2] += bounds.GetElement(4);
itk::Matrix direction;
itk::ImageRegion<3> imageRegion;
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
direction[j][i] = geometry->GetMatrixColumn(i)[j]/spacing[j];
imageRegion.SetSize(0, geometry->GetExtent(0)*m_UpsamplingFactor);
imageRegion.SetSize(1, geometry->GetExtent(1)*m_UpsamplingFactor);
imageRegion.SetSize(2, geometry->GetExtent(2)*m_UpsamplingFactor);
m_PlanarFigureImage = itkUCharImageType::New();
m_PlanarFigureImage->SetSpacing( spacing ); // Set the image spacing
m_PlanarFigureImage->SetOrigin( newOrigin ); // Set the image origin
m_PlanarFigureImage->SetDirection( direction ); // Set the image direction
m_PlanarFigureImage->SetRegions( imageRegion );
m_PlanarFigureImage->Allocate();
m_PlanarFigureImage->FillBuffer( 0 );
Image::Pointer tmpImage = Image::New();
tmpImage->InitializeByItk(m_PlanarFigureImage.GetPointer());
tmpImage->SetVolume(m_PlanarFigureImage->GetBufferPointer());
for (int i=0; iInitializeByItk(m_PlanarFigureImage.GetPointer());
tmpImage->SetVolume(m_PlanarFigureImage->GetBufferPointer());
node->SetData(tmpImage);
node->SetName("ROI Image");
this->GetDefaultDataStorage()->Add(node);
}
-void QmitkFiberProcessingView::CompositeExtraction(mitk::DataNode::Pointer node, mitk::Image* image)
+void QmitkFiberExtractionView::CompositeExtraction(mitk::DataNode::Pointer node, mitk::Image* image)
{
if (dynamic_cast(node.GetPointer()->GetData()) && !dynamic_cast(node.GetPointer()->GetData()))
{
m_PlanarFigure = dynamic_cast(node.GetPointer()->GetData());
AccessFixedDimensionByItk_2(
image,
InternalReorientImagePlane, 3,
m_PlanarFigure->GetGeometry(), -1);
- // itk::Image< unsigned char, 3 >::Pointer outimage = itk::Image< unsigned char, 3 >::New();
-
- // outimage->SetSpacing( m_PlanarFigure->GetGeometry()->GetSpacing()/m_UpsamplingFactor ); // Set the image spacing
-
- // mitk::Point3D origin = m_PlanarFigure->GetGeometry()->GetOrigin();
- // mitk::Point3D indexOrigin;
- // m_PlanarFigure->GetGeometry()->WorldToIndex(origin, indexOrigin);
- // indexOrigin[0] = indexOrigin[0] - .5 * (1.0-1.0/m_UpsamplingFactor);
- // indexOrigin[1] = indexOrigin[1] - .5 * (1.0-1.0/m_UpsamplingFactor);
- // indexOrigin[2] = indexOrigin[2] - .5 * (1.0-1.0/m_UpsamplingFactor);
- // mitk::Point3D newOrigin;
- // m_PlanarFigure->GetGeometry()->IndexToWorld(indexOrigin, newOrigin);
-
- // outimage->SetOrigin( newOrigin ); // Set the image origin
- // itk::Matrix matrix;
- // for (int i=0; i<3; i++)
- // for (int j=0; j<3; j++)
- // matrix[j][i] = m_PlanarFigure->GetGeometry()->GetMatrixColumn(i)[j]/m_PlanarFigure->GetGeometry()->GetSpacing().GetElement(i);
- // outimage->SetDirection( matrix ); // Set the image direction
-
- // itk::ImageRegion<3> upsampledRegion;
- // upsampledRegion.SetSize(0, m_PlanarFigure->GetGeometry()->GetParametricExtentInMM(0)/m_PlanarFigure->GetGeometry()->GetSpacing()[0]);
- // upsampledRegion.SetSize(1, m_PlanarFigure->GetGeometry()->GetParametricExtentInMM(1)/m_PlanarFigure->GetGeometry()->GetSpacing()[1]);
- // upsampledRegion.SetSize(2, 1);
-
- // typename itk::Image< unsigned char, 3 >::RegionType::SizeType upsampledSize = upsampledRegion.GetSize();
- // for (unsigned int n = 0; n < 2; n++)
- // {
- // upsampledSize[n] = upsampledSize[n] * m_UpsamplingFactor;
- // }
- // upsampledRegion.SetSize( upsampledSize );
- // outimage->SetRegions( upsampledRegion );
-
- // outimage->Allocate();
-
- // this->m_InternalImage = mitk::Image::New();
- // this->m_InternalImage->InitializeByItk( outimage.GetPointer() );
- // this->m_InternalImage->SetVolume( outimage->GetBufferPointer() );
-
AccessFixedDimensionByItk_2(
m_InternalImage,
InternalCalculateMaskFromPlanarFigure,
3, 2, node->GetName() );
}
}
template < typename TPixel, unsigned int VImageDimension >
-void QmitkFiberProcessingView::InternalReorientImagePlane(
- const itk::Image< TPixel, VImageDimension > *image, mitk::Geometry3D* planegeo3D, int additionalIndex )
+void QmitkFiberExtractionView::InternalReorientImagePlane( const itk::Image< TPixel, VImageDimension > *image, mitk::Geometry3D* planegeo3D, int additionalIndex )
{
MITK_DEBUG << "InternalReorientImagePlane() start";
typedef itk::Image< TPixel, VImageDimension > ImageType;
typedef itk::Image< float, VImageDimension > FloatImageType;
typedef itk::ResampleImageFilter ResamplerType;
typename ResamplerType::Pointer resampler = ResamplerType::New();
mitk::PlaneGeometry* planegeo = dynamic_cast(planegeo3D);
float upsamp = m_UpsamplingFactor;
float gausssigma = 0.5;
// Spacing
typename ResamplerType::SpacingType spacing = planegeo->GetSpacing();
spacing[0] = image->GetSpacing()[0] / upsamp;
spacing[1] = image->GetSpacing()[1] / upsamp;
spacing[2] = image->GetSpacing()[2];
resampler->SetOutputSpacing( spacing );
// Size
typename ResamplerType::SizeType size;
size[0] = planegeo->GetParametricExtentInMM(0) / spacing[0];
size[1] = planegeo->GetParametricExtentInMM(1) / spacing[1];
size[2] = 1;
resampler->SetSize( size );
// Origin
typename mitk::Point3D orig = planegeo->GetOrigin();
typename mitk::Point3D corrorig;
planegeo3D->WorldToIndex(orig,corrorig);
corrorig[0] += 0.5/upsamp;
corrorig[1] += 0.5/upsamp;
corrorig[2] += 0;
planegeo3D->IndexToWorld(corrorig,corrorig);
resampler->SetOutputOrigin(corrorig );
// Direction
typename ResamplerType::DirectionType direction;
typename mitk::AffineTransform3D::MatrixType matrix = planegeo->GetIndexToWorldTransform()->GetMatrix();
for(int c=0; cSetOutputDirection( direction );
// Gaussian interpolation
if(gausssigma != 0)
{
double sigma[3];
for( unsigned int d = 0; d < 3; d++ )
{
sigma[d] = gausssigma * image->GetSpacing()[d];
}
double alpha = 2.0;
typedef itk::GaussianInterpolateImageFunction
GaussianInterpolatorType;
typename GaussianInterpolatorType::Pointer interpolator
= GaussianInterpolatorType::New();
interpolator->SetInputImage( image );
interpolator->SetParameters( sigma, alpha );
resampler->SetInterpolator( interpolator );
}
else
{
// typedef typename itk::BSplineInterpolateImageFunction
// InterpolatorType;
typedef typename itk::LinearInterpolateImageFunction InterpolatorType;
typename InterpolatorType::Pointer interpolator
= InterpolatorType::New();
interpolator->SetInputImage( image );
resampler->SetInterpolator( interpolator );
}
// Other resampling options
resampler->SetInput( image );
resampler->SetDefaultPixelValue(0);
MITK_DEBUG << "Resampling requested image plane ... ";
resampler->Update();
MITK_DEBUG << " ... done";
if(additionalIndex < 0)
{
this->m_InternalImage = mitk::Image::New();
this->m_InternalImage->InitializeByItk( resampler->GetOutput() );
this->m_InternalImage->SetVolume( resampler->GetOutput()->GetBufferPointer() );
}
}
template < typename TPixel, unsigned int VImageDimension >
-void QmitkFiberProcessingView::InternalCalculateMaskFromPlanarFigure(
- itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName )
+void QmitkFiberExtractionView::InternalCalculateMaskFromPlanarFigure( itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName )
{
MITK_DEBUG << "InternalCalculateMaskFromPlanarFigure() start";
typedef itk::Image< TPixel, VImageDimension > ImageType;
typedef itk::CastImageFilter< ImageType, itkUCharImageType > CastFilterType;
// Generate mask image as new image with same header as input image and
// initialize with "1".
itkUCharImageType::Pointer newMaskImage = itkUCharImageType::New();
newMaskImage->SetSpacing( image->GetSpacing() ); // Set the image spacing
newMaskImage->SetOrigin( image->GetOrigin() ); // Set the image origin
newMaskImage->SetDirection( image->GetDirection() ); // Set the image direction
newMaskImage->SetRegions( image->GetLargestPossibleRegion() );
newMaskImage->Allocate();
newMaskImage->FillBuffer( 1 );
// Generate VTK polygon from (closed) PlanarFigure polyline
// (The polyline points are shifted by -0.5 in z-direction to make sure
// that the extrusion filter, which afterwards elevates all points by +0.5
// in z-direction, creates a 3D object which is cut by the the plane z=0)
const Geometry2D *planarFigureGeometry2D = m_PlanarFigure->GetGeometry2D();
const PlanarFigure::PolyLineType planarFigurePolyline = m_PlanarFigure->GetPolyLine( 0 );
const Geometry3D *imageGeometry3D = m_InternalImage->GetGeometry( 0 );
vtkPolyData *polyline = vtkPolyData::New();
polyline->Allocate( 1, 1 );
// Determine x- and y-dimensions depending on principal axis
int i0, i1;
switch ( axis )
{
case 0:
i0 = 1;
i1 = 2;
break;
case 1:
i0 = 0;
i1 = 2;
break;
case 2:
default:
i0 = 0;
i1 = 1;
break;
}
// Create VTK polydata object of polyline contour
vtkPoints *points = vtkPoints::New();
PlanarFigure::PolyLineType::const_iterator it;
std::vector indices;
unsigned int numberOfPoints = 0;
for ( it = planarFigurePolyline.begin();
it != planarFigurePolyline.end();
++it )
{
Point3D point3D;
// Convert 2D point back to the local index coordinates of the selected
// image
Point2D point2D = it->Point;
planarFigureGeometry2D->WorldToIndex(point2D, point2D);
point2D[0] -= 0.5/m_UpsamplingFactor;
point2D[1] -= 0.5/m_UpsamplingFactor;
planarFigureGeometry2D->IndexToWorld(point2D, point2D);
planarFigureGeometry2D->Map( point2D, point3D );
// Polygons (partially) outside of the image bounds can not be processed
// further due to a bug in vtkPolyDataToImageStencil
if ( !imageGeometry3D->IsInside( point3D ) )
{
float bounds[2] = {0,0};
bounds[0] =
this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i0);
bounds[1] =
this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i1);
imageGeometry3D->WorldToIndex( point3D, point3D );
// if (point3D[i0]<0)
// point3D[i0] = 0.5;
// else if (point3D[i0]>bounds[0])
// point3D[i0] = bounds[0]-0.5;
// if (point3D[i1]<0)
// point3D[i1] = 0.5;
// else if (point3D[i1]>bounds[1])
// point3D[i1] = bounds[1]-0.5;
if (point3D[i0]<0)
point3D[i0] = 0.0;
else if (point3D[i0]>bounds[0])
point3D[i0] = bounds[0]-0.001;
if (point3D[i1]<0)
point3D[i1] = 0.0;
else if (point3D[i1]>bounds[1])
point3D[i1] = bounds[1]-0.001;
points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 );
numberOfPoints++;
}
else
{
imageGeometry3D->WorldToIndex( point3D, point3D );
// Add point to polyline array
points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 );
numberOfPoints++;
}
}
polyline->SetPoints( points );
points->Delete();
vtkIdType *ptIds = new vtkIdType[numberOfPoints];
for ( vtkIdType i = 0; i < numberOfPoints; ++i )
{
ptIds[i] = i;
}
polyline->InsertNextCell( VTK_POLY_LINE, numberOfPoints, ptIds );
// Extrude the generated contour polygon
vtkLinearExtrusionFilter *extrudeFilter = vtkLinearExtrusionFilter::New();
extrudeFilter->SetInput( polyline );
extrudeFilter->SetScaleFactor( 1 );
extrudeFilter->SetExtrusionTypeToNormalExtrusion();
extrudeFilter->SetVector( 0.0, 0.0, 1.0 );
// Make a stencil from the extruded polygon
vtkPolyDataToImageStencil *polyDataToImageStencil = vtkPolyDataToImageStencil::New();
polyDataToImageStencil->SetInput( extrudeFilter->GetOutput() );
// Export from ITK to VTK (to use a VTK filter)
typedef itk::VTKImageImport< itkUCharImageType > ImageImportType;
typedef itk::VTKImageExport< itkUCharImageType > ImageExportType;
typename ImageExportType::Pointer itkExporter = ImageExportType::New();
itkExporter->SetInput( newMaskImage );
vtkImageImport *vtkImporter = vtkImageImport::New();
this->ConnectPipelines( itkExporter, vtkImporter );
vtkImporter->Update();
// Apply the generated image stencil to the input image
vtkImageStencil *imageStencilFilter = vtkImageStencil::New();
imageStencilFilter->SetInputConnection( vtkImporter->GetOutputPort() );
imageStencilFilter->SetStencil( polyDataToImageStencil->GetOutput() );
imageStencilFilter->ReverseStencilOff();
imageStencilFilter->SetBackgroundValue( 0 );
imageStencilFilter->Update();
// Export from VTK back to ITK
vtkImageExport *vtkExporter = vtkImageExport::New();
vtkExporter->SetInputConnection( imageStencilFilter->GetOutputPort() );
vtkExporter->Update();
typename ImageImportType::Pointer itkImporter = ImageImportType::New();
this->ConnectPipelines( vtkExporter, itkImporter );
itkImporter->Update();
// calculate cropping bounding box
m_InternalImageMask3D = itkImporter->GetOutput();
m_InternalImageMask3D->SetDirection(image->GetDirection());
itk::ImageRegionConstIterator
itmask(m_InternalImageMask3D, m_InternalImageMask3D->GetLargestPossibleRegion());
itk::ImageRegionIterator
itimage(image, image->GetLargestPossibleRegion());
itmask = itmask.Begin();
itimage = itimage.Begin();
typename ImageType::SizeType lowersize = {{9999999999,9999999999,9999999999}};
typename ImageType::SizeType uppersize = {{0,0,0}};
while( !itmask.IsAtEnd() )
{
if(itmask.Get() == 0)
{
itimage.Set(0);
}
else
{
typename ImageType::IndexType index = itimage.GetIndex();
typename ImageType::SizeType signedindex;
signedindex[0] = index[0];
signedindex[1] = index[1];
signedindex[2] = index[2];
lowersize[0] = signedindex[0] < lowersize[0] ? signedindex[0] : lowersize[0];
lowersize[1] = signedindex[1] < lowersize[1] ? signedindex[1] : lowersize[1];
lowersize[2] = signedindex[2] < lowersize[2] ? signedindex[2] : lowersize[2];
uppersize[0] = signedindex[0] > uppersize[0] ? signedindex[0] : uppersize[0];
uppersize[1] = signedindex[1] > uppersize[1] ? signedindex[1] : uppersize[1];
uppersize[2] = signedindex[2] > uppersize[2] ? signedindex[2] : uppersize[2];
}
++itmask;
++itimage;
}
typename ImageType::IndexType index;
index[0] = lowersize[0];
index[1] = lowersize[1];
index[2] = lowersize[2];
typename ImageType::SizeType size;
size[0] = uppersize[0] - lowersize[0] + 1;
size[1] = uppersize[1] - lowersize[1] + 1;
size[2] = uppersize[2] - lowersize[2] + 1;
itk::ImageRegion<3> cropRegion = itk::ImageRegion<3>(index, size);
// crop internal mask
typedef itk::RegionOfInterestImageFilter< itkUCharImageType, itkUCharImageType > ROIMaskFilterType;
typename ROIMaskFilterType::Pointer roi2 = ROIMaskFilterType::New();
roi2->SetRegionOfInterest(cropRegion);
roi2->SetInput(m_InternalImageMask3D);
roi2->Update();
m_InternalImageMask3D = roi2->GetOutput();
Image::Pointer tmpImage = Image::New();
tmpImage->InitializeByItk(m_InternalImageMask3D.GetPointer());
tmpImage->SetVolume(m_InternalImageMask3D->GetBufferPointer());
Image::Pointer tmpImage2 = Image::New();
tmpImage2->InitializeByItk(m_PlanarFigureImage.GetPointer());
const Geometry3D *pfImageGeometry3D = tmpImage2->GetGeometry( 0 );
const Geometry3D *intImageGeometry3D = tmpImage->GetGeometry( 0 );
typedef itk::ImageRegionIteratorWithIndex IteratorType;
IteratorType imageIterator (m_InternalImageMask3D, m_InternalImageMask3D->GetRequestedRegion());
imageIterator.GoToBegin();
while ( !imageIterator.IsAtEnd() )
{
unsigned char val = imageIterator.Value();
if (val>0)
{
itk::Index<3> index = imageIterator.GetIndex();
Point3D point;
point[0] = index[0];
point[1] = index[1];
point[2] = index[2];
intImageGeometry3D->IndexToWorld(point, point);
pfImageGeometry3D->WorldToIndex(point, point);
point[i0] += 0.5;
point[i1] += 0.5;
index[0] = point[0];
index[1] = point[1];
index[2] = point[2];
if (pfImageGeometry3D->IsIndexInside(index))
m_PlanarFigureImage->SetPixel(index, 1);
}
++imageIterator;
}
// Clean up VTK objects
polyline->Delete();
extrudeFilter->Delete();
polyDataToImageStencil->Delete();
vtkImporter->Delete();
imageStencilFilter->Delete();
//vtkExporter->Delete(); // TODO: crashes when outcommented; memory leak??
delete[] ptIds;
}
-void QmitkFiberProcessingView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
+void QmitkFiberExtractionView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
{
m_MultiWidget = &stdMultiWidget;
}
-void QmitkFiberProcessingView::StdMultiWidgetNotAvailable()
+void QmitkFiberExtractionView::StdMultiWidgetNotAvailable()
{
m_MultiWidget = NULL;
}
/* OnSelectionChanged is registered to SelectionService, therefore no need to
implement SelectionService Listener explicitly */
-void QmitkFiberProcessingView::UpdateGui()
+void QmitkFiberExtractionView::UpdateGui()
{
m_Controls->m_Extract3dButton->setEnabled(false);
m_Controls->m_ExtractMask->setEnabled(false);
// are fiber bundles selected?
if ( m_SelectedFB.empty() )
{
m_Controls->m_InputData->setTitle("Please Select Input Data");
m_Controls->m_JoinBundles->setEnabled(false);
m_Controls->m_SubstractBundles->setEnabled(false);
- m_Controls->m_ProcessFiberBundleButton->setEnabled(false);
m_Controls->doExtractFibersButton->setEnabled(false);
- m_Controls->m_ResampleFibersButton->setEnabled(false);
m_Controls->m_PlanarFigureButtonsFrame->setEnabled(false);
- m_Controls->m_FaColorFibersButton->setEnabled(false);
- m_Controls->m_PruneFibersButton->setEnabled(false);
- m_Controls->m_CurvatureThresholdButton->setEnabled(false);
-
- if (m_SelectedSurfaces.size()>0)
- m_Controls->m_MirrorFibersButton->setEnabled(true);
- else
- m_Controls->m_MirrorFibersButton->setEnabled(false);
}
else
{
m_Controls->m_InputData->setTitle("Input Data");
m_Controls->m_PlanarFigureButtonsFrame->setEnabled(true);
- m_Controls->m_ProcessFiberBundleButton->setEnabled(true);
- m_Controls->m_ResampleFibersButton->setEnabled(true);
- m_Controls->m_PruneFibersButton->setEnabled(true);
- m_Controls->m_CurvatureThresholdButton->setEnabled(true);
- m_Controls->m_MirrorFibersButton->setEnabled(true);
// one bundle and one planar figure needed to extract fibers
if (!m_SelectedPF.empty())
- {
m_Controls->doExtractFibersButton->setEnabled(true);
- }
// more than two bundles needed to join/subtract
if (m_SelectedFB.size() > 1)
{
m_Controls->m_JoinBundles->setEnabled(true);
m_Controls->m_SubstractBundles->setEnabled(true);
}
else
{
m_Controls->m_JoinBundles->setEnabled(false);
m_Controls->m_SubstractBundles->setEnabled(false);
}
- if (m_SelectedImage.IsNotNull())
- m_Controls->m_FaColorFibersButton->setEnabled(true);
-
if (m_MaskImageNode.IsNotNull())
{
m_Controls->m_Extract3dButton->setEnabled(true);
m_Controls->m_ExtractMask->setEnabled(true);
}
}
// are planar figures selected?
if ( m_SelectedPF.empty() )
{
m_Controls->doExtractFibersButton->setEnabled(false);
m_Controls->PFCompoANDButton->setEnabled(false);
m_Controls->PFCompoORButton->setEnabled(false);
m_Controls->PFCompoNOTButton->setEnabled(false);
m_Controls->m_GenerateRoiImage->setEnabled(false);
}
else
{
if ( !m_SelectedFB.empty() )
m_Controls->m_GenerateRoiImage->setEnabled(true);
else
m_Controls->m_GenerateRoiImage->setEnabled(false);
if (m_SelectedPF.size() > 1)
{
m_Controls->PFCompoANDButton->setEnabled(true);
m_Controls->PFCompoORButton->setEnabled(true);
m_Controls->PFCompoNOTButton->setEnabled(false);
}
else
{
m_Controls->PFCompoANDButton->setEnabled(false);
m_Controls->PFCompoORButton->setEnabled(false);
m_Controls->PFCompoNOTButton->setEnabled(true);
}
}
}
-void QmitkFiberProcessingView::OnSelectionChanged( std::vector nodes )
+void QmitkFiberExtractionView::OnSelectionChanged( std::vector nodes )
{
//reset existing Vectors containing FiberBundles and PlanarFigures from a previous selection
m_SelectedFB.clear();
m_SelectedPF.clear();
m_SelectedSurfaces.clear();
m_SelectedImage = NULL;
m_MaskImageNode = NULL;
m_Controls->m_FibLabel->setText("mandatory");
m_Controls->m_PfLabel->setText("needed for extraction");
for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it )
{
mitk::DataNode::Pointer node = *it;
if ( dynamic_cast(node->GetData()) )
{
m_Controls->m_FibLabel->setText(node->GetName().c_str());
m_SelectedFB.push_back(node);
}
else if (dynamic_cast(node->GetData()))
{
m_Controls->m_PfLabel->setText(node->GetName().c_str());
m_SelectedPF.push_back(node);
}
else if (dynamic_cast(node->GetData()))
{
m_SelectedImage = dynamic_cast(node->GetData());
bool isBinary = false;
node->GetPropertyValue("binary", isBinary);
if (isBinary)
m_MaskImageNode = node;
}
else if (dynamic_cast(node->GetData()))
{
m_Controls->m_PfLabel->setText(node->GetName().c_str());
m_SelectedSurfaces.push_back(dynamic_cast(node->GetData()));
}
}
UpdateGui();
GenerateStats();
}
-void QmitkFiberProcessingView::OnDrawPolygon()
+void QmitkFiberExtractionView::OnDrawPolygon()
{
// bool checked = m_Controls->m_PolygonButton->isChecked();
// if(!this->AssertDrawingIsPossible(checked))
// return;
mitk::PlanarPolygon::Pointer figure = mitk::PlanarPolygon::New();
figure->ClosedOn();
this->AddFigureToDataStorage(figure, QString("Polygon%1").arg(++m_PolygonCounter));
MITK_DEBUG << "PlanarPolygon created ...";
mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDefaultDataStorage()->GetAll();
mitk::DataNode* node = 0;
mitk::PlanarFigureInteractor::Pointer figureInteractor = 0;
mitk::PlanarFigure* figureP = 0;
for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End()
; it++)
{
node = const_cast(it->Value().GetPointer());
figureP = dynamic_cast(node->GetData());
if(figureP)
{
figureInteractor = dynamic_cast(node->GetInteractor());
if(figureInteractor.IsNull())
figureInteractor = mitk::PlanarFigureInteractor::New("PlanarFigureInteractor", node);
mitk::GlobalInteraction::GetInstance()->AddInteractor(figureInteractor);
}
}
}
-void QmitkFiberProcessingView::OnDrawCircle()
+void QmitkFiberExtractionView::OnDrawCircle()
{
mitk::PlanarCircle::Pointer figure = mitk::PlanarCircle::New();
this->AddFigureToDataStorage(figure, QString("Circle%1").arg(++m_CircleCounter));
this->GetDataStorage()->Modified();
mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDefaultDataStorage()->GetAll();
mitk::DataNode* node = 0;
mitk::PlanarFigureInteractor::Pointer figureInteractor = 0;
mitk::PlanarFigure* figureP = 0;
for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End(); it++)
{
node = const_cast(it->Value().GetPointer());
figureP = dynamic_cast(node->GetData());
if(figureP)
{
figureInteractor = dynamic_cast(node->GetInteractor());
if(figureInteractor.IsNull())
figureInteractor = mitk::PlanarFigureInteractor::New("PlanarFigureInteractor", node);
mitk::GlobalInteraction::GetInstance()->AddInteractor(figureInteractor);
}
}
}
-void QmitkFiberProcessingView::Activated()
+void QmitkFiberExtractionView::Activated()
{
}
-void QmitkFiberProcessingView::AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name,
+void QmitkFiberExtractionView::AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name,
const char *propertyKey, mitk::BaseProperty *property )
{
// initialize figure's geometry with empty geometry
mitk::PlaneGeometry::Pointer emptygeometry = mitk::PlaneGeometry::New();
figure->SetGeometry2D( emptygeometry );
//set desired data to DataNode where Planarfigure is stored
mitk::DataNode::Pointer newNode = mitk::DataNode::New();
newNode->SetName(name.toStdString());
newNode->SetData(figure);
newNode->AddProperty( "planarfigure.default.line.color", mitk::ColorProperty::New(1.0,0.0,0.0));
newNode->AddProperty( "planarfigure.line.width", mitk::FloatProperty::New(2.0));
newNode->AddProperty( "planarfigure.drawshadow", mitk::BoolProperty::New(true));
newNode->AddProperty( "selected", mitk::BoolProperty::New(true) );
newNode->AddProperty( "planarfigure.ishovering", mitk::BoolProperty::New(true) );
newNode->AddProperty( "planarfigure.drawoutline", mitk::BoolProperty::New(true) );
newNode->AddProperty( "planarfigure.drawquantities", mitk::BoolProperty::New(false) );
newNode->AddProperty( "planarfigure.drawshadow", mitk::BoolProperty::New(true) );
newNode->AddProperty( "planarfigure.line.width", mitk::FloatProperty::New(3.0) );
newNode->AddProperty( "planarfigure.shadow.widthmodifier", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.outline.width", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.helperline.width", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.default.line.color", mitk::ColorProperty::New(1.0,1.0,1.0) );
newNode->AddProperty( "planarfigure.default.line.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.default.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.default.outline.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.default.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.default.helperline.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.default.markerline.color", mitk::ColorProperty::New(0.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.default.markerline.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.default.marker.color", mitk::ColorProperty::New(1.0,1.0,1.0) );
newNode->AddProperty( "planarfigure.default.marker.opacity",mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.hover.line.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.hover.line.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.hover.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.hover.outline.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.hover.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.hover.helperline.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.hover.markerline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.hover.markerline.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.hover.marker.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.hover.marker.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.selected.line.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.selected.line.opacity",mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.selected.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.selected.outline.opacity", mitk::FloatProperty::New(2.0));
newNode->AddProperty( "planarfigure.selected.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.selected.helperline.opacity",mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.selected.markerline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.selected.markerline.opacity", mitk::FloatProperty::New(2.0) );
newNode->AddProperty( "planarfigure.selected.marker.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
newNode->AddProperty( "planarfigure.selected.marker.opacity",mitk::FloatProperty::New(2.0));
// figure drawn on the topmost layer / image
newNode->SetColor(1.0,1.0,1.0);
newNode->SetOpacity(0.8);
GetDataStorage()->Add(newNode );
std::vector selectedNodes = GetDataManagerSelection();
for(unsigned int i = 0; i < selectedNodes.size(); i++)
{
selectedNodes[i]->SetSelected(false);
}
newNode->SetSelected(true);
}
-void QmitkFiberProcessingView::DoFiberExtraction()
+void QmitkFiberExtractionView::DoFiberExtraction()
{
if ( m_SelectedFB.empty() ){
QMessageBox::information( NULL, "Warning", "No fibe bundle selected!");
- MITK_WARN("QmitkFiberProcessingView") << "no fibe bundle selected";
+ MITK_WARN("QmitkFiberExtractionView") << "no fibe bundle selected";
return;
}
for (int i=0; i(m_SelectedFB.at(i)->GetData());
mitk::PlanarFigure::Pointer roi = dynamic_cast (m_SelectedPF.at(0)->GetData());
mitk::FiberBundleX::Pointer extFB = fib->ExtractFiberSubset(roi);
if (extFB->GetNumFibers()<=0)
continue;
mitk::DataNode::Pointer node;
node = mitk::DataNode::New();
node->SetData(extFB);
QString name(m_SelectedFB.at(i)->GetName().c_str());
name += "_";
name += m_SelectedPF.at(0)->GetName().c_str();
node->SetName(name.toStdString());
GetDataStorage()->Add(node);
m_SelectedFB.at(i)->SetVisibility(false);
}
}
-void QmitkFiberProcessingView::GenerateAndComposite()
+void QmitkFiberExtractionView::GenerateAndComposite()
{
mitk::PlanarFigureComposite::Pointer PFCAnd = mitk::PlanarFigureComposite::New();
mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D()));
PFCAnd->SetGeometry2D(currentGeometry2D);
PFCAnd->setOperationType(mitk::PFCOMPOSITION_AND_OPERATION);
for( std::vector::iterator it = m_SelectedPF.begin();
it != m_SelectedPF.end(); ++it )
{
mitk::DataNode::Pointer nodePF = *it;
mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() );
PFCAnd->addPlanarFigure( tmpPF );
PFCAnd->addDataNode( nodePF );
PFCAnd->setDisplayName("AND_COMPO");
}
AddCompositeToDatastorage(PFCAnd, NULL);
}
-void QmitkFiberProcessingView::GenerateOrComposite()
+void QmitkFiberExtractionView::GenerateOrComposite()
{
mitk::PlanarFigureComposite::Pointer PFCOr = mitk::PlanarFigureComposite::New();
mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D()));
PFCOr->SetGeometry2D(currentGeometry2D);
PFCOr->setOperationType(mitk::PFCOMPOSITION_OR_OPERATION);
for( std::vector::iterator it = m_SelectedPF.begin();
it != m_SelectedPF.end(); ++it )
{
mitk::DataNode::Pointer nodePF = *it;
mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() );
PFCOr->addPlanarFigure( tmpPF );
PFCOr->addDataNode( nodePF );
PFCOr->setDisplayName("OR_COMPO");
}
AddCompositeToDatastorage(PFCOr, NULL);
}
-void QmitkFiberProcessingView::GenerateNotComposite()
+void QmitkFiberExtractionView::GenerateNotComposite()
{
mitk::PlanarFigureComposite::Pointer PFCNot = mitk::PlanarFigureComposite::New();
mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D()));
PFCNot->SetGeometry2D(currentGeometry2D);
PFCNot->setOperationType(mitk::PFCOMPOSITION_NOT_OPERATION);
for( std::vector::iterator it = m_SelectedPF.begin();
it != m_SelectedPF.end(); ++it )
{
mitk::DataNode::Pointer nodePF = *it;
mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() );
PFCNot->addPlanarFigure( tmpPF );
PFCNot->addDataNode( nodePF );
PFCNot->setDisplayName("NOT_COMPO");
}
AddCompositeToDatastorage(PFCNot, NULL);
}
/* CLEANUP NEEDED */
-void QmitkFiberProcessingView::AddCompositeToDatastorage(mitk::PlanarFigureComposite::Pointer pfcomp, mitk::DataNode::Pointer parentDataNode )
+void QmitkFiberExtractionView::AddCompositeToDatastorage(mitk::PlanarFigureComposite::Pointer pfcomp, mitk::DataNode::Pointer parentDataNode )
{
mitk::DataNode::Pointer newPFCNode;
newPFCNode = mitk::DataNode::New();
newPFCNode->SetName( pfcomp->getDisplayName() );
newPFCNode->SetData(pfcomp);
newPFCNode->SetVisibility(true);
switch (pfcomp->getOperationType()) {
case 0:
{
if (!parentDataNode.IsNull()) {
GetDataStorage()->Add(newPFCNode, parentDataNode);
} else {
GetDataStorage()->Add(newPFCNode);
}
//iterate through its childs
for(int i=0; igetNumberOfChildren(); ++i)
{
mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i);
mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i);
mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer());
if ( !pfcompcast.IsNull() )
{
// child is of type planar Figure composite
// make new node of the child, cuz later the child has to be removed of its old position in datamanager
// feed new dataNode with information of the savedDataNode, which is gonna be removed soon
mitk::DataNode::Pointer newChildPFCNode;
newChildPFCNode = mitk::DataNode::New();
newChildPFCNode->SetData(tmpPFchild);
newChildPFCNode->SetName( savedPFchildNode->GetName() );
pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user
//update inside vector the dataNodePointer
pfcomp->replaceDataNodeAt(i, newChildPFCNode);
AddCompositeToDatastorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent
// remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager
// without having its parent anymore
//GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
}else{
MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
}
// remove old child position in dataStorage
GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
}
}
else
{
// child is not of type PlanarFigureComposite, so its one of the planarFigures
// create new dataNode containing the data of the old dataNode, but position in dataManager will be
// modified cuz we re setting a (new) parent.
mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New();
newPFchildNode->SetName(savedPFchildNode->GetName() );
newPFchildNode->SetData(tmpPFchild);
newPFchildNode->SetVisibility(true);
// replace the dataNode in PFComp DataNodeVector
pfcomp->replaceDataNodeAt(i, newPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
}
else
{
MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
}
// remove old child position in dataStorage
GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode))
{
MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
}
MITK_DEBUG << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName();
//add new child to datamanager with its new position as child of newPFCNode parent
GetDataStorage()->Add(newPFchildNode, newPFCNode);
}
}
GetDataStorage()->Modified();
break;
}
case 1:
{
if (!parentDataNode.IsNull()) {
MITK_DEBUG << "adding " << newPFCNode->GetName() << " to " << parentDataNode->GetName() ;
GetDataStorage()->Add(newPFCNode, parentDataNode);
} else {
MITK_DEBUG << "adding " << newPFCNode->GetName();
GetDataStorage()->Add(newPFCNode);
}
for(int i=0; igetNumberOfChildren(); ++i)
{
mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i);
mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i);
mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer());
if ( !pfcompcast.IsNull() )
{ // child is of type planar Figure composite
// make new node of the child, cuz later the child has to be removed of its old position in datamanager
// feed new dataNode with information of the savedDataNode, which is gonna be removed soon
mitk::DataNode::Pointer newChildPFCNode;
newChildPFCNode = mitk::DataNode::New();
newChildPFCNode->SetData(tmpPFchild);
newChildPFCNode->SetName( savedPFchildNode->GetName() );
pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user
//update inside vector the dataNodePointer
pfcomp->replaceDataNodeAt(i, newChildPFCNode);
AddCompositeToDatastorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent
// remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager
// without having its parent anymore
//GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
}else{
MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
}
// remove old child position in dataStorage
GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
}
} else {
// child is not of type PlanarFigureComposite, so its one of the planarFigures
// create new dataNode containing the data of the old dataNode, but position in dataManager will be
// modified cuz we re setting a (new) parent.
mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New();
newPFchildNode->SetName(savedPFchildNode->GetName() );
newPFchildNode->SetData(tmpPFchild);
newPFchildNode->SetVisibility(true);
// replace the dataNode in PFComp DataNodeVector
pfcomp->replaceDataNodeAt(i, newPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
}else{
MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
}
// remove old child position in dataStorage
GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
}
MITK_DEBUG << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName();
//add new child to datamanager with its new position as child of newPFCNode parent
GetDataStorage()->Add(newPFchildNode, newPFCNode);
}
}
GetDataStorage()->Modified();
break;
}
case 2:
{
if (!parentDataNode.IsNull()) {
MITK_DEBUG << "adding " << newPFCNode->GetName() << " to " << parentDataNode->GetName() ;
GetDataStorage()->Add(newPFCNode, parentDataNode);
}
else
{
MITK_DEBUG << "adding " << newPFCNode->GetName();
GetDataStorage()->Add(newPFCNode);
}
//iterate through its childs
for(int i=0; igetNumberOfChildren(); ++i)
{
mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i);
mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i);
mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer());
if ( !pfcompcast.IsNull() )
{ // child is of type planar Figure composite
// makeRemoveBundle new node of the child, cuz later the child has to be removed of its old position in datamanager
// feed new dataNode with information of the savedDataNode, which is gonna be removed soon
mitk::DataNode::Pointer newChildPFCNode;
newChildPFCNode = mitk::DataNode::New();
newChildPFCNode->SetData(tmpPFchild);
newChildPFCNode->SetName( savedPFchildNode->GetName() );
pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user
//update inside vector the dataNodePointer
pfcomp->replaceDataNodeAt(i, newChildPFCNode);
AddCompositeToDatastorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent
// remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager
// without having its parent anymore
//GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
}else{
MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
}
// remove old child position in dataStorage
GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
}
} else {
// child is not of type PlanarFigureComposite, so its one of the planarFigures
// create new dataNode containing the data of the old dataNode, but position in dataManager will be
// modified cuz we re setting a (new) parent.
mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New();
newPFchildNode->SetName(savedPFchildNode->GetName() );
newPFchildNode->SetData(tmpPFchild);
newPFchildNode->SetVisibility(true);
// replace the dataNode in PFComp DataNodeVector
pfcomp->replaceDataNodeAt(i, newPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
}else{
MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
}
// remove old child position in dataStorage
GetDataStorage()->Remove(savedPFchildNode);
if ( GetDataStorage()->Exists(savedPFchildNode)) {
MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
}
MITK_DEBUG << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName();
//add new child to datamanager with its new position as child of newPFCNode parent
GetDataStorage()->Add(newPFchildNode, newPFCNode);
}
}
GetDataStorage()->Modified();
break;
}
default:
MITK_DEBUG << "we have an UNDEFINED composition... ERROR" ;
break;
}
}
-void QmitkFiberProcessingView::JoinBundles()
+void QmitkFiberExtractionView::JoinBundles()
{
if ( m_SelectedFB.size()<2 ){
QMessageBox::information( NULL, "Warning", "Select at least two fiber bundles!");
- MITK_WARN("QmitkFiberProcessingView") << "Select at least two fiber bundles!";
+ MITK_WARN("QmitkFiberExtractionView") << "Select at least two fiber bundles!";
return;
}
std::vector::const_iterator it = m_SelectedFB.begin();
mitk::FiberBundleX::Pointer newBundle = dynamic_cast((*it)->GetData());
QString name("");
name += QString((*it)->GetName().c_str());
++it;
for (it; it!=m_SelectedFB.end(); ++it)
{
newBundle = newBundle->AddBundle(dynamic_cast((*it)->GetData()));
name += "+"+QString((*it)->GetName().c_str());
}
mitk::DataNode::Pointer fbNode = mitk::DataNode::New();
fbNode->SetData(newBundle);
fbNode->SetName(name.toStdString());
fbNode->SetVisibility(true);
GetDataStorage()->Add(fbNode);
}
-void QmitkFiberProcessingView::SubstractBundles()
+void QmitkFiberExtractionView::SubstractBundles()
{
if ( m_SelectedFB.size()<2 ){
QMessageBox::information( NULL, "Warning", "Select at least two fiber bundles!");
- MITK_WARN("QmitkFiberProcessingView") << "Select at least two fiber bundles!";
+ MITK_WARN("QmitkFiberExtractionView") << "Select at least two fiber bundles!";
return;
}
std::vector::const_iterator it = m_SelectedFB.begin();
mitk::FiberBundleX::Pointer newBundle = dynamic_cast((*it)->GetData());
QString name("");
name += QString((*it)->GetName().c_str());
++it;
for (it; it!=m_SelectedFB.end(); ++it)
{
newBundle = newBundle->SubtractBundle(dynamic_cast((*it)->GetData()));
if (newBundle.IsNull())
break;
name += "-"+QString((*it)->GetName().c_str());
}
if (newBundle.IsNull())
{
QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers. Did you select the fiber bundles in the correct order? X-Y is not equal to Y-X!");
return;
}
mitk::DataNode::Pointer fbNode = mitk::DataNode::New();
fbNode->SetData(newBundle);
fbNode->SetName(name.toStdString());
fbNode->SetVisibility(true);
GetDataStorage()->Add(fbNode);
}
-void QmitkFiberProcessingView::PruneBundle()
-{
- int minLength = this->m_Controls->m_PruneFibersSpinBox->value();
- int maxLength = this->m_Controls->m_MaxPruneFibersSpinBox->value();
- for (int i=0; i(m_SelectedFB.at(i)->GetData());
- if (!fib->RemoveShortFibers(minLength))
- QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers.");
- else if (!fib->RemoveLongFibers(maxLength))
- QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers.");
- }
- GenerateStats();
- RenderingManager::GetInstance()->RequestUpdateAll();
-}
-
-
-void QmitkFiberProcessingView::ApplyCurvatureThreshold()
-{
- int mm = this->m_Controls->m_MinCurvatureRadiusBox->value();
- for (int i=0; i(m_SelectedFB.at(i)->GetData());
- if (!fib->ApplyCurvatureThreshold(mm, this->m_Controls->m_RemoveFiberDueToCurvatureCheckbox->isChecked()))
- QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers.");
- }
- GenerateStats();
- RenderingManager::GetInstance()->RequestUpdateAll();
-}
-
-void QmitkFiberProcessingView::GenerateStats()
+void QmitkFiberExtractionView::GenerateStats()
{
if ( m_SelectedFB.empty() )
return;
QString stats("");
for( int i=0; i(node->GetData()))
{
if (i>0)
stats += "\n-----------------------------\n";
stats += QString(node->GetName().c_str()) + "\n";
mitk::FiberBundleX::Pointer fib = dynamic_cast(node->GetData());
stats += "Number of fibers: "+ QString::number(fib->GetNumFibers()) + "\n";
stats += "Min. length: "+ QString::number(fib->GetMinFiberLength(),'f',1) + " mm\n";
stats += "Max. length: "+ QString::number(fib->GetMaxFiberLength(),'f',1) + " mm\n";
stats += "Mean length: "+ QString::number(fib->GetMeanFiberLength(),'f',1) + " mm\n";
stats += "Median length: "+ QString::number(fib->GetMedianFiberLength(),'f',1) + " mm\n";
stats += "Standard deviation: "+ QString::number(fib->GetLengthStDev(),'f',1) + " mm\n";
}
}
this->m_Controls->m_StatsTextEdit->setText(stats);
}
-
-void QmitkFiberProcessingView::ProcessSelectedBundles()
-{
- if ( m_SelectedFB.empty() ){
- QMessageBox::information( NULL, "Warning", "No fibe bundle selected!");
- MITK_WARN("QmitkFiberProcessingView") << "no fibe bundle selected";
- return;
- }
-
- int generationMethod = m_Controls->m_GenerationBox->currentIndex();
-
- for( int i=0; i(node->GetData()))
- {
- mitk::FiberBundleX::Pointer fib = dynamic_cast(node->GetData());
- QString name(node->GetName().c_str());
- DataNode::Pointer newNode = NULL;
- switch(generationMethod){
- case 0:
- newNode = GenerateTractDensityImage(fib, false, true);
- name += "_TDI";
- break;
- case 1:
- newNode = GenerateTractDensityImage(fib, false, false);
- name += "_TDI";
- break;
- case 2:
- newNode = GenerateTractDensityImage(fib, true, false);
- name += "_envelope";
- break;
- case 3:
- newNode = GenerateColorHeatmap(fib);
- break;
- case 4:
- newNode = GenerateFiberEndingsImage(fib);
- name += "_fiber_endings";
- break;
- case 5:
- newNode = GenerateFiberEndingsPointSet(fib);
- name += "_fiber_endings";
- break;
- }
- if (newNode.IsNotNull())
- {
- newNode->SetName(name.toStdString());
- GetDataStorage()->Add(newNode);
- }
- }
- }
-}
-
-// generate pointset displaying the fiber endings
-mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateFiberEndingsPointSet(mitk::FiberBundleX::Pointer fib)
-{
- mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
- vtkSmartPointer fiberPolyData = fib->GetFiberPolyData();
- vtkSmartPointer vLines = fiberPolyData->GetLines();
- vLines->InitTraversal();
-
- int count = 0;
- int numFibers = fib->GetNumFibers();
- for( int i=0; iGetNextCell ( numPoints, points );
-
- if (numPoints>0)
- {
- double* point = fiberPolyData->GetPoint(points[0]);
- itk::Point itkPoint;
- itkPoint[0] = point[0];
- itkPoint[1] = point[1];
- itkPoint[2] = point[2];
- pointSet->InsertPoint(count, itkPoint);
- count++;
- }
- if (numPoints>2)
- {
- double* point = fiberPolyData->GetPoint(points[numPoints-1]);
- itk::Point itkPoint;
- itkPoint[0] = point[0];
- itkPoint[1] = point[1];
- itkPoint[2] = point[2];
- pointSet->InsertPoint(count, itkPoint);
- count++;
- }
- }
-
- mitk::DataNode::Pointer node = mitk::DataNode::New();
- node->SetData( pointSet );
- return node;
-}
-
-// generate image displaying the fiber endings
-mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateFiberEndingsImage(mitk::FiberBundleX::Pointer fib)
-{
- typedef unsigned char OutPixType;
- typedef itk::Image OutImageType;
-
- typedef itk::TractsToFiberEndingsImageFilter< OutImageType > ImageGeneratorType;
- ImageGeneratorType::Pointer generator = ImageGeneratorType::New();
- generator->SetFiberBundle(fib);
- generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value());
- if (m_SelectedImage.IsNotNull())
- {
- OutImageType::Pointer itkImage = OutImageType::New();
- CastToItkImage(m_SelectedImage, itkImage);
- generator->SetInputImage(itkImage);
- generator->SetUseImageGeometry(true);
- }
- generator->Update();
-
- // get output image
- OutImageType::Pointer outImg = generator->GetOutput();
- mitk::Image::Pointer img = mitk::Image::New();
- img->InitializeByItk(outImg.GetPointer());
- img->SetVolume(outImg->GetBufferPointer());
-
- // init data node
- mitk::DataNode::Pointer node = mitk::DataNode::New();
- node->SetData(img);
- return node;
-}
-
-// generate rgba heatmap from fiber bundle
-mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateColorHeatmap(mitk::FiberBundleX::Pointer fib)
-{
- typedef itk::RGBAPixel OutPixType;
- typedef itk::Image OutImageType;
- typedef itk::TractsToRgbaImageFilter< OutImageType > ImageGeneratorType;
- ImageGeneratorType::Pointer generator = ImageGeneratorType::New();
- generator->SetFiberBundle(fib);
- generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value());
- if (m_SelectedImage.IsNotNull())
- {
- itk::Image::Pointer itkImage = itk::Image::New();
- CastToItkImage(m_SelectedImage, itkImage);
- generator->SetInputImage(itkImage);
- generator->SetUseImageGeometry(true);
- }
- generator->Update();
-
- // get output image
- typedef itk::Image OutType;
- OutType::Pointer outImg = generator->GetOutput();
- mitk::Image::Pointer img = mitk::Image::New();
- img->InitializeByItk(outImg.GetPointer());
- img->SetVolume(outImg->GetBufferPointer());
-
- // init data node
- mitk::DataNode::Pointer node = mitk::DataNode::New();
- node->SetData(img);
- return node;
-}
-
-// generate tract density image from fiber bundle
-mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateTractDensityImage(mitk::FiberBundleX::Pointer fib, bool binary, bool absolute)
-{
- const mitk::Geometry2D* bla = GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D();
- typedef float OutPixType;
- typedef itk::Image OutImageType;
-
- itk::TractDensityImageFilter< OutImageType >::Pointer generator = itk::TractDensityImageFilter< OutImageType >::New();
- generator->SetFiberBundle(fib);
- generator->SetBinaryOutput(binary);
- generator->SetOutputAbsoluteValues(absolute);
- generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value());
- if (m_SelectedImage.IsNotNull())
- {
- OutImageType::Pointer itkImage = OutImageType::New();
- CastToItkImage(m_SelectedImage, itkImage);
- generator->SetInputImage(itkImage);
- generator->SetUseImageGeometry(true);
-
- }
- generator->Update();
-
- // get output image
- typedef itk::Image OutType;
- OutType::Pointer outImg = generator->GetOutput();
- mitk::Image::Pointer img = mitk::Image::New();
- img->InitializeByItk(outImg.GetPointer());
- img->SetVolume(outImg->GetBufferPointer());
-
- // init data node
- mitk::DataNode::Pointer node = mitk::DataNode::New();
- node->SetData(img);
- return node;
-}
-
-void QmitkFiberProcessingView::ResampleSelectedBundles()
-{
- int factor = this->m_Controls->m_ResampleFibersSpinBox->value();
- for (int i=0; i(m_SelectedFB.at(i)->GetData());
- fib->DoFiberSmoothing(factor);
- }
- GenerateStats();
- RenderingManager::GetInstance()->RequestUpdateAll();
-}
-
-void QmitkFiberProcessingView::MirrorFibers()
-{
- unsigned int axis = this->m_Controls->m_AxisSelectionBox->currentIndex();
- for (int i=0; i(m_SelectedFB.at(i)->GetData());
- fib->MirrorFibers(axis);
- }
- if (m_SelectedFB.size()>0)
- GenerateStats();
-
- if (m_SelectedSurfaces.size()>0)
- {
- for (int i=0; i poly = surf->GetVtkPolyData();
- vtkSmartPointer vtkNewPoints = vtkSmartPointer::New();
-
- for (int i=0; iGetNumberOfPoints(); i++)
- {
- double* point = poly->GetPoint(i);
- point[axis] *= -1;
- vtkNewPoints->InsertNextPoint(point);
- }
- poly->SetPoints(vtkNewPoints);
- surf->CalculateBoundingBox();
- }
- }
-
- RenderingManager::GetInstance()->RequestUpdateAll();
-}
-
-void QmitkFiberProcessingView::DoImageColorCoding()
-{
- if (m_SelectedImage.IsNull())
- return;
-
- for( int i=0; i(m_SelectedFB.at(i)->GetData());
- fib->SetFAMap(m_SelectedImage);
- fib->SetColorCoding(mitk::FiberBundleX::COLORCODING_FA_BASED);
- fib->DoColorCodingFaBased();
- }
-
- if(m_MultiWidget)
- m_MultiWidget->RequestUpdate();
-}
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.h b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionView.h
similarity index 87%
copy from Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.h
copy to Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionView.h
index 806782e4d0..cc411a0a94 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.h
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionView.h
@@ -1,178 +1,172 @@
/*===================================================================
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.
===================================================================*/
-#ifndef QmitkFiberProcessingView_h
-#define QmitkFiberProcessingView_h
+#ifndef QmitkFiberExtractionView_h
+#define QmitkFiberExtractionView_h
#include
-#include "ui_QmitkFiberProcessingViewControls.h"
+#include "ui_QmitkFiberExtractionViewControls.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*!
\brief View to process fiber bundles. Supplies methods to extract fibers from the bundle, join and subtract bundles, generate images from the selected bundle and much more.
\sa QmitkFunctionality
\ingroup Functionalities
*/
-class QmitkFiberProcessingView : public QmitkFunctionality
+class QmitkFiberExtractionView : public QmitkFunctionality
{
// 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:
typedef itk::Image< unsigned char, 3 > itkUCharImageType;
static const std::string VIEW_ID;
- QmitkFiberProcessingView();
- virtual ~QmitkFiberProcessingView();
+ QmitkFiberExtractionView();
+ virtual ~QmitkFiberExtractionView();
virtual void CreateQtPartControl(QWidget *parent);
virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget);
virtual void StdMultiWidgetNotAvailable();
virtual void Activated();
protected slots:
void OnDrawCircle(); ///< add circle interactors etc.
void OnDrawPolygon(); ///< add circle interactors etc.
void DoFiberExtraction(); ///< Extract fibers from selected bundle
void GenerateAndComposite();
void GenerateOrComposite();
void GenerateNotComposite();
- void PruneBundle(); ///< remove too short/too long fibers
- void MirrorFibers(); ///< mirror bundle on the specified plane
void JoinBundles(); ///< merge selected fiber bundles
void SubstractBundles(); ///< subtract bundle A from bundle B. Not commutative! Defined by order of selection.
void GenerateRoiImage(); ///< generate binary image of selected planar figures.
- void ProcessSelectedBundles(); ///< start selected operation on fiber bundle (e.g. tract density image generation)
- void ResampleSelectedBundles(); ///< smooth fiber bundle using the specified number of sampling points per cm.
- void DoImageColorCoding(); ///< color fibers by selected scalar image
- void Extract3d(); ///< extract all fibers passing the selected surface mesh
- void ApplyCurvatureThreshold(); ///< remove/split fibers with a too high curvature threshold
- void ExtractMask(); ///< extract all fibers passing the selected surface mesh
+ void ExtractPassingMask(); ///< extract all fibers passing the selected surface mesh
+ void ExtractEndingInMask(); ///< extract all fibers passing the selected surface mesh
virtual void AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name, const char *propertyKey = NULL, mitk::BaseProperty *property = NULL );
protected:
/// \brief called by QmitkFunctionality when DataManager's selection has changed
virtual void OnSelectionChanged( std::vector nodes );
- Ui::QmitkFiberProcessingViewControls* m_Controls;
+ Ui::QmitkFiberExtractionViewControls* m_Controls;
QmitkStdMultiWidget* m_MultiWidget;
/** Connection from VTK to ITK */
template
void ConnectPipelines(VTK_Exporter* exporter, ITK_Importer importer)
{
importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
importer->SetSpacingCallback(exporter->GetSpacingCallback());
importer->SetOriginCallback(exporter->GetOriginCallback());
importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
importer->SetCallbackUserData(exporter->GetCallbackUserData());
}
template
void ConnectPipelines(ITK_Exporter exporter, VTK_Importer* importer)
{
importer->SetUpdateInformationCallback(exporter->GetUpdateInformationCallback());
importer->SetPipelineModifiedCallback(exporter->GetPipelineModifiedCallback());
importer->SetWholeExtentCallback(exporter->GetWholeExtentCallback());
importer->SetSpacingCallback(exporter->GetSpacingCallback());
importer->SetOriginCallback(exporter->GetOriginCallback());
importer->SetScalarTypeCallback(exporter->GetScalarTypeCallback());
importer->SetNumberOfComponentsCallback(exporter->GetNumberOfComponentsCallback());
importer->SetPropagateUpdateExtentCallback(exporter->GetPropagateUpdateExtentCallback());
importer->SetUpdateDataCallback(exporter->GetUpdateDataCallback());
importer->SetDataExtentCallback(exporter->GetDataExtentCallback());
importer->SetBufferPointerCallback(exporter->GetBufferPointerCallback());
importer->SetCallbackUserData(exporter->GetCallbackUserData());
}
template < typename TPixel, unsigned int VImageDimension >
void InternalCalculateMaskFromPlanarFigure(
itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName );
template < typename TPixel, unsigned int VImageDimension >
void InternalReorientImagePlane(
const itk::Image< TPixel, VImageDimension > *image, mitk::Geometry3D* planegeo3D, int additionalIndex );
void GenerateStats(); ///< generate statistics of selected fiber bundles
void UpdateGui(); ///< update button activity etc. dpending on current datamanager selection
int m_CircleCounter; ///< used for data node naming
int m_PolygonCounter; ///< used for data node naming
std::vector m_SelectedFB; ///< selected fiber bundle nodes
std::vector m_SelectedPF; ///< selected planar figure nodes
std::vector m_SelectedSurfaces;
mitk::Image::Pointer m_SelectedImage;
mitk::Image::Pointer m_InternalImage;
mitk::PlanarFigure::Pointer m_PlanarFigure;
itkUCharImageType::Pointer m_InternalImageMask3D;
itkUCharImageType::Pointer m_PlanarFigureImage;
float m_UpsamplingFactor; ///< upsampling factor for all image generations
mitk::DataNode::Pointer m_MaskImageNode;
void AddCompositeToDatastorage(mitk::PlanarFigureComposite::Pointer, mitk::DataNode::Pointer);
void debugPFComposition(mitk::PlanarFigureComposite::Pointer , int );
void CompositeExtraction(mitk::DataNode::Pointer node, mitk::Image* image);
mitk::DataNode::Pointer GenerateTractDensityImage(mitk::FiberBundleX::Pointer fib, bool binary, bool absolute);
mitk::DataNode::Pointer GenerateColorHeatmap(mitk::FiberBundleX::Pointer fib);
mitk::DataNode::Pointer GenerateFiberEndingsImage(mitk::FiberBundleX::Pointer fib);
mitk::DataNode::Pointer GenerateFiberEndingsPointSet(mitk::FiberBundleX::Pointer fib);
};
#endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionViewControls.ui
similarity index 58%
copy from Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingViewControls.ui
copy to Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionViewControls.ui
index f6417c6711..3d376dae84 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingViewControls.ui
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberExtractionViewControls.ui
@@ -1,984 +1,565 @@
- QmitkFiberProcessingViewControls
-
+ QmitkFiberExtractionViewControls
+
0
0
492
866
Form
-
Please Select Input Data
-
<html><head/><body><p><span style=" color:#ff0000;">mandatory</span></p></body></html>
-
<html><head/><body><p><span style=" color:#969696;">needed for extraction</span></p></body></html>
-
Input DTI
Fiber Bundle:
-
Binary seed ROI. If not specified, the whole image area is seeded.
ROI:
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
-
Fiber Extraction
-
0
0
200
0
16777215
60
QFrame::NoFrame
QFrame::Raised
0
-
30
30
Draw circular ROI. Select reference fiber bundle to execute.
:/QmitkDiffusionImaging/circle.png:/QmitkDiffusionImaging/circle.png
32
32
false
true
-
30
30
Draw rectangular ROI. Select reference fiber bundle to execute.
:/QmitkDiffusionImaging/rectangle.png:/QmitkDiffusionImaging/rectangle.png
32
32
true
true
-
30
30
Draw polygonal ROI. Select reference fiber bundle to execute.
:/QmitkDiffusionImaging/polygon.png:/QmitkDiffusionImaging/polygon.png
32
32
true
true
-
Qt::Horizontal
40
20
-
QFrame::NoFrame
QFrame::Raised
0
-
false
0
0
200
16777215
11
Returns all fibers contained in bundle X that are not contained in bundle Y (not commutative!). Select at least two fiber bundles to execute.
Substract
-
false
0
0
200
16777215
11
Extract fibers starting/ending inside of the selected binary mask.
Ending in Mask
-
Qt::Horizontal
40
20
-
false
0
0
200
16777215
11
Merge selected fiber bundles. Select at least two fiber bundles to execute.
Join
-
false
0
0
200
16777215
11
Extract fibers passing through selected ROI or composite ROI. Select ROI and fiber bundle to execute.
Extract
-
false
0
0
16777215
16777215
11
Generate a binary image containing all selected ROIs. Select at least one ROI (planar figure) and a reference fiber bundle or image.
ROI Image
-
false
0
0
200
16777215
11
Extract fibers passing through the selected binary mask.
Passing Mask
-
0
0
200
0
16777215
60
QFrame::NoFrame
QFrame::Raised
0
-
Qt::Horizontal
40
20
-
false
60
16777215
Create AND composition with selected ROIs.
AND
-
false
60
16777215
Create OR composition with selected ROIs.
OR
-
false
60
16777215
Create NOT composition from selected ROI.
NOT
-
-
-
- Fiber Processing
-
-
-
- QFormLayout::AllNonFixedFieldsGrow
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 200
- 16777215
-
-
-
-
- 11
-
-
-
- Perform selected operation on all selected fiber bundles.
-
-
- Generate Image
-
-
-
- -
-
-
- QFrame::NoFrame
-
-
- QFrame::Raised
-
-
- 0
-
-
-
- 0
-
-
- 0
-
-
-
-
-
-
- 0
- 0
-
-
-
-
-
- Tract Density Image (TDI)
-
-
- -
-
- Normalized TDI
-
-
- -
-
- Binary Envelope
-
-
- -
-
- Fiber Bundle Image
-
-
- -
-
- Fiber Endings Image
-
-
- -
-
- Fiber Endings Pointset
-
-
-
-
- -
-
-
- Upsampling factor
-
-
- 1
-
-
- 0.100000000000000
-
-
- 10.000000000000000
-
-
- 0.100000000000000
-
-
- 1.000000000000000
-
-
-
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 200
- 16777215
-
-
-
-
- 11
-
-
-
- Resample fibers using a Kochanek spline interpolation.
-
-
- Smooth Fibers
-
-
-
- -
-
-
- Points per cm
-
-
- 1
-
-
- 50
-
-
- 5
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 200
- 16777215
-
-
-
-
- 11
-
-
-
- Remove fibers shorter/longer than the specified length (in mm).
-
-
- Length Threshold
-
-
-
- -
-
-
- QFrame::NoFrame
-
-
- QFrame::Raised
-
-
-
- 0
-
-
- 0
-
-
-
-
-
- Minimum fiber length in mm
-
-
- 0
-
-
- 1000
-
-
- 20
-
-
-
- -
-
-
- Maximum fiber length in mm
-
-
- 0
-
-
- 10000
-
-
- 500
-
-
-
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 200
- 16777215
-
-
-
-
- 11
-
-
-
- Remove fibers with a too high curvature
-
-
- Curvature Threshold
-
-
-
- -
-
-
- QFrame::NoFrame
-
-
- QFrame::Raised
-
-
-
- 6
-
-
- 0
-
-
- 0
-
-
-
-
-
- Minimum radius of circle created by three consecutive points of a fiber
-
-
- 100.000000000000000
-
-
- 0.100000000000000
-
-
- 2.000000000000000
-
-
-
- -
-
-
- Remove whole fiber if it is exceeding the curvature threshold, otherwise remove only high curvature part.
-
-
- Remove Fiber
-
-
- true
-
-
-
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 200
- 16777215
-
-
-
-
- 11
-
-
-
- Mirror fibers around specified axis.
-
-
- Mirror Fibers
-
-
-
- -
-
-
- 0
-
-
- 3
-
-
- 3
-
-
-
-
- Sagittal
-
-
- -
-
- Coronal
-
-
- -
-
- Axial
-
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 200
- 16777215
-
-
-
-
- 11
-
-
-
- Apply float image values (0-1) as color coding to the selected fiber bundle.
-
-
- Color By Scalar Map
-
-
-
-
-
-
- -
Fiber Statistics
-
Courier 10 Pitch
false
true
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.cpp
index dfa9bd2b38..9d15e64db4 100644
--- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.cpp
+++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkFiberProcessingView.cpp
@@ -1,1703 +1,479 @@
/*===================================================================
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.
===================================================================*/
// Blueberry
#include
#include
// Qmitk
#include "QmitkFiberProcessingView.h"
#include
// Qt
#include
// MITK
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// ITK
#include
#include
#include
#include
#include
#include
#include
#include
const std::string QmitkFiberProcessingView::VIEW_ID = "org.mitk.views.fiberprocessing";
const std::string id_DataManager = "org.mitk.views.datamanager";
using namespace mitk;
QmitkFiberProcessingView::QmitkFiberProcessingView()
: QmitkFunctionality()
, m_Controls( 0 )
, m_MultiWidget( NULL )
- , m_CircleCounter(0)
- , m_PolygonCounter(0)
, m_UpsamplingFactor(5)
{
}
// Destructor
QmitkFiberProcessingView::~QmitkFiberProcessingView()
{
}
void QmitkFiberProcessingView::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::QmitkFiberProcessingViewControls;
m_Controls->setupUi( parent );
- m_Controls->doExtractFibersButton->setDisabled(true);
- m_Controls->PFCompoANDButton->setDisabled(true);
- m_Controls->PFCompoORButton->setDisabled(true);
- m_Controls->PFCompoNOTButton->setDisabled(true);
- m_Controls->m_PlanarFigureButtonsFrame->setEnabled(false);
- m_Controls->m_RectangleButton->setVisible(false);
-
- connect( m_Controls->doExtractFibersButton, SIGNAL(clicked()), this, SLOT(DoFiberExtraction()) );
- connect( m_Controls->m_CircleButton, SIGNAL( clicked() ), this, SLOT( OnDrawCircle() ) );
- connect( m_Controls->m_PolygonButton, SIGNAL( clicked() ), this, SLOT( OnDrawPolygon() ) );
- connect(m_Controls->PFCompoANDButton, SIGNAL(clicked()), this, SLOT(GenerateAndComposite()) );
- connect(m_Controls->PFCompoORButton, SIGNAL(clicked()), this, SLOT(GenerateOrComposite()) );
- connect(m_Controls->PFCompoNOTButton, SIGNAL(clicked()), this, SLOT(GenerateNotComposite()) );
- connect(m_Controls->m_JoinBundles, SIGNAL(clicked()), this, SLOT(JoinBundles()) );
- connect(m_Controls->m_SubstractBundles, SIGNAL(clicked()), this, SLOT(SubstractBundles()) );
- connect(m_Controls->m_GenerateRoiImage, SIGNAL(clicked()), this, SLOT(GenerateRoiImage()) );
- connect(m_Controls->m_Extract3dButton, SIGNAL(clicked()), this, SLOT(Extract3d()));
+
connect( m_Controls->m_ProcessFiberBundleButton, SIGNAL(clicked()), this, SLOT(ProcessSelectedBundles()) );
connect( m_Controls->m_ResampleFibersButton, SIGNAL(clicked()), this, SLOT(ResampleSelectedBundles()) );
connect(m_Controls->m_FaColorFibersButton, SIGNAL(clicked()), this, SLOT(DoImageColorCoding()));
connect( m_Controls->m_PruneFibersButton, SIGNAL(clicked()), this, SLOT(PruneBundle()) );
connect( m_Controls->m_CurvatureThresholdButton, SIGNAL(clicked()), this, SLOT(ApplyCurvatureThreshold()) );
connect( m_Controls->m_MirrorFibersButton, SIGNAL(clicked()), this, SLOT(MirrorFibers()) );
-
- connect( m_Controls->m_ExtractMask, SIGNAL(clicked()), this, SLOT(ExtractMask()) );
- }
-}
-
-void QmitkFiberProcessingView::ExtractMask()
-{
- if (m_MaskImageNode.IsNull())
- return;
-
- mitk::Image::Pointer mitkMask = dynamic_cast(m_MaskImageNode->GetData());
- for (int i=0; i(m_SelectedFB.at(i)->GetData());
- QString name(m_SelectedFB.at(i)->GetName().c_str());
-
- itkUCharImageType::Pointer mask = itkUCharImageType::New();
- mitk::CastToItkImage(mitkMask, mask);
- mitk::FiberBundleX::Pointer newFib = fib->ExtractFiberSubset(mask, false);
- DataNode::Pointer newNode = DataNode::New();
- newNode->SetData(newFib);
- name += "_ending-in-mask";
- newNode->SetName(name.toStdString());
- GetDefaultDataStorage()->Add(newNode);
- }
-}
-
-void QmitkFiberProcessingView::Extract3d()
-{
- if (m_MaskImageNode.IsNull())
- return;
-
- mitk::Image::Pointer mitkMask = dynamic_cast(m_MaskImageNode->GetData());
- for (int i=0; i(m_SelectedFB.at(i)->GetData());
- QString name(m_SelectedFB.at(i)->GetName().c_str());
-
- itkUCharImageType::Pointer mask = itkUCharImageType::New();
- mitk::CastToItkImage(mitkMask, mask);
- mitk::FiberBundleX::Pointer newFib = fib->ExtractFiberSubset(mask, true);
- DataNode::Pointer newNode = DataNode::New();
- newNode->SetData(newFib);
- name += "_passing-mask";
- newNode->SetName(name.toStdString());
- GetDefaultDataStorage()->Add(newNode);
- }
-}
-void QmitkFiberProcessingView::GenerateRoiImage(){
-
- if (m_SelectedPF.empty())
- return;
-
- mitk::Geometry3D::Pointer geometry;
- if (!m_SelectedFB.empty())
- {
- mitk::FiberBundleX::Pointer fib = dynamic_cast(m_SelectedFB.front()->GetData());
- geometry = fib->GetGeometry();
}
- else
- return;
-
- mitk::Vector3D spacing = geometry->GetSpacing();
- spacing /= m_UpsamplingFactor;
-
- mitk::Point3D newOrigin = geometry->GetOrigin();
- mitk::Geometry3D::BoundsArrayType bounds = geometry->GetBounds();
- newOrigin[0] += bounds.GetElement(0);
- newOrigin[1] += bounds.GetElement(2);
- newOrigin[2] += bounds.GetElement(4);
-
- itk::Matrix direction;
- itk::ImageRegion<3> imageRegion;
- for (int i=0; i<3; i++)
- for (int j=0; j<3; j++)
- direction[j][i] = geometry->GetMatrixColumn(i)[j]/spacing[j];
- imageRegion.SetSize(0, geometry->GetExtent(0)*m_UpsamplingFactor);
- imageRegion.SetSize(1, geometry->GetExtent(1)*m_UpsamplingFactor);
- imageRegion.SetSize(2, geometry->GetExtent(2)*m_UpsamplingFactor);
-
- m_PlanarFigureImage = itkUCharImageType::New();
- m_PlanarFigureImage->SetSpacing( spacing ); // Set the image spacing
- m_PlanarFigureImage->SetOrigin( newOrigin ); // Set the image origin
- m_PlanarFigureImage->SetDirection( direction ); // Set the image direction
- m_PlanarFigureImage->SetRegions( imageRegion );
- m_PlanarFigureImage->Allocate();
- m_PlanarFigureImage->FillBuffer( 0 );
-
- Image::Pointer tmpImage = Image::New();
- tmpImage->InitializeByItk(m_PlanarFigureImage.GetPointer());
- tmpImage->SetVolume(m_PlanarFigureImage->GetBufferPointer());
-
- for (int i=0; iInitializeByItk(m_PlanarFigureImage.GetPointer());
- tmpImage->SetVolume(m_PlanarFigureImage->GetBufferPointer());
- node->SetData(tmpImage);
- node->SetName("ROI Image");
- this->GetDefaultDataStorage()->Add(node);
-}
-
-void QmitkFiberProcessingView::CompositeExtraction(mitk::DataNode::Pointer node, mitk::Image* image)
-{
- if (dynamic_cast(node.GetPointer()->GetData()) && !dynamic_cast(node.GetPointer()->GetData()))
- {
- m_PlanarFigure = dynamic_cast(node.GetPointer()->GetData());
- AccessFixedDimensionByItk_2(
- image,
- InternalReorientImagePlane, 3,
- m_PlanarFigure->GetGeometry(), -1);
-
- // itk::Image< unsigned char, 3 >::Pointer outimage = itk::Image< unsigned char, 3 >::New();
-
- // outimage->SetSpacing( m_PlanarFigure->GetGeometry()->GetSpacing()/m_UpsamplingFactor ); // Set the image spacing
-
- // mitk::Point3D origin = m_PlanarFigure->GetGeometry()->GetOrigin();
- // mitk::Point3D indexOrigin;
- // m_PlanarFigure->GetGeometry()->WorldToIndex(origin, indexOrigin);
- // indexOrigin[0] = indexOrigin[0] - .5 * (1.0-1.0/m_UpsamplingFactor);
- // indexOrigin[1] = indexOrigin[1] - .5 * (1.0-1.0/m_UpsamplingFactor);
- // indexOrigin[2] = indexOrigin[2] - .5 * (1.0-1.0/m_UpsamplingFactor);
- // mitk::Point3D newOrigin;
- // m_PlanarFigure->GetGeometry()->IndexToWorld(indexOrigin, newOrigin);
-
- // outimage->SetOrigin( newOrigin ); // Set the image origin
- // itk::Matrix matrix;
- // for (int i=0; i<3; i++)
- // for (int j=0; j<3; j++)
- // matrix[j][i] = m_PlanarFigure->GetGeometry()->GetMatrixColumn(i)[j]/m_PlanarFigure->GetGeometry()->GetSpacing().GetElement(i);
- // outimage->SetDirection( matrix ); // Set the image direction
-
- // itk::ImageRegion<3> upsampledRegion;
- // upsampledRegion.SetSize(0, m_PlanarFigure->GetGeometry()->GetParametricExtentInMM(0)/m_PlanarFigure->GetGeometry()->GetSpacing()[0]);
- // upsampledRegion.SetSize(1, m_PlanarFigure->GetGeometry()->GetParametricExtentInMM(1)/m_PlanarFigure->GetGeometry()->GetSpacing()[1]);
- // upsampledRegion.SetSize(2, 1);
-
- // typename itk::Image< unsigned char, 3 >::RegionType::SizeType upsampledSize = upsampledRegion.GetSize();
- // for (unsigned int n = 0; n < 2; n++)
- // {
- // upsampledSize[n] = upsampledSize[n] * m_UpsamplingFactor;
- // }
- // upsampledRegion.SetSize( upsampledSize );
- // outimage->SetRegions( upsampledRegion );
-
- // outimage->Allocate();
-
- // this->m_InternalImage = mitk::Image::New();
- // this->m_InternalImage->InitializeByItk( outimage.GetPointer() );
- // this->m_InternalImage->SetVolume( outimage->GetBufferPointer() );
-
- AccessFixedDimensionByItk_2(
- m_InternalImage,
- InternalCalculateMaskFromPlanarFigure,
- 3, 2, node->GetName() );
- }
-}
-
-template < typename TPixel, unsigned int VImageDimension >
-void QmitkFiberProcessingView::InternalReorientImagePlane(
- const itk::Image< TPixel, VImageDimension > *image, mitk::Geometry3D* planegeo3D, int additionalIndex )
-{
-
- MITK_DEBUG << "InternalReorientImagePlane() start";
-
- typedef itk::Image< TPixel, VImageDimension > ImageType;
- typedef itk::Image< float, VImageDimension > FloatImageType;
-
- typedef itk::ResampleImageFilter ResamplerType;
- typename ResamplerType::Pointer resampler = ResamplerType::New();
-
- mitk::PlaneGeometry* planegeo = dynamic_cast(planegeo3D);
-
- float upsamp = m_UpsamplingFactor;
- float gausssigma = 0.5;
-
- // Spacing
- typename ResamplerType::SpacingType spacing = planegeo->GetSpacing();
- spacing[0] = image->GetSpacing()[0] / upsamp;
- spacing[1] = image->GetSpacing()[1] / upsamp;
- spacing[2] = image->GetSpacing()[2];
- resampler->SetOutputSpacing( spacing );
-
- // Size
- typename ResamplerType::SizeType size;
- size[0] = planegeo->GetParametricExtentInMM(0) / spacing[0];
- size[1] = planegeo->GetParametricExtentInMM(1) / spacing[1];
- size[2] = 1;
- resampler->SetSize( size );
-
- // Origin
- typename mitk::Point3D orig = planegeo->GetOrigin();
- typename mitk::Point3D corrorig;
- planegeo3D->WorldToIndex(orig,corrorig);
- corrorig[0] += 0.5/upsamp;
- corrorig[1] += 0.5/upsamp;
- corrorig[2] += 0;
- planegeo3D->IndexToWorld(corrorig,corrorig);
- resampler->SetOutputOrigin(corrorig );
-
- // Direction
- typename ResamplerType::DirectionType direction;
- typename mitk::AffineTransform3D::MatrixType matrix = planegeo->GetIndexToWorldTransform()->GetMatrix();
- for(int c=0; cSetOutputDirection( direction );
-
- // Gaussian interpolation
- if(gausssigma != 0)
- {
- double sigma[3];
- for( unsigned int d = 0; d < 3; d++ )
- {
- sigma[d] = gausssigma * image->GetSpacing()[d];
- }
- double alpha = 2.0;
-
- typedef itk::GaussianInterpolateImageFunction
- GaussianInterpolatorType;
-
- typename GaussianInterpolatorType::Pointer interpolator
- = GaussianInterpolatorType::New();
-
- interpolator->SetInputImage( image );
- interpolator->SetParameters( sigma, alpha );
-
- resampler->SetInterpolator( interpolator );
- }
- else
- {
- // typedef typename itk::BSplineInterpolateImageFunction
- // InterpolatorType;
- typedef typename itk::LinearInterpolateImageFunction InterpolatorType;
-
- typename InterpolatorType::Pointer interpolator
- = InterpolatorType::New();
-
- interpolator->SetInputImage( image );
-
- resampler->SetInterpolator( interpolator );
-
- }
-
- // Other resampling options
- resampler->SetInput( image );
- resampler->SetDefaultPixelValue(0);
-
- MITK_DEBUG << "Resampling requested image plane ... ";
- resampler->Update();
- MITK_DEBUG << " ... done";
-
- if(additionalIndex < 0)
- {
- this->m_InternalImage = mitk::Image::New();
- this->m_InternalImage->InitializeByItk( resampler->GetOutput() );
- this->m_InternalImage->SetVolume( resampler->GetOutput()->GetBufferPointer() );
- }
-}
-
-template < typename TPixel, unsigned int VImageDimension >
-void QmitkFiberProcessingView::InternalCalculateMaskFromPlanarFigure(
- itk::Image< TPixel, VImageDimension > *image, unsigned int axis, std::string nodeName )
-{
-
- MITK_DEBUG << "InternalCalculateMaskFromPlanarFigure() start";
-
- typedef itk::Image< TPixel, VImageDimension > ImageType;
- typedef itk::CastImageFilter< ImageType, itkUCharImageType > CastFilterType;
-
- // Generate mask image as new image with same header as input image and
- // initialize with "1".
- itkUCharImageType::Pointer newMaskImage = itkUCharImageType::New();
- newMaskImage->SetSpacing( image->GetSpacing() ); // Set the image spacing
- newMaskImage->SetOrigin( image->GetOrigin() ); // Set the image origin
- newMaskImage->SetDirection( image->GetDirection() ); // Set the image direction
- newMaskImage->SetRegions( image->GetLargestPossibleRegion() );
- newMaskImage->Allocate();
- newMaskImage->FillBuffer( 1 );
-
- // Generate VTK polygon from (closed) PlanarFigure polyline
- // (The polyline points are shifted by -0.5 in z-direction to make sure
- // that the extrusion filter, which afterwards elevates all points by +0.5
- // in z-direction, creates a 3D object which is cut by the the plane z=0)
- const Geometry2D *planarFigureGeometry2D = m_PlanarFigure->GetGeometry2D();
- const PlanarFigure::PolyLineType planarFigurePolyline = m_PlanarFigure->GetPolyLine( 0 );
- const Geometry3D *imageGeometry3D = m_InternalImage->GetGeometry( 0 );
-
- vtkPolyData *polyline = vtkPolyData::New();
- polyline->Allocate( 1, 1 );
-
- // Determine x- and y-dimensions depending on principal axis
- int i0, i1;
- switch ( axis )
- {
- case 0:
- i0 = 1;
- i1 = 2;
- break;
-
- case 1:
- i0 = 0;
- i1 = 2;
- break;
-
- case 2:
- default:
- i0 = 0;
- i1 = 1;
- break;
- }
-
- // Create VTK polydata object of polyline contour
- vtkPoints *points = vtkPoints::New();
- PlanarFigure::PolyLineType::const_iterator it;
- std::vector indices;
-
- unsigned int numberOfPoints = 0;
-
- for ( it = planarFigurePolyline.begin();
- it != planarFigurePolyline.end();
- ++it )
- {
- Point3D point3D;
-
- // Convert 2D point back to the local index coordinates of the selected
- // image
- Point2D point2D = it->Point;
- planarFigureGeometry2D->WorldToIndex(point2D, point2D);
- point2D[0] -= 0.5/m_UpsamplingFactor;
- point2D[1] -= 0.5/m_UpsamplingFactor;
- planarFigureGeometry2D->IndexToWorld(point2D, point2D);
- planarFigureGeometry2D->Map( point2D, point3D );
-
- // Polygons (partially) outside of the image bounds can not be processed
- // further due to a bug in vtkPolyDataToImageStencil
- if ( !imageGeometry3D->IsInside( point3D ) )
- {
- float bounds[2] = {0,0};
- bounds[0] =
- this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i0);
- bounds[1] =
- this->m_InternalImage->GetLargestPossibleRegion().GetSize().GetElement(i1);
-
- imageGeometry3D->WorldToIndex( point3D, point3D );
-
- // if (point3D[i0]<0)
- // point3D[i0] = 0.5;
- // else if (point3D[i0]>bounds[0])
- // point3D[i0] = bounds[0]-0.5;
-
- // if (point3D[i1]<0)
- // point3D[i1] = 0.5;
- // else if (point3D[i1]>bounds[1])
- // point3D[i1] = bounds[1]-0.5;
-
- if (point3D[i0]<0)
- point3D[i0] = 0.0;
- else if (point3D[i0]>bounds[0])
- point3D[i0] = bounds[0]-0.001;
-
- if (point3D[i1]<0)
- point3D[i1] = 0.0;
- else if (point3D[i1]>bounds[1])
- point3D[i1] = bounds[1]-0.001;
-
- points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 );
- numberOfPoints++;
- }
- else
- {
- imageGeometry3D->WorldToIndex( point3D, point3D );
-
- // Add point to polyline array
- points->InsertNextPoint( point3D[i0], point3D[i1], -0.5 );
- numberOfPoints++;
- }
- }
- polyline->SetPoints( points );
- points->Delete();
-
- vtkIdType *ptIds = new vtkIdType[numberOfPoints];
- for ( vtkIdType i = 0; i < numberOfPoints; ++i )
- {
- ptIds[i] = i;
- }
- polyline->InsertNextCell( VTK_POLY_LINE, numberOfPoints, ptIds );
-
-
- // Extrude the generated contour polygon
- vtkLinearExtrusionFilter *extrudeFilter = vtkLinearExtrusionFilter::New();
- extrudeFilter->SetInput( polyline );
- extrudeFilter->SetScaleFactor( 1 );
- extrudeFilter->SetExtrusionTypeToNormalExtrusion();
- extrudeFilter->SetVector( 0.0, 0.0, 1.0 );
-
- // Make a stencil from the extruded polygon
- vtkPolyDataToImageStencil *polyDataToImageStencil = vtkPolyDataToImageStencil::New();
- polyDataToImageStencil->SetInput( extrudeFilter->GetOutput() );
-
-
-
- // Export from ITK to VTK (to use a VTK filter)
- typedef itk::VTKImageImport< itkUCharImageType > ImageImportType;
- typedef itk::VTKImageExport< itkUCharImageType > ImageExportType;
-
- typename ImageExportType::Pointer itkExporter = ImageExportType::New();
- itkExporter->SetInput( newMaskImage );
-
- vtkImageImport *vtkImporter = vtkImageImport::New();
- this->ConnectPipelines( itkExporter, vtkImporter );
- vtkImporter->Update();
-
-
- // Apply the generated image stencil to the input image
- vtkImageStencil *imageStencilFilter = vtkImageStencil::New();
- imageStencilFilter->SetInputConnection( vtkImporter->GetOutputPort() );
- imageStencilFilter->SetStencil( polyDataToImageStencil->GetOutput() );
- imageStencilFilter->ReverseStencilOff();
- imageStencilFilter->SetBackgroundValue( 0 );
- imageStencilFilter->Update();
-
-
- // Export from VTK back to ITK
- vtkImageExport *vtkExporter = vtkImageExport::New();
- vtkExporter->SetInputConnection( imageStencilFilter->GetOutputPort() );
- vtkExporter->Update();
-
- typename ImageImportType::Pointer itkImporter = ImageImportType::New();
- this->ConnectPipelines( vtkExporter, itkImporter );
- itkImporter->Update();
-
- // calculate cropping bounding box
- m_InternalImageMask3D = itkImporter->GetOutput();
- m_InternalImageMask3D->SetDirection(image->GetDirection());
-
- itk::ImageRegionConstIterator
- itmask(m_InternalImageMask3D, m_InternalImageMask3D->GetLargestPossibleRegion());
- itk::ImageRegionIterator
- itimage(image, image->GetLargestPossibleRegion());
-
- itmask = itmask.Begin();
- itimage = itimage.Begin();
-
- typename ImageType::SizeType lowersize = {{9999999999,9999999999,9999999999}};
- typename ImageType::SizeType uppersize = {{0,0,0}};
- while( !itmask.IsAtEnd() )
- {
- if(itmask.Get() == 0)
- {
- itimage.Set(0);
- }
- else
- {
- typename ImageType::IndexType index = itimage.GetIndex();
- typename ImageType::SizeType signedindex;
- signedindex[0] = index[0];
- signedindex[1] = index[1];
- signedindex[2] = index[2];
-
- lowersize[0] = signedindex[0] < lowersize[0] ? signedindex[0] : lowersize[0];
- lowersize[1] = signedindex[1] < lowersize[1] ? signedindex[1] : lowersize[1];
- lowersize[2] = signedindex[2] < lowersize[2] ? signedindex[2] : lowersize[2];
-
- uppersize[0] = signedindex[0] > uppersize[0] ? signedindex[0] : uppersize[0];
- uppersize[1] = signedindex[1] > uppersize[1] ? signedindex[1] : uppersize[1];
- uppersize[2] = signedindex[2] > uppersize[2] ? signedindex[2] : uppersize[2];
- }
-
- ++itmask;
- ++itimage;
- }
-
- typename ImageType::IndexType index;
- index[0] = lowersize[0];
- index[1] = lowersize[1];
- index[2] = lowersize[2];
-
- typename ImageType::SizeType size;
- size[0] = uppersize[0] - lowersize[0] + 1;
- size[1] = uppersize[1] - lowersize[1] + 1;
- size[2] = uppersize[2] - lowersize[2] + 1;
-
- itk::ImageRegion<3> cropRegion = itk::ImageRegion<3>(index, size);
-
- // crop internal mask
- typedef itk::RegionOfInterestImageFilter< itkUCharImageType, itkUCharImageType > ROIMaskFilterType;
- typename ROIMaskFilterType::Pointer roi2 = ROIMaskFilterType::New();
- roi2->SetRegionOfInterest(cropRegion);
- roi2->SetInput(m_InternalImageMask3D);
- roi2->Update();
- m_InternalImageMask3D = roi2->GetOutput();
-
- Image::Pointer tmpImage = Image::New();
- tmpImage->InitializeByItk(m_InternalImageMask3D.GetPointer());
- tmpImage->SetVolume(m_InternalImageMask3D->GetBufferPointer());
-
- Image::Pointer tmpImage2 = Image::New();
- tmpImage2->InitializeByItk(m_PlanarFigureImage.GetPointer());
- const Geometry3D *pfImageGeometry3D = tmpImage2->GetGeometry( 0 );
-
- const Geometry3D *intImageGeometry3D = tmpImage->GetGeometry( 0 );
-
- typedef itk::ImageRegionIteratorWithIndex IteratorType;
- IteratorType imageIterator (m_InternalImageMask3D, m_InternalImageMask3D->GetRequestedRegion());
- imageIterator.GoToBegin();
- while ( !imageIterator.IsAtEnd() )
- {
- unsigned char val = imageIterator.Value();
- if (val>0)
- {
- itk::Index<3> index = imageIterator.GetIndex();
- Point3D point;
- point[0] = index[0];
- point[1] = index[1];
- point[2] = index[2];
-
- intImageGeometry3D->IndexToWorld(point, point);
- pfImageGeometry3D->WorldToIndex(point, point);
-
- point[i0] += 0.5;
- point[i1] += 0.5;
-
- index[0] = point[0];
- index[1] = point[1];
- index[2] = point[2];
-
- if (pfImageGeometry3D->IsIndexInside(index))
- m_PlanarFigureImage->SetPixel(index, 1);
- }
- ++imageIterator;
- }
-
- // Clean up VTK objects
- polyline->Delete();
- extrudeFilter->Delete();
- polyDataToImageStencil->Delete();
- vtkImporter->Delete();
- imageStencilFilter->Delete();
- //vtkExporter->Delete(); // TODO: crashes when outcommented; memory leak??
- delete[] ptIds;
-
}
void QmitkFiberProcessingView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
{
m_MultiWidget = &stdMultiWidget;
}
-
void QmitkFiberProcessingView::StdMultiWidgetNotAvailable()
{
m_MultiWidget = NULL;
}
-/* OnSelectionChanged is registered to SelectionService, therefore no need to
- implement SelectionService Listener explicitly */
-
void QmitkFiberProcessingView::UpdateGui()
{
- m_Controls->m_Extract3dButton->setEnabled(false);
- m_Controls->m_ExtractMask->setEnabled(false);
-
// are fiber bundles selected?
if ( m_SelectedFB.empty() )
{
m_Controls->m_InputData->setTitle("Please Select Input Data");
- m_Controls->m_JoinBundles->setEnabled(false);
- m_Controls->m_SubstractBundles->setEnabled(false);
m_Controls->m_ProcessFiberBundleButton->setEnabled(false);
- m_Controls->doExtractFibersButton->setEnabled(false);
m_Controls->m_ResampleFibersButton->setEnabled(false);
- m_Controls->m_PlanarFigureButtonsFrame->setEnabled(false);
m_Controls->m_FaColorFibersButton->setEnabled(false);
m_Controls->m_PruneFibersButton->setEnabled(false);
m_Controls->m_CurvatureThresholdButton->setEnabled(false);
if (m_SelectedSurfaces.size()>0)
m_Controls->m_MirrorFibersButton->setEnabled(true);
else
m_Controls->m_MirrorFibersButton->setEnabled(false);
}
else
{
m_Controls->m_InputData->setTitle("Input Data");
- m_Controls->m_PlanarFigureButtonsFrame->setEnabled(true);
m_Controls->m_ProcessFiberBundleButton->setEnabled(true);
m_Controls->m_ResampleFibersButton->setEnabled(true);
m_Controls->m_PruneFibersButton->setEnabled(true);
m_Controls->m_CurvatureThresholdButton->setEnabled(true);
m_Controls->m_MirrorFibersButton->setEnabled(true);
- // one bundle and one planar figure needed to extract fibers
- if (!m_SelectedPF.empty())
- {
- m_Controls->doExtractFibersButton->setEnabled(true);
- }
-
- // more than two bundles needed to join/subtract
- if (m_SelectedFB.size() > 1)
- {
- m_Controls->m_JoinBundles->setEnabled(true);
- m_Controls->m_SubstractBundles->setEnabled(true);
- }
- else
- {
- m_Controls->m_JoinBundles->setEnabled(false);
- m_Controls->m_SubstractBundles->setEnabled(false);
- }
-
if (m_SelectedImage.IsNotNull())
m_Controls->m_FaColorFibersButton->setEnabled(true);
-
- if (m_MaskImageNode.IsNotNull())
- {
- m_Controls->m_Extract3dButton->setEnabled(true);
- m_Controls->m_ExtractMask->setEnabled(true);
- }
- }
-
- // are planar figures selected?
- if ( m_SelectedPF.empty() )
- {
- m_Controls->doExtractFibersButton->setEnabled(false);
- m_Controls->PFCompoANDButton->setEnabled(false);
- m_Controls->PFCompoORButton->setEnabled(false);
- m_Controls->PFCompoNOTButton->setEnabled(false);
- m_Controls->m_GenerateRoiImage->setEnabled(false);
- }
- else
- {
- if ( !m_SelectedFB.empty() )
- m_Controls->m_GenerateRoiImage->setEnabled(true);
- else
- m_Controls->m_GenerateRoiImage->setEnabled(false);
-
- if (m_SelectedPF.size() > 1)
- {
- m_Controls->PFCompoANDButton->setEnabled(true);
- m_Controls->PFCompoORButton->setEnabled(true);
- m_Controls->PFCompoNOTButton->setEnabled(false);
- }
- else
- {
- m_Controls->PFCompoANDButton->setEnabled(false);
- m_Controls->PFCompoORButton->setEnabled(false);
- m_Controls->PFCompoNOTButton->setEnabled(true);
- }
}
}
void QmitkFiberProcessingView::OnSelectionChanged( std::vector nodes )
{
//reset existing Vectors containing FiberBundles and PlanarFigures from a previous selection
m_SelectedFB.clear();
- m_SelectedPF.clear();
m_SelectedSurfaces.clear();
m_SelectedImage = NULL;
- m_MaskImageNode = NULL;
m_Controls->m_FibLabel->setText("mandatory");
m_Controls->m_PfLabel->setText("needed for extraction");
for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it )
{
mitk::DataNode::Pointer node = *it;
if ( dynamic_cast(node->GetData()) )
{
m_Controls->m_FibLabel->setText(node->GetName().c_str());
m_SelectedFB.push_back(node);
}
- else if (dynamic_cast(node->GetData()))
- {
- m_Controls->m_PfLabel->setText(node->GetName().c_str());
- m_SelectedPF.push_back(node);
- }
else if (dynamic_cast(node->GetData()))
- {
m_SelectedImage = dynamic_cast(node->GetData());
-
- bool isBinary = false;
- node->GetPropertyValue("binary", isBinary);
- if (isBinary)
- m_MaskImageNode = node;
- }
else if (dynamic_cast(node->GetData()))
{
m_Controls->m_PfLabel->setText(node->GetName().c_str());
m_SelectedSurfaces.push_back(dynamic_cast(node->GetData()));
}
}
UpdateGui();
GenerateStats();
}
-void QmitkFiberProcessingView::OnDrawPolygon()
-{
- // bool checked = m_Controls->m_PolygonButton->isChecked();
- // if(!this->AssertDrawingIsPossible(checked))
- // return;
-
- mitk::PlanarPolygon::Pointer figure = mitk::PlanarPolygon::New();
- figure->ClosedOn();
- this->AddFigureToDataStorage(figure, QString("Polygon%1").arg(++m_PolygonCounter));
-
- MITK_DEBUG << "PlanarPolygon created ...";
-
- mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDefaultDataStorage()->GetAll();
- mitk::DataNode* node = 0;
- mitk::PlanarFigureInteractor::Pointer figureInteractor = 0;
- mitk::PlanarFigure* figureP = 0;
-
- for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End()
- ; it++)
- {
- node = const_cast(it->Value().GetPointer());
- figureP = dynamic_cast(node->GetData());
-
- if(figureP)
- {
- figureInteractor = dynamic_cast(node->GetInteractor());
-
- if(figureInteractor.IsNull())
- figureInteractor = mitk::PlanarFigureInteractor::New("PlanarFigureInteractor", node);
-
- mitk::GlobalInteraction::GetInstance()->AddInteractor(figureInteractor);
- }
- }
-
-}
-
-void QmitkFiberProcessingView::OnDrawCircle()
-{
- mitk::PlanarCircle::Pointer figure = mitk::PlanarCircle::New();
-
- this->AddFigureToDataStorage(figure, QString("Circle%1").arg(++m_CircleCounter));
-
- this->GetDataStorage()->Modified();
-
- mitk::DataStorage::SetOfObjects::ConstPointer _NodeSet = this->GetDefaultDataStorage()->GetAll();
- mitk::DataNode* node = 0;
- mitk::PlanarFigureInteractor::Pointer figureInteractor = 0;
- mitk::PlanarFigure* figureP = 0;
-
- for(mitk::DataStorage::SetOfObjects::ConstIterator it=_NodeSet->Begin(); it!=_NodeSet->End(); it++)
- {
- node = const_cast(it->Value().GetPointer());
- figureP = dynamic_cast(node->GetData());
-
- if(figureP)
- {
- figureInteractor = dynamic_cast(node->GetInteractor());
-
- if(figureInteractor.IsNull())
- figureInteractor = mitk::PlanarFigureInteractor::New("PlanarFigureInteractor", node);
-
- mitk::GlobalInteraction::GetInstance()->AddInteractor(figureInteractor);
- }
- }
-}
-
void QmitkFiberProcessingView::Activated()
{
}
-void QmitkFiberProcessingView::AddFigureToDataStorage(mitk::PlanarFigure* figure, const QString& name,
- const char *propertyKey, mitk::BaseProperty *property )
-{
- // initialize figure's geometry with empty geometry
- mitk::PlaneGeometry::Pointer emptygeometry = mitk::PlaneGeometry::New();
- figure->SetGeometry2D( emptygeometry );
-
- //set desired data to DataNode where Planarfigure is stored
- mitk::DataNode::Pointer newNode = mitk::DataNode::New();
- newNode->SetName(name.toStdString());
- newNode->SetData(figure);
-
- newNode->AddProperty( "planarfigure.default.line.color", mitk::ColorProperty::New(1.0,0.0,0.0));
- newNode->AddProperty( "planarfigure.line.width", mitk::FloatProperty::New(2.0));
- newNode->AddProperty( "planarfigure.drawshadow", mitk::BoolProperty::New(true));
-
- newNode->AddProperty( "selected", mitk::BoolProperty::New(true) );
- newNode->AddProperty( "planarfigure.ishovering", mitk::BoolProperty::New(true) );
- newNode->AddProperty( "planarfigure.drawoutline", mitk::BoolProperty::New(true) );
- newNode->AddProperty( "planarfigure.drawquantities", mitk::BoolProperty::New(false) );
- newNode->AddProperty( "planarfigure.drawshadow", mitk::BoolProperty::New(true) );
-
- newNode->AddProperty( "planarfigure.line.width", mitk::FloatProperty::New(3.0) );
- newNode->AddProperty( "planarfigure.shadow.widthmodifier", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.outline.width", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.helperline.width", mitk::FloatProperty::New(2.0) );
-
- newNode->AddProperty( "planarfigure.default.line.color", mitk::ColorProperty::New(1.0,1.0,1.0) );
- newNode->AddProperty( "planarfigure.default.line.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.default.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.default.outline.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.default.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.default.helperline.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.default.markerline.color", mitk::ColorProperty::New(0.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.default.markerline.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.default.marker.color", mitk::ColorProperty::New(1.0,1.0,1.0) );
- newNode->AddProperty( "planarfigure.default.marker.opacity",mitk::FloatProperty::New(2.0) );
-
- newNode->AddProperty( "planarfigure.hover.line.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.hover.line.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.hover.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.hover.outline.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.hover.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.hover.helperline.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.hover.markerline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.hover.markerline.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.hover.marker.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.hover.marker.opacity", mitk::FloatProperty::New(2.0) );
-
- newNode->AddProperty( "planarfigure.selected.line.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.selected.line.opacity",mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.selected.outline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.selected.outline.opacity", mitk::FloatProperty::New(2.0));
- newNode->AddProperty( "planarfigure.selected.helperline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.selected.helperline.opacity",mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.selected.markerline.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.selected.markerline.opacity", mitk::FloatProperty::New(2.0) );
- newNode->AddProperty( "planarfigure.selected.marker.color", mitk::ColorProperty::New(1.0,0.0,0.0) );
- newNode->AddProperty( "planarfigure.selected.marker.opacity",mitk::FloatProperty::New(2.0));
-
- // figure drawn on the topmost layer / image
- newNode->SetColor(1.0,1.0,1.0);
- newNode->SetOpacity(0.8);
- GetDataStorage()->Add(newNode );
-
- std::vector selectedNodes = GetDataManagerSelection();
- for(unsigned int i = 0; i < selectedNodes.size(); i++)
- {
- selectedNodes[i]->SetSelected(false);
- }
-
- newNode->SetSelected(true);
-}
-
-void QmitkFiberProcessingView::DoFiberExtraction()
-{
- if ( m_SelectedFB.empty() ){
- QMessageBox::information( NULL, "Warning", "No fibe bundle selected!");
- MITK_WARN("QmitkFiberProcessingView") << "no fibe bundle selected";
- return;
- }
-
- for (int i=0; i(m_SelectedFB.at(i)->GetData());
- mitk::PlanarFigure::Pointer roi = dynamic_cast (m_SelectedPF.at(0)->GetData());
-
- mitk::FiberBundleX::Pointer extFB = fib->ExtractFiberSubset(roi);
-
- if (extFB->GetNumFibers()<=0)
- continue;
-
- mitk::DataNode::Pointer node;
- node = mitk::DataNode::New();
- node->SetData(extFB);
- QString name(m_SelectedFB.at(i)->GetName().c_str());
- name += "_";
- name += m_SelectedPF.at(0)->GetName().c_str();
- node->SetName(name.toStdString());
- GetDataStorage()->Add(node);
- m_SelectedFB.at(i)->SetVisibility(false);
- }
-}
-
-void QmitkFiberProcessingView::GenerateAndComposite()
-{
- mitk::PlanarFigureComposite::Pointer PFCAnd = mitk::PlanarFigureComposite::New();
-
- mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D()));
- PFCAnd->SetGeometry2D(currentGeometry2D);
- PFCAnd->setOperationType(mitk::PFCOMPOSITION_AND_OPERATION);
-
- for( std::vector::iterator it = m_SelectedPF.begin();
- it != m_SelectedPF.end(); ++it )
- {
- mitk::DataNode::Pointer nodePF = *it;
- mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() );
- PFCAnd->addPlanarFigure( tmpPF );
- PFCAnd->addDataNode( nodePF );
- PFCAnd->setDisplayName("AND_COMPO");
- }
-
- AddCompositeToDatastorage(PFCAnd, NULL);
-}
-
-void QmitkFiberProcessingView::GenerateOrComposite()
-{
- mitk::PlanarFigureComposite::Pointer PFCOr = mitk::PlanarFigureComposite::New();
- mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D()));
- PFCOr->SetGeometry2D(currentGeometry2D);
- PFCOr->setOperationType(mitk::PFCOMPOSITION_OR_OPERATION);
-
- for( std::vector::iterator it = m_SelectedPF.begin();
- it != m_SelectedPF.end(); ++it )
- {
- mitk::DataNode::Pointer nodePF = *it;
- mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() );
- PFCOr->addPlanarFigure( tmpPF );
- PFCOr->addDataNode( nodePF );
- PFCOr->setDisplayName("OR_COMPO");
- }
-
- AddCompositeToDatastorage(PFCOr, NULL);
-}
-
-void QmitkFiberProcessingView::GenerateNotComposite()
-{
- mitk::PlanarFigureComposite::Pointer PFCNot = mitk::PlanarFigureComposite::New();
- mitk::PlaneGeometry* currentGeometry2D = dynamic_cast( const_cast(GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D()));
- PFCNot->SetGeometry2D(currentGeometry2D);
- PFCNot->setOperationType(mitk::PFCOMPOSITION_NOT_OPERATION);
-
- for( std::vector::iterator it = m_SelectedPF.begin();
- it != m_SelectedPF.end(); ++it )
- {
- mitk::DataNode::Pointer nodePF = *it;
- mitk::PlanarFigure::Pointer tmpPF = dynamic_cast( nodePF->GetData() );
- PFCNot->addPlanarFigure( tmpPF );
- PFCNot->addDataNode( nodePF );
- PFCNot->setDisplayName("NOT_COMPO");
- }
-
- AddCompositeToDatastorage(PFCNot, NULL);
-}
-
-/* CLEANUP NEEDED */
-void QmitkFiberProcessingView::AddCompositeToDatastorage(mitk::PlanarFigureComposite::Pointer pfcomp, mitk::DataNode::Pointer parentDataNode )
-{
- mitk::DataNode::Pointer newPFCNode;
- newPFCNode = mitk::DataNode::New();
- newPFCNode->SetName( pfcomp->getDisplayName() );
- newPFCNode->SetData(pfcomp);
- newPFCNode->SetVisibility(true);
-
- switch (pfcomp->getOperationType()) {
- case 0:
- {
- if (!parentDataNode.IsNull()) {
- GetDataStorage()->Add(newPFCNode, parentDataNode);
-
- } else {
- GetDataStorage()->Add(newPFCNode);
- }
-
- //iterate through its childs
- for(int i=0; igetNumberOfChildren(); ++i)
- {
- mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i);
- mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i);
-
- mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer());
- if ( !pfcompcast.IsNull() )
- {
- // child is of type planar Figure composite
- // make new node of the child, cuz later the child has to be removed of its old position in datamanager
- // feed new dataNode with information of the savedDataNode, which is gonna be removed soon
- mitk::DataNode::Pointer newChildPFCNode;
- newChildPFCNode = mitk::DataNode::New();
- newChildPFCNode->SetData(tmpPFchild);
- newChildPFCNode->SetName( savedPFchildNode->GetName() );
- pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user
-
- //update inside vector the dataNodePointer
- pfcomp->replaceDataNodeAt(i, newChildPFCNode);
-
- AddCompositeToDatastorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent
-
- // remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager
- // without having its parent anymore
- //GetDataStorage()->Remove(savedPFchildNode);
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
-
- }else{
- MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
- }
- // remove old child position in dataStorage
- GetDataStorage()->Remove(savedPFchildNode);
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
- }
- }
- else
- {
- // child is not of type PlanarFigureComposite, so its one of the planarFigures
- // create new dataNode containing the data of the old dataNode, but position in dataManager will be
- // modified cuz we re setting a (new) parent.
- mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New();
- newPFchildNode->SetName(savedPFchildNode->GetName() );
- newPFchildNode->SetData(tmpPFchild);
- newPFchildNode->SetVisibility(true);
-
- // replace the dataNode in PFComp DataNodeVector
- pfcomp->replaceDataNodeAt(i, newPFchildNode);
-
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
-
- }
- else
- {
- MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
- }
- // remove old child position in dataStorage
- GetDataStorage()->Remove(savedPFchildNode);
-
- if ( GetDataStorage()->Exists(savedPFchildNode))
- {
- MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
- }
-
- MITK_DEBUG << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName();
- //add new child to datamanager with its new position as child of newPFCNode parent
- GetDataStorage()->Add(newPFchildNode, newPFCNode);
- }
- }
- GetDataStorage()->Modified();
- break;
- }
- case 1:
- {
- if (!parentDataNode.IsNull()) {
- MITK_DEBUG << "adding " << newPFCNode->GetName() << " to " << parentDataNode->GetName() ;
- GetDataStorage()->Add(newPFCNode, parentDataNode);
-
- } else {
- MITK_DEBUG << "adding " << newPFCNode->GetName();
- GetDataStorage()->Add(newPFCNode);
-
- }
-
- for(int i=0; igetNumberOfChildren(); ++i)
- {
- mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i);
- mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i);
-
- mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer());
- if ( !pfcompcast.IsNull() )
- { // child is of type planar Figure composite
- // make new node of the child, cuz later the child has to be removed of its old position in datamanager
- // feed new dataNode with information of the savedDataNode, which is gonna be removed soon
- mitk::DataNode::Pointer newChildPFCNode;
- newChildPFCNode = mitk::DataNode::New();
- newChildPFCNode->SetData(tmpPFchild);
- newChildPFCNode->SetName( savedPFchildNode->GetName() );
- pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user
-
- //update inside vector the dataNodePointer
- pfcomp->replaceDataNodeAt(i, newChildPFCNode);
-
- AddCompositeToDatastorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent
-
-
- // remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager
- // without having its parent anymore
- //GetDataStorage()->Remove(savedPFchildNode);
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
-
- }else{
- MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
-
- }
- // remove old child position in dataStorage
- GetDataStorage()->Remove(savedPFchildNode);
-
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
- }
- } else {
-
- // child is not of type PlanarFigureComposite, so its one of the planarFigures
- // create new dataNode containing the data of the old dataNode, but position in dataManager will be
- // modified cuz we re setting a (new) parent.
- mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New();
- newPFchildNode->SetName(savedPFchildNode->GetName() );
- newPFchildNode->SetData(tmpPFchild);
- newPFchildNode->SetVisibility(true);
-
- // replace the dataNode in PFComp DataNodeVector
- pfcomp->replaceDataNodeAt(i, newPFchildNode);
-
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
-
- }else{
- MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
-
- }
- // remove old child position in dataStorage
- GetDataStorage()->Remove(savedPFchildNode);
-
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
- }
-
- MITK_DEBUG << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName();
- //add new child to datamanager with its new position as child of newPFCNode parent
- GetDataStorage()->Add(newPFchildNode, newPFCNode);
- }
- }
- GetDataStorage()->Modified();
- break;
- }
- case 2:
- {
- if (!parentDataNode.IsNull()) {
- MITK_DEBUG << "adding " << newPFCNode->GetName() << " to " << parentDataNode->GetName() ;
- GetDataStorage()->Add(newPFCNode, parentDataNode);
- }
- else
- {
- MITK_DEBUG << "adding " << newPFCNode->GetName();
- GetDataStorage()->Add(newPFCNode);
- }
-
-
- //iterate through its childs
-
- for(int i=0; igetNumberOfChildren(); ++i)
- {
- mitk::PlanarFigure::Pointer tmpPFchild = pfcomp->getChildAt(i);
- mitk::DataNode::Pointer savedPFchildNode = pfcomp->getDataNodeAt(i);
-
- mitk::PlanarFigureComposite::Pointer pfcompcast= dynamic_cast(tmpPFchild.GetPointer());
- if ( !pfcompcast.IsNull() )
- { // child is of type planar Figure composite
- // makeRemoveBundle new node of the child, cuz later the child has to be removed of its old position in datamanager
- // feed new dataNode with information of the savedDataNode, which is gonna be removed soon
- mitk::DataNode::Pointer newChildPFCNode;
- newChildPFCNode = mitk::DataNode::New();
- newChildPFCNode->SetData(tmpPFchild);
- newChildPFCNode->SetName( savedPFchildNode->GetName() );
- pfcompcast->setDisplayName( savedPFchildNode->GetName() ); //name might be changed in DataManager by user
-
- //update inside vector the dataNodePointer
- pfcomp->replaceDataNodeAt(i, newChildPFCNode);
-
- AddCompositeToDatastorage(pfcompcast, newPFCNode); //the current PFCNode becomes the childs parent
-
-
- // remove savedNode here, cuz otherwise its children will change their position in the dataNodeManager
- // without having its parent anymore
- //GetDataStorage()->Remove(savedPFchildNode);
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
-
- }else{
- MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
- }
- // remove old child position in dataStorage
- GetDataStorage()->Remove(savedPFchildNode);
-
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
- }
-
-
- } else {
-
- // child is not of type PlanarFigureComposite, so its one of the planarFigures
- // create new dataNode containing the data of the old dataNode, but position in dataManager will be
- // modified cuz we re setting a (new) parent.
- mitk::DataNode::Pointer newPFchildNode = mitk::DataNode::New();
- newPFchildNode->SetName(savedPFchildNode->GetName() );
- newPFchildNode->SetData(tmpPFchild);
- newPFchildNode->SetVisibility(true);
-
- // replace the dataNode in PFComp DataNodeVector
- pfcomp->replaceDataNodeAt(i, newPFchildNode);
-
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " exists in DS...trying to remove it";
-
- }else{
- MITK_DEBUG << "[ERROR] does NOT exist, but can I read its Name? " << savedPFchildNode->GetName();
-
- }
- // remove old child position in dataStorage
- GetDataStorage()->Remove(savedPFchildNode);
-
-
- if ( GetDataStorage()->Exists(savedPFchildNode)) {
- MITK_DEBUG << savedPFchildNode->GetName() << " still exists";
- }
-
- MITK_DEBUG << "adding " << newPFchildNode->GetName() << " to " << newPFCNode->GetName();
- //add new child to datamanager with its new position as child of newPFCNode parent
- GetDataStorage()->Add(newPFchildNode, newPFCNode);
- }
- }
- GetDataStorage()->Modified();
- break;
- }
- default:
- MITK_DEBUG << "we have an UNDEFINED composition... ERROR" ;
- break;
- }
-}
-
-
-void QmitkFiberProcessingView::JoinBundles()
-{
- if ( m_SelectedFB.size()<2 ){
- QMessageBox::information( NULL, "Warning", "Select at least two fiber bundles!");
- MITK_WARN("QmitkFiberProcessingView") << "Select at least two fiber bundles!";
- return;
- }
-
- std::vector::const_iterator it = m_SelectedFB.begin();
- mitk::FiberBundleX::Pointer newBundle = dynamic_cast((*it)->GetData());
- QString name("");
- name += QString((*it)->GetName().c_str());
- ++it;
- for (it; it!=m_SelectedFB.end(); ++it)
- {
- newBundle = newBundle->AddBundle(dynamic_cast((*it)->GetData()));
- name += "+"+QString((*it)->GetName().c_str());
- }
-
- mitk::DataNode::Pointer fbNode = mitk::DataNode::New();
- fbNode->SetData(newBundle);
- fbNode->SetName(name.toStdString());
- fbNode->SetVisibility(true);
- GetDataStorage()->Add(fbNode);
-}
-
-void QmitkFiberProcessingView::SubstractBundles()
-{
- if ( m_SelectedFB.size()<2 ){
- QMessageBox::information( NULL, "Warning", "Select at least two fiber bundles!");
- MITK_WARN("QmitkFiberProcessingView") << "Select at least two fiber bundles!";
- return;
- }
-
- std::vector::const_iterator it = m_SelectedFB.begin();
- mitk::FiberBundleX::Pointer newBundle = dynamic_cast((*it)->GetData());
- QString name("");
- name += QString((*it)->GetName().c_str());
- ++it;
- for (it; it!=m_SelectedFB.end(); ++it)
- {
- newBundle = newBundle->SubtractBundle(dynamic_cast((*it)->GetData()));
- if (newBundle.IsNull())
- break;
- name += "-"+QString((*it)->GetName().c_str());
- }
- if (newBundle.IsNull())
- {
- QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers. Did you select the fiber bundles in the correct order? X-Y is not equal to Y-X!");
- return;
- }
-
- mitk::DataNode::Pointer fbNode = mitk::DataNode::New();
- fbNode->SetData(newBundle);
- fbNode->SetName(name.toStdString());
- fbNode->SetVisibility(true);
- GetDataStorage()->Add(fbNode);
-}
-
void QmitkFiberProcessingView::PruneBundle()
{
int minLength = this->m_Controls->m_PruneFibersSpinBox->value();
int maxLength = this->m_Controls->m_MaxPruneFibersSpinBox->value();
for (int i=0; i(m_SelectedFB.at(i)->GetData());
if (!fib->RemoveShortFibers(minLength))
QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers.");
else if (!fib->RemoveLongFibers(maxLength))
QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers.");
}
GenerateStats();
RenderingManager::GetInstance()->RequestUpdateAll();
}
void QmitkFiberProcessingView::ApplyCurvatureThreshold()
{
int mm = this->m_Controls->m_MinCurvatureRadiusBox->value();
for (int i=0; i(m_SelectedFB.at(i)->GetData());
if (!fib->ApplyCurvatureThreshold(mm, this->m_Controls->m_RemoveFiberDueToCurvatureCheckbox->isChecked()))
QMessageBox::information(NULL, "No output generated:", "The resulting fiber bundle contains no fibers.");
}
GenerateStats();
RenderingManager::GetInstance()->RequestUpdateAll();
}
void QmitkFiberProcessingView::GenerateStats()
{
if ( m_SelectedFB.empty() )
return;
QString stats("");
for( int i=0; i(node->GetData()))
{
if (i>0)
stats += "\n-----------------------------\n";
stats += QString(node->GetName().c_str()) + "\n";
mitk::FiberBundleX::Pointer fib = dynamic_cast(node->GetData());
stats += "Number of fibers: "+ QString::number(fib->GetNumFibers()) + "\n";
stats += "Min. length: "+ QString::number(fib->GetMinFiberLength(),'f',1) + " mm\n";
stats += "Max. length: "+ QString::number(fib->GetMaxFiberLength(),'f',1) + " mm\n";
stats += "Mean length: "+ QString::number(fib->GetMeanFiberLength(),'f',1) + " mm\n";
stats += "Median length: "+ QString::number(fib->GetMedianFiberLength(),'f',1) + " mm\n";
stats += "Standard deviation: "+ QString::number(fib->GetLengthStDev(),'f',1) + " mm\n";
}
}
this->m_Controls->m_StatsTextEdit->setText(stats);
}
void QmitkFiberProcessingView::ProcessSelectedBundles()
{
if ( m_SelectedFB.empty() ){
QMessageBox::information( NULL, "Warning", "No fibe bundle selected!");
MITK_WARN("QmitkFiberProcessingView") << "no fibe bundle selected";
return;
}
int generationMethod = m_Controls->m_GenerationBox->currentIndex();
for( int i=0; i(node->GetData()))
{
mitk::FiberBundleX::Pointer fib = dynamic_cast(node->GetData());
QString name(node->GetName().c_str());
DataNode::Pointer newNode = NULL;
switch(generationMethod){
case 0:
newNode = GenerateTractDensityImage(fib, false, true);
name += "_TDI";
break;
case 1:
newNode = GenerateTractDensityImage(fib, false, false);
name += "_TDI";
break;
case 2:
newNode = GenerateTractDensityImage(fib, true, false);
name += "_envelope";
break;
case 3:
newNode = GenerateColorHeatmap(fib);
break;
case 4:
newNode = GenerateFiberEndingsImage(fib);
name += "_fiber_endings";
break;
case 5:
newNode = GenerateFiberEndingsPointSet(fib);
name += "_fiber_endings";
break;
}
if (newNode.IsNotNull())
{
newNode->SetName(name.toStdString());
GetDataStorage()->Add(newNode);
}
}
}
}
// generate pointset displaying the fiber endings
mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateFiberEndingsPointSet(mitk::FiberBundleX::Pointer fib)
{
mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
vtkSmartPointer fiberPolyData = fib->GetFiberPolyData();
vtkSmartPointer vLines = fiberPolyData->GetLines();
vLines->InitTraversal();
int count = 0;
int numFibers = fib->GetNumFibers();
for( int i=0; iGetNextCell ( numPoints, points );
if (numPoints>0)
{
double* point = fiberPolyData->GetPoint(points[0]);
itk::Point itkPoint;
itkPoint[0] = point[0];
itkPoint[1] = point[1];
itkPoint[2] = point[2];
pointSet->InsertPoint(count, itkPoint);
count++;
}
if (numPoints>2)
{
double* point = fiberPolyData->GetPoint(points[numPoints-1]);
itk::Point itkPoint;
itkPoint[0] = point[0];
itkPoint[1] = point[1];
itkPoint[2] = point[2];
pointSet->InsertPoint(count, itkPoint);
count++;
}
}
mitk::DataNode::Pointer node = mitk::DataNode::New();
node->SetData( pointSet );
return node;
}
// generate image displaying the fiber endings
mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateFiberEndingsImage(mitk::FiberBundleX::Pointer fib)
{
typedef unsigned char OutPixType;
typedef itk::Image OutImageType;
typedef itk::TractsToFiberEndingsImageFilter< OutImageType > ImageGeneratorType;
ImageGeneratorType::Pointer generator = ImageGeneratorType::New();
generator->SetFiberBundle(fib);
generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value());
if (m_SelectedImage.IsNotNull())
{
OutImageType::Pointer itkImage = OutImageType::New();
CastToItkImage(m_SelectedImage, itkImage);
generator->SetInputImage(itkImage);
generator->SetUseImageGeometry(true);
}
generator->Update();
// get output image
OutImageType::Pointer outImg = generator->GetOutput();
mitk::Image::Pointer img = mitk::Image::New();
img->InitializeByItk(outImg.GetPointer());
img->SetVolume(outImg->GetBufferPointer());
// init data node
mitk::DataNode::Pointer node = mitk::DataNode::New();
node->SetData(img);
return node;
}
// generate rgba heatmap from fiber bundle
mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateColorHeatmap(mitk::FiberBundleX::Pointer fib)
{
typedef itk::RGBAPixel OutPixType;
typedef itk::Image OutImageType;
typedef itk::TractsToRgbaImageFilter< OutImageType > ImageGeneratorType;
ImageGeneratorType::Pointer generator = ImageGeneratorType::New();
generator->SetFiberBundle(fib);
generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value());
if (m_SelectedImage.IsNotNull())
{
itk::Image::Pointer itkImage = itk::Image::New();
CastToItkImage(m_SelectedImage, itkImage);
generator->SetInputImage(itkImage);
generator->SetUseImageGeometry(true);
}
generator->Update();
// get output image
typedef itk::Image OutType;
OutType::Pointer outImg = generator->GetOutput();
mitk::Image::Pointer img = mitk::Image::New();
img->InitializeByItk(outImg.GetPointer());
img->SetVolume(outImg->GetBufferPointer());
// init data node
mitk::DataNode::Pointer node = mitk::DataNode::New();
node->SetData(img);
return node;
}
// generate tract density image from fiber bundle
mitk::DataNode::Pointer QmitkFiberProcessingView::GenerateTractDensityImage(mitk::FiberBundleX::Pointer fib, bool binary, bool absolute)
{
const mitk::Geometry2D* bla = GetActiveStdMultiWidget()->GetRenderWindow1()->GetRenderer()->GetCurrentWorldGeometry2D();
typedef float OutPixType;
typedef itk::Image OutImageType;
itk::TractDensityImageFilter< OutImageType >::Pointer generator = itk::TractDensityImageFilter< OutImageType >::New();
generator->SetFiberBundle(fib);
generator->SetBinaryOutput(binary);
generator->SetOutputAbsoluteValues(absolute);
generator->SetUpsamplingFactor(m_Controls->m_UpsamplingSpinBox->value());
if (m_SelectedImage.IsNotNull())
{
OutImageType::Pointer itkImage = OutImageType::New();
CastToItkImage(m_SelectedImage, itkImage);
generator->SetInputImage(itkImage);
generator->SetUseImageGeometry(true);
}
generator->Update();
// get output image
typedef itk::Image OutType;
OutType::Pointer outImg = generator->GetOutput();
mitk::Image::Pointer img = mitk::Image::New();
img->InitializeByItk(outImg.GetPointer());
img->SetVolume(outImg->GetBufferPointer());
// init data node
mitk::DataNode::Pointer node = mitk::DataNode::New();
node->SetData(img);
return node;
}
void QmitkFiberProcessingView::ResampleSelectedBundles()
{
int factor = this->m_Controls->m_ResampleFibersSpinBox->value();
for (int i=0; i(m_SelectedFB.at(i)->GetData());
fib->DoFiberSmoothing(factor);
}
GenerateStats();
RenderingManager::GetInstance()->RequestUpdateAll();
}
void QmitkFiberProcessingView::MirrorFibers()
{
unsigned int axis = this->m_Controls->m_AxisSelectionBox->currentIndex();
for (int i=0; i(m_SelectedFB.at(i)->GetData());
fib->MirrorFibers(axis);
}
if (m_SelectedFB.size()>0)
GenerateStats();
if (m_SelectedSurfaces.size()>0)
{
for (int i=0; i poly = surf->GetVtkPolyData();
vtkSmartPointer vtkNewPoints = vtkSmartPointer::New();
for (int i=0; i