00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "itkTimeProbe.h"
00019
00020 #include "QmitkDiffusionTensorEstimation.h"
00021 #include "QmitkDiffusionTensorEstimationControls.h"
00022 #include <qaction.h>
00023 #include "QmitkDataTreeComboBox.h"
00024 #include "QmitkDataTreeListView.h"
00025 #include "QmitkStdMultiWidget.h"
00026 #include "QmitkDiffusionTensorIcon.h"
00027 #include <qfiledialog.h>
00028 #include "QmitkPropertyViewFactory.h"
00029 #include <qobjectlist.h>
00030 #include <qlistbox.h>
00031 #include <qpushbutton.h>
00032 #include <qprogressbar.h>
00033 #include <qspinbox.h>
00034 #include <qlineedit.h>
00035 #include <qcheckbox.h>
00036
00037
00038 #include "mitkStringProperty.h"
00039 #include "mitkProperties.h"
00040 #include "mitkMaterialProperty.h"
00041 #include "mitkLevelWindowProperty.h"
00042 #include "mitkVtkRepresentationProperty.h"
00043 #include "mitkVtkInterpolationProperty.h"
00044 #include "mitkVtkScalarModeProperty.h"
00045 #include "mitkLookupTableProperty.h"
00046 #include "mitkLookupTable.h"
00047 #include "mitkTransferFunctionProperty.h"
00048 #include "mitkGridRepresentationProperty.h"
00049 #include "mitkGridVolumeMapperProperty.h"
00050 #include "mitkVtkResliceInterpolationProperty.h"
00051 #include "mitkVectorImageMapper2D.h"
00052 #include "mitkOdfVtkMapper2D.h"
00053
00054 #include "itkOrientedImage.h"
00055 #include "itkVectorImage.h"
00056 #include "itkImageSeriesReader.h"
00057 #include "itkImageFileWriter.h"
00058 #include "itkExceptionObject.h"
00059 #include "itkDiffusionTensor3DReconstructionImageFilter.h"
00060 #include "itkDiffusionTensor3D.h"
00061 #include "itkTensorFractionalAnisotropyImageFilter.h"
00062 #include "itkTensorRelativeAnisotropyImageFilter.h"
00063 #include "itkGDCMSeriesFileNames.h"
00064 #include "itkImageRegionConstIterator.h"
00065 #include "itkRescaleIntensityImageFilter.h"
00066 #include "itkDiffusionQballReconstructionImageFilter.h"
00067 #include "itkAnalyticalDiffusionQballReconstructionImageFilter.h"
00068 #include "itkPointShell.h"
00069 #include "itkRGBPixel.h"
00070 #include "itkOrientationDistributionFunction.h"
00071 #include "itkDiffusionQballPrincipleDirectionsImageFilter.h"
00072 #include "itkDiffusionQballGeneralizedFaImageFilter.h"
00073 #include "itkShiftScaleImageFilter.h"
00074 #include "itkDiffusionQballPrepareVisualizationImageFilter.h"
00075 #include "itkDiffusionTensorPrincipleDirectionImageFilter.h"
00076 #include "itkDiffusionQballSphericalDeconvolutionImageFilter.h"
00077 #include "itkVectorImagesAngularErrorImageFilter.h"
00078
00079 #include "mitkDicomDiffusionVolumeHeaderReader.h"
00080 #include "mitkGroupDiffusionHeadersFilter.h"
00081 #include "mitkDicomDiffusionVolumesReader.h"
00082 #include "mitkNrrdDiffusionVolumesWriter.h"
00083 #include "mitkNrrdDiffusionVolumesReader.h"
00084 #include "mitkDiffusionVolumes.h"
00085 #include "mitkDataTreeFilterFunctions.h"
00086 #include "mitkProgressBar.h"
00087 #include "mitkStatusBar.h"
00088 #include "mitkTeemDiffusionTensor3DReconstructionImageFilter.h"
00089 #include "mitkSurface.h"
00090 #include "mitkDataNodeFactory.h"
00091
00092 #include "vtkPolyData.h"
00093 #include "vtkPoints.h"
00094 #include "vtkCellArray.h"
00095 #include "vtkDelaunay2D.h"
00096 #include "vtkCleanPolyData.h"
00097 #include "vtkAppendPolyData.h"
00098
00099 #include "mitkImageCast.h"
00100
00101 #include <time.h>
00102 #include <stdio.h>
00103 #include <stdlib.h>
00104
00105 #define DIFF_EST_PI 3.14159265358979323846
00106
00107 typedef float TTensorPixelType;
00108 typedef itk::DiffusionTensor3D< TTensorPixelType > TensorPixelType;
00109 typedef itk::Image< TensorPixelType, 3 > TensorImageType;
00110
00111 typedef itk::VectorImage< DiffusionPixelType, 3 > DiffusionImageType;
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 const int QmitkDiffusionTensorEstimation::odfsize = 252;
00125 const int QmitkDiffusionTensorEstimation::nrconvkernels = 252;
00126
00127
00128 template <int Size, int Low = 1, int High = Size>
00129 struct Root;
00130 template <int Size, int Mid>
00131 struct Root<Size,Mid,Mid> {
00132 static const int root = Mid;
00133 };
00134 template <int Size, int Low, int High>
00135 struct Root {
00136 static const int mean = (Low + High)/2;
00137 static const bool down = (mean * mean >= Size);
00138 static const int root = Root<Size,
00139 (down ? Low : mean+1),
00140 (down ? mean : High) >::root;
00141 };
00142
00143 QmitkDiffusionTensorEstimation::QmitkDiffusionTensorEstimation(QObject *parent, const char *name, QmitkStdMultiWidget *mitkStdMultiWidget, mitk::DataTreeIteratorBase* it)
00144 : QmitkFunctionality(parent, name, it), m_MultiWidget(mitkStdMultiWidget), m_Controls(NULL)
00145 {
00146 SetAvailability(true);
00147 m_FilterInitialized = false;
00148 }
00149
00150 QmitkDiffusionTensorEstimation::~QmitkDiffusionTensorEstimation()
00151 {}
00152
00153 QWidget * QmitkDiffusionTensorEstimation::CreateMainWidget(QWidget *parent)
00154 {
00155 if ( m_MultiWidget == NULL )
00156 {
00157 m_MultiWidget = new QmitkStdMultiWidget( parent );
00158 }
00159 return m_MultiWidget;
00160 }
00161
00162 QWidget * QmitkDiffusionTensorEstimation::CreateControlWidget(QWidget *parent)
00163 {
00164 if (m_Controls == NULL)
00165 {
00166 m_Controls = new QmitkDiffusionTensorEstimationControls(parent);
00167 }
00168
00169 m_Controls->m_TensorEstimationTeemErrorImage->setChecked(false);
00170 m_Controls->m_TensorEstimationTeemSigmaEdit->setText("NaN");
00171 m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("LLS (Linear Least Squares)");
00172 m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("MLE (Maximum Likelihood)");
00173 m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("NLS (Nonlinear Least Squares)");
00174 m_Controls->m_TensorEstimationTeemEstimationMethodCombo->insertItem("WLS (Weighted Least Squares)");
00175 m_Controls->m_TensorEstimationTeemNumItsSpin->setValue(1);
00176 m_Controls->m_TensorEstimationTeemConfThresholdEdit->setText("NaN");
00177 m_Controls->m_TensorEstimationTeemFuzzyEdit->setText("0.0");
00178 m_Controls->m_TensorEstimationTeemMinValEdit->setText("1.0");
00179
00180 m_Controls->m_QBallReconstructionThreasholdEdit->setText("0.0");
00181 m_Controls->m_QBallStandardAlgorithmsOrderSpinbox->setValue(0);
00182 m_Controls->m_QBallStandardAlgorithmsProbThreshEdit->setText(QString::number(1.0/double(odfsize)));
00183 m_Controls->m_QBallReconstructionNumberThreadsSpinbox->setValue(4);
00184
00185 m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("2") );
00186 m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("4") );
00187 m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("6") );
00188 m_Controls->m_QBallReconstructionMaxLLevelComboBox->insertItem( QString("8") );
00189 m_Controls->m_QBallReconstructionMaxLLevelComboBox->setCurrentItem( 3 );
00190
00191 m_Controls->m_QBallReconstructionNumberThreadsAnalyticalSpinbox->setValue(4);
00192 m_Controls->m_QBallReconstructionThreasholdAnalyticalEdit->setText("0.0");
00193 m_Controls->m_QBallReconstructionLambdaLineEdit->setText("0.006");
00194
00195 m_Controls->m_QBallStandardAlgorithmsNumberThreadsSpinbox->setValue(4);
00196 m_Controls->m_QBallStandardAlgorithmsDeconvNumberThreadsSpinbox->setValue(4);
00197 m_Controls->m_QBallStandardAlgorithmsDeconvolutionThreshEdit->setText("0.1");
00198 m_Controls->m_QBallStandardAlgorithmsDeconvolutionAngResThresholdEdit->setText("15");
00199
00200 m_Controls->m_QBallStandardAlgorithmsGFAParam1->setText("2");
00201 m_Controls->m_QBallStandardAlgorithmsGFAParam2->setText("1");
00202
00203 return m_Controls;
00204 }
00205
00206 void QmitkDiffusionTensorEstimation::CreateConnections()
00207 {
00208 if ( m_Controls )
00209 {
00210 connect( (QObject*)(m_Controls->m_TensorEstimationButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorEstimationButton()));
00211 connect( (QObject*)(m_Controls->m_QBallReconstructionButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallReconstructionButton()));
00212 connect( (QObject*)(m_Controls->m_QBallReconstructionAnalyticalButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallReconstructionAnalyticalButton()));
00213 connect( (QObject*)(m_Controls->m_TensorEstimationTeemEstimateButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorEstimationTeemEstimateButton()));
00214
00215 connect( (QObject*)(m_Controls->m_TensorVolumesSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorVolumesSaveButton()));
00216 connect( (QObject*)(m_Controls->m_TensorVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorVolumesLoadButton()));
00217 connect( (QObject*)(m_Controls->m_TensorVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(TensorVolumesRemoveButton()));
00218 connect( (QObject*)(m_Controls->m_StandardAlgorithmsFAButton), SIGNAL(clicked()),(QObject*) this, SLOT(StandardAlgorithmsFAButton()));
00219 connect( (QObject*)(m_Controls->m_StandardAlgorithmsRAButton), SIGNAL(clicked()),(QObject*) this, SLOT(StandardAlgorithmsRAButton()));
00220 connect( (QObject*)(m_Controls->m_StandardAlgorithmsDirectionButton), SIGNAL(clicked()),(QObject*) this, SLOT(StandardAlgorithmsDirectionButton()));
00221
00222 connect( (QObject*)(m_Controls->m_QBallVolumesSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesSaveButton()));
00223 connect( (QObject*)(m_Controls->m_QBallVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesLoadButton()));
00224 connect( (QObject*)(m_Controls->m_QBallVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesRemoveButton()));
00225 connect( (QObject*)(m_Controls->m_QBallStandardAlgorithmsDirectionButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallStandardAlgorithmsDirectionButton()));
00226 connect( (QObject*)(m_Controls->m_QBallStandardAlgorithmsDeconvolutionButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallStandardAlgorithmsDeconvolutionButton()));
00227 connect( (QObject*)(m_Controls->m_QBallStandardAlgorithmsGFAButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallStandardAlgorithmsGFAButton()));
00228 connect( (QObject*)(m_Controls->m_QBallVolumesVisualizeSelectedButton), SIGNAL(clicked()),(QObject*) this, SLOT(QBallVolumesVisualizeSelectedButton()));
00229
00230 connect( (QObject*)(m_Controls->m_DirectionVolumesSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesSaveButton()));
00231 connect( (QObject*)(m_Controls->m_DirectionVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesLoadButton()));
00232 connect( (QObject*)(m_Controls->m_DirectionVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesRemoveButton()));
00233 connect( (QObject*)(m_Controls->m_DirectionVolumesAngularErrorButton), SIGNAL(clicked()),(QObject*) this, SLOT(DirectionVolumesAngularErrorButton()));
00234
00235 connect( (QObject*)(m_Controls->m_DiffusionVolumesLoadButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumesLoadButton()));
00236 connect( (QObject*)(m_Controls->m_DiffusionVolumeSaveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumeSaveButton()));
00237 connect( (QObject*)(m_Controls->m_DiffusionVolumesRemoveButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumesRemoveButton()));
00238 connect( (QObject*)(m_Controls->m_TensorEstimationDiffusionVolumesSelectAllButton), SIGNAL(clicked()),(QObject*) this, SLOT(DiffusionVolumesSelectAll()));
00239 }
00240 }
00241
00242 QAction * QmitkDiffusionTensorEstimation::CreateAction(QActionGroup *parent)
00243 {
00244
00245
00246
00247 QImage icon = qembed_findImage("QmitkDiffusionTensorEstimation");
00248 QPixmap pixmap(icon);
00249 QAction* action;
00250 action = new QAction( tr( "Diffusion Tensor Estimation" ), pixmap, tr( "QmitkDiffusionTensorEstimation menu" ), 0, parent, "QmitkDiffusionTensorEstimation" );
00251 return action;
00252 }
00253
00254 void QmitkDiffusionTensorEstimation::TreeChanged()
00255 {
00256 m_Controls->m_TensorEstimationDiffusionVolumesSelector->Update();
00257 m_Controls->m_TensorVolumesSelector->Update();
00258 m_Controls->m_QBallVolumesSelector->Update();
00259 m_Controls->m_DirectionVolumesSelector->Update();
00260
00261 if(m_DiffusionVolumesDataTreeFilter
00262 &&m_DiffusionVolumesDataTreeFilter->GetItems()->Size() > 0)
00263 {
00264 m_Controls->m_TensorEstimationButton->setEnabled(true);
00265 m_Controls->m_QBallReconstructionButton->setEnabled(true);
00266 m_Controls->m_QBallReconstructionAnalyticalButton->setEnabled(true);
00267 }
00268 else
00269 {
00270 m_Controls->m_QBallReconstructionButton->setEnabled(false);
00271 m_Controls->m_QBallReconstructionAnalyticalButton->setEnabled(false);
00272 m_Controls->m_TensorEstimationButton->setEnabled(false);
00273 }
00274
00275 if(m_TensorVolumesDataTreeFilter
00276 && m_TensorVolumesDataTreeFilter->GetItems()->Size() > 0)
00277 {
00278 m_Controls->m_TensorVolumesSaveButton->setEnabled(true);
00279 m_Controls->m_TensorVolumesRemoveButton->setEnabled(true);
00280 }
00281 else
00282 {
00283 m_Controls->m_TensorVolumesSaveButton->setEnabled(false);
00284 m_Controls->m_TensorVolumesRemoveButton->setEnabled(false);
00285 }
00286
00287 if(m_QballVolumesDataTreeFilter
00288 && m_QballVolumesDataTreeFilter->GetItems()->Size() > 0)
00289 {
00290 m_Controls->m_QBallVolumesSaveButton->setEnabled(true);
00291 m_Controls->m_QBallVolumesRemoveButton->setEnabled(true);
00292 m_Controls->m_QBallVolumesVisualizeSelectedButton->setEnabled(true);
00293 }
00294 else
00295 {
00296 m_Controls->m_QBallVolumesSaveButton->setEnabled(false);
00297 m_Controls->m_QBallVolumesRemoveButton->setEnabled(false);
00298 m_Controls->m_QBallVolumesVisualizeSelectedButton->setEnabled(false);
00299 }
00300
00301 if(m_DirectionVolumesDataTreeFilter
00302 && m_DirectionVolumesDataTreeFilter->GetItems()->Size() > 0)
00303 {
00304 m_Controls->m_DirectionVolumesSaveButton->setEnabled(true);
00305 m_Controls->m_DirectionVolumesRemoveButton->setEnabled(true);
00306 }
00307 else
00308 {
00309 m_Controls->m_DirectionVolumesSaveButton->setEnabled(false);
00310 m_Controls->m_DirectionVolumesRemoveButton->setEnabled(false);
00311 }
00312
00313 if(m_DirectionVolumesDataTreeFilter
00314 && m_DirectionVolumesDataTreeFilter->GetItems()->Size() > 1)
00315 {
00316 m_Controls->m_DirectionVolumesAngularErrorButton->setEnabled(true);
00317 }
00318 else
00319 {
00320 m_Controls->m_DirectionVolumesAngularErrorButton->setEnabled(false);
00321 }
00322 }
00323
00324 void QmitkDiffusionTensorEstimation::Activated()
00325 {
00326 QmitkFunctionality::Activated();
00327
00328 if (m_FilterInitialized)
00329 return;
00330
00331
00332 m_DiffusionVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() );
00333 m_DiffusionVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::MULTI_SELECT);
00334 m_DiffusionVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY);
00335 m_DiffusionVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataType<mitk::DiffusionVolumes<short> >() );
00336
00337 mitk::DataTreeFilter::PropertyList visible_props;
00338 visible_props.push_back("name");
00339 m_DiffusionVolumesDataTreeFilter->SetVisibleProperties(visible_props);
00340
00341 mitk::DataTreeFilter::PropertyList property_labels;
00342 property_labels.push_back("Diffusion Volumes");
00343 m_DiffusionVolumesDataTreeFilter->SetPropertiesLabels(property_labels);
00344
00345 m_Controls->m_TensorEstimationDiffusionVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() );
00346 m_Controls->m_TensorEstimationDiffusionVolumesSelector->SetFilter( m_DiffusionVolumesDataTreeFilter );
00347 m_Controls->m_TensorEstimationDiffusionVolumesSelector->SetAutoUpdate( false );
00348 m_Controls->m_TensorEstimationDiffusionVolumesSelector->setStretchedColumn(1);
00349
00350
00351 m_TensorVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() );
00352 m_TensorVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::SINGLE_SELECT);
00353 m_TensorVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY);
00354 m_TensorVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataTypeWithBoolProperty<mitk::Image>("IsTensorVolume") );
00355
00356 m_TensorVolumesDataTreeFilter->SetVisibleProperties(visible_props);
00357
00358 mitk::DataTreeFilter::PropertyList tensor_property_labels;
00359 tensor_property_labels.push_back("Tensor Volumes");
00360 m_TensorVolumesDataTreeFilter->SetPropertiesLabels(tensor_property_labels);
00361
00362 m_Controls->m_TensorVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() );
00363 m_Controls->m_TensorVolumesSelector->SetFilter( m_TensorVolumesDataTreeFilter );
00364 m_Controls->m_TensorVolumesSelector->SetAutoUpdate( false );
00365 m_Controls->m_TensorVolumesSelector->setStretchedColumn(1);
00366
00367
00368 m_QballVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() );
00369 m_QballVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::MULTI_SELECT);
00370 m_QballVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY);
00371 m_QballVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataTypeWithBoolProperty<mitk::Image>("IsQBallVolume") );
00372
00373 m_QballVolumesDataTreeFilter->SetVisibleProperties(visible_props);
00374
00375 mitk::DataTreeFilter::PropertyList qball_property_labels;
00376 qball_property_labels.push_back("Q-Ball Volumes");
00377 m_QballVolumesDataTreeFilter->SetPropertiesLabels(qball_property_labels);
00378
00379 m_Controls->m_QBallVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() );
00380 m_Controls->m_QBallVolumesSelector->SetFilter( m_QballVolumesDataTreeFilter );
00381 m_Controls->m_QBallVolumesSelector->SetAutoUpdate( false );
00382 m_Controls->m_QBallVolumesSelector->setStretchedColumn(1);
00383
00384
00385 m_DirectionVolumesDataTreeFilter = mitk::DataTreeFilter::New( GetDataTreeIterator()->GetTree() );
00386 m_DirectionVolumesDataTreeFilter->SetSelectionMode(mitk::DataTreeFilter::MULTI_SELECT);
00387 m_DirectionVolumesDataTreeFilter->SetHierarchyHandling(mitk::DataTreeFilter::FLATTEN_HIERARCHY);
00388 m_DirectionVolumesDataTreeFilter->SetFilter( mitk::IsBaseDataTypeWithBoolProperty<mitk::Image>("IsDirectionVolume") );
00389
00390 m_DirectionVolumesDataTreeFilter->SetVisibleProperties(visible_props);
00391
00392 mitk::DataTreeFilter::PropertyList direction_property_labels;
00393 direction_property_labels.push_back("Direction Volumes");
00394 m_DirectionVolumesDataTreeFilter->SetPropertiesLabels(direction_property_labels);
00395
00396 m_Controls->m_DirectionVolumesSelector->SetDataTree( GetDataTreeIterator()->GetTree() );
00397 m_Controls->m_DirectionVolumesSelector->SetFilter( m_DirectionVolumesDataTreeFilter );
00398 m_Controls->m_DirectionVolumesSelector->SetAutoUpdate( false );
00399 m_Controls->m_DirectionVolumesSelector->setStretchedColumn(1);
00400
00401 m_FilterInitialized = true;
00402
00403 TreeChanged();
00404
00405 }
00406
00407
00408 void QmitkDiffusionTensorEstimation::TensorVolumesSaveButton()
00409 {
00410
00411 const mitk::DataTreeFilter::Item* selectedItem
00412 = m_TensorVolumesDataTreeFilter->GetSelectedItem();
00413 if( !selectedItem )
00414 return;
00415 mitk::Image::Pointer tensorVol =
00416 static_cast<mitk::Image*>(selectedItem->GetNode()->GetData());
00417 TensorImageType::Pointer itkTensorVol =
00418 TensorImageType::New();
00419 mitk::CastToItkImage<TensorImageType>(tensorVol, itkTensorVol);
00420
00421
00422 std::string sName = selectedItem->GetNode()->GetName();
00423 QString qName;
00424 qName.sprintf("%s.nhdr",sName.c_str());
00425 QString filename = QFileDialog::getSaveFileName(
00426 qName,
00427 "Nrrd Images (*.nrrd *.nhdr)",
00428 this->m_Controls,
00429 "save file dialog",
00430 "Select Nrrd Outputfile" );
00431 if ( !filename )
00432 return;
00433
00434
00435 MBI_INFO << "Writing tensors ";
00436 typedef itk::ImageFileWriter<TensorImageType> TensorWriterType;
00437 TensorWriterType::Pointer tensorWriter = TensorWriterType::New();
00438 tensorWriter->SetFileName(filename.ascii());
00439 tensorWriter->SetInput(itkTensorVol);
00440 tensorWriter->Update();
00441 }
00442
00443 void QmitkDiffusionTensorEstimation::TensorVolumesLoadButton()
00444 {
00445
00446 QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE );
00447 w->setMode( QFileDialog::ExistingFiles );
00448 w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" );
00449
00450
00451 if ( w->exec() != QDialog::Accepted )
00452 return;
00453
00454 QStringList filenames = w->selectedFiles();
00455 QStringList::Iterator it = filenames.begin();
00456 while( it != filenames.end() ) {
00457 std::string filename = ( *it ).ascii();
00458 ++it;
00459
00460
00461 typedef itk::ImageFileReader<TensorImageType> ReaderType;
00462 ReaderType::Pointer tensorReader = ReaderType::New();
00463 tensorReader->SetFileName(filename);
00464 try
00465 {
00466 tensorReader->Update();
00467 }
00468 catch (itk::ExceptionObject e)
00469 {
00470 std::cout << e << std::endl;
00471 }
00472
00473
00474 mitk::Image::Pointer image = mitk::Image::New();
00475 image->InitializeByItk( tensorReader->GetOutput() );
00476 image->SetVolume( tensorReader->GetOutput()->GetBufferPointer() );
00477 mitk::DataNode::Pointer node=mitk::DataNode::New();
00478 node->SetData( image );
00479 mitk::DataStorage::GetInstance()->Add(node);
00480 SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename));
00481 node->SetProperty( "IsTensorVolume", mitk::BoolProperty::New( true ) );
00482
00483 TreeChanged();
00484 }
00485 }
00486
00487 void QmitkDiffusionTensorEstimation::TensorVolumesRemoveButton()
00488 {
00489 m_TensorVolumesDataTreeFilter->DeleteSelectedItems();
00490 }
00491
00492 void QmitkDiffusionTensorEstimation::QBallVolumesSaveButton()
00493 {
00494
00495 const mitk::DataTreeFilter::Item* selectedItem
00496 = m_QballVolumesDataTreeFilter->GetSelectedItem();
00497 if( !selectedItem ) return;
00498
00499 mitk::Image::Pointer qBallVol =
00500 static_cast<mitk::Image*>(selectedItem->GetNode()->GetData());
00501 if( !qBallVol)return;
00502
00503 typedef itk::Image<itk::Vector<TTensorPixelType,odfsize>,3 > IType;
00504 IType::Pointer itkQBallVol = IType::New();
00505 mitk::CastToItkImage<IType>(qBallVol, itkQBallVol);
00506
00507 typedef itk::VectorImage<TTensorPixelType, 3> VarVecImgType;
00508 VarVecImgType::Pointer vecImg = VarVecImgType::New();
00509 vecImg->SetSpacing( itkQBallVol->GetSpacing() );
00510 vecImg->SetOrigin( itkQBallVol->GetOrigin() );
00511 vecImg->SetDirection( itkQBallVol->GetDirection() );
00512 vecImg->SetLargestPossibleRegion( itkQBallVol->GetLargestPossibleRegion());
00513 vecImg->SetBufferedRegion( itkQBallVol->GetLargestPossibleRegion() );
00514 vecImg->SetVectorLength(odfsize);
00515 vecImg->Allocate();
00516 itk::ImageRegionIterator<VarVecImgType> ot (vecImg, vecImg->GetLargestPossibleRegion() );
00517 ot = ot.Begin();
00518
00519 itk::ImageRegionIterator<IType> it (itkQBallVol, itkQBallVol->GetLargestPossibleRegion() );
00520 it = it.Begin();
00521 MBI_DEBUG << it.Get();
00522 for (it = it.Begin(); !it.IsAtEnd(); ++it)
00523 {
00524 itk::Vector<TTensorPixelType,odfsize> vec = it.Get();
00525 VarVecImgType::PixelType varvec(vec.GetDataPointer(), odfsize);
00526 ot.Set(varvec);
00527 ++ot;
00528 }
00529
00530
00531 std::string sName = selectedItem->GetNode()->GetName();
00532 QString qName;
00533 qName.sprintf("%s.nhdr",sName.c_str());
00534 QString filename = QFileDialog::getSaveFileName(
00535 qName,
00536 "Nrrd Images (*.nrrd *.nhdr)",
00537 this->m_Controls,
00538 "save file dialog",
00539 "Select Nrrd Outputfile" );
00540 if ( !filename )
00541 return;
00542
00543
00544 MBI_INFO << "Writing data ";
00545 typedef itk::ImageFileWriter<VarVecImgType> QBallWriterType;
00546 QBallWriterType::Pointer qballWriter = QBallWriterType::New();
00547 qballWriter->SetFileName(filename.ascii());
00548 qballWriter->SetInput(vecImg);
00549 qballWriter->Update();
00550 }
00551
00552 void QmitkDiffusionTensorEstimation::QBallVolumesLoadButton()
00553 {
00554
00555 QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE );
00556 w->setMode( QFileDialog::ExistingFiles );
00557 w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" );
00558
00559
00560 if ( w->exec() != QDialog::Accepted )
00561 return;
00562
00563 QStringList filenames = w->selectedFiles();
00564 QStringList::Iterator it = filenames.begin();
00565 while( it != filenames.end() ) {
00566 std::string filename = ( *it ).ascii();
00567 ++it;
00568
00569
00570 typedef itk::Image<itk::Vector<TTensorPixelType,odfsize>,3 > IVType;
00571 typedef itk::ImageFileReader<IVType> ReaderType;
00572 ReaderType::Pointer qballReader = ReaderType::New();
00573 qballReader->SetFileName(filename);
00574 try
00575 {
00576 qballReader->Update();
00577 }
00578 catch (itk::ExceptionObject e)
00579 {
00580 MBI_LOG << e;
00581 }
00582
00583
00584
00585
00586
00587
00588 mitk::Image::Pointer image = mitk::Image::New();
00589 image->InitializeByItk( qballReader->GetOutput() );
00590 image->SetVolume( qballReader->GetOutput()->GetBufferPointer() );
00591 mitk::DataNode::Pointer node=mitk::DataNode::New();
00592 node->SetData( image );
00593 mitk::DataStorage::GetInstance()->Add(node);
00594 SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename));
00595 node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) );
00596 node->SetProperty( "visible", mitk::BoolProperty::New( false ) );
00597
00598 TreeChanged();
00599 }
00600 }
00601
00602 void QmitkDiffusionTensorEstimation::QBallVolumesRemoveButton()
00603 {
00604 m_QballVolumesDataTreeFilter->DeleteSelectedItems();
00605 }
00606
00607 void QmitkDiffusionTensorEstimation::QBallVolumesVisualizeSelectedButton()
00608 {
00609 itk::TimeProbe clock;
00610 QString status;
00611 const mitk::DataTreeFilter::Item* item
00612 = m_QballVolumesDataTreeFilter->GetSelectedItem();
00613 if(!item)return;
00614
00615 typedef itk::Vector<TTensorPixelType,odfsize> OdfVectorType;
00616 typedef itk::Image<OdfVectorType,3> OdfVectorImgType;
00617 mitk::Image* vol =
00618 static_cast<mitk::Image*>(item->GetNode()->GetData());
00619 OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New();
00620 mitk::CastToItkImage<OdfVectorImgType>(vol, itkvol);
00621 std::string nodename = item->GetProperty("name");
00622
00623
00624 clock.Start();
00625 MBI_INFO << "Preparing for Visualization ";
00626 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
00627 "Preparing for Visualization of %s", nodename.c_str()));
00628 typedef itk::DiffusionQballPrepareVisualizationImageFilter<TTensorPixelType,odfsize>
00629 FilterType;
00630 FilterType::Pointer filter = FilterType::New();
00631 filter->SetInput(itkvol);
00632 filter->SetNumberOfThreads(4);
00633
00634 switch(m_Controls->m_QBallVolumesVisualizeNormalizationMethod->currentItem())
00635 {
00636 case 0:
00637 {
00638 filter->SetNormalizationMethod(FilterType::PV_MIN_MAX);
00639 break;
00640 }
00641 case 1:
00642 {
00643 filter->SetNormalizationMethod(FilterType::PV_NONE);
00644 break;
00645 }
00646 case 2:
00647 {
00648 filter->SetNormalizationMethod(FilterType::PV_MAX);
00649 break;
00650 }
00651 case 3:
00652 {
00653 filter->SetNormalizationMethod(FilterType::PV_GLOBAL_MAX);
00654 break;
00655 }
00656 case 4:
00657 {
00658 filter->SetNormalizationMethod(FilterType::PV_MIN_MAX_INVERT);
00659 break;
00660 }
00661 default:
00662 {
00663 filter->SetNormalizationMethod(FilterType::PV_MIN_MAX);
00664 break;
00665 }
00666 }
00667
00668 if(m_Controls->m_QBallVolumesVisualizeScaleGfaCheckbox->isChecked() )
00669 {
00670 typedef itk::DiffusionQballGeneralizedFaImageFilter<TTensorPixelType,TTensorPixelType,odfsize>
00671 GfaFilterType;
00672 filter->SetDoScaleGfa(true);
00673 float p1 = m_Controls->m_QBallStandardAlgorithmsGFAParam1->text().toFloat();
00674 float p2 = m_Controls->m_QBallStandardAlgorithmsGFAParam2->text().toFloat();
00675 switch(m_Controls->m_QBallStandardAlgorithmsGFAMethod->currentItem())
00676 {
00677 case 0:
00678 filter->SetScaleByGfaType(GfaFilterType::GFA_STANDARD);
00679 break;
00680 case 1:
00681 filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILES_HIGH_LOW);
00682 break;
00683 case 2:
00684 filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILE_HIGH);
00685 break;
00686 case 3:
00687 filter->SetScaleByGfaType(GfaFilterType::GFA_MAX_ODF_VALUE);
00688 break;
00689 case 4:
00690 filter->SetScaleByGfaType(GfaFilterType::GFA_DECONVOLUTION_COEFFS);
00691 break;
00692 case 5:
00693 filter->SetScaleByGfaType(GfaFilterType::GFA_MIN_MAX_NORMALIZED_STANDARD);
00694 break;
00695 case 6:
00696 filter->SetScaleByGfaType(GfaFilterType::GFA_NORMALIZED_ENTROPY);
00697 break;
00698 case 7:
00699 filter->SetScaleByGfaType(GfaFilterType::GFA_NEMATIC_ORDER_PARAMETER);
00700 break;
00701 case 8:
00702 filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILES_LOW_HIGH);
00703 break;
00704 case 9:
00705 filter->SetScaleByGfaType(GfaFilterType::GFA_QUANTILE_LOW);
00706 break;
00707 case 10:
00708 filter->SetScaleByGfaType(GfaFilterType::GFA_MIN_ODF_VALUE);
00709 break;
00710 case 11:
00711 filter->SetScaleByGfaType(GfaFilterType::GFA_STD_BY_MAX);
00712 break;
00713 case 12:
00714 filter->SetScaleByGfaType(GfaFilterType::GFA_PRINCIPLE_CURVATURE);
00715 filter->SetGfaParam1(p1);
00716 break;
00717 case 13:
00718 filter->SetScaleByGfaType(GfaFilterType::GFA_GENERALIZED_GFA);
00719 filter->SetGfaParam1(p1);
00720 filter->SetGfaParam2(p2);
00721 break;
00722 default:
00723 filter->SetScaleByGfaType(GfaFilterType::GFA_STANDARD);
00724 }
00725 }
00726 filter->Update();
00727 clock.Stop();
00728 MBI_DEBUG << "took " << clock.GetMeanTime() << "s.";
00729
00730
00731 mitk::Image::Pointer image = mitk::Image::New();
00732 image->InitializeByItk( filter->GetOutput() );
00733 image->SetVolume( filter->GetOutput()->GetBufferPointer() );
00734 mitk::DataNode::Pointer node=mitk::DataNode::New();
00735 node->SetData( image );
00736 mitk::DataStorage::GetInstance()->Add(node);
00737 SetDefaultNodeProperties(node, nodename.append(" Viz"));
00738 node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) );
00739 node->SetProperty( "ShowMaxNumber", mitk::IntProperty::New( 1500 ) );
00740 node->SetProperty( "DoRefresh", mitk::BoolProperty::New( true ) );
00741 node->SetProperty( "layer", mitk::IntProperty::New( 1 ) );
00742 node->SetProperty( "global_scaling", mitk::FloatProperty::New( 1.0 ) );
00743 mitk::OdfVtkMapper2D<TTensorPixelType,odfsize>::Pointer odfMapper =
00744 mitk::OdfVtkMapper2D<TTensorPixelType,odfsize>::New();
00745 node->SetMapper(1,odfMapper);
00746
00747 mitk::StatusBar::GetInstance()->DisplayText("Computation complete.");
00748
00749 m_DataTreeIterator->GetTree()->Modified();
00750 m_MultiWidget->RequestUpdate();
00751 TreeChanged();
00752 m_Controls->update();
00753
00754 }
00755
00756 void QmitkDiffusionTensorEstimation::DirectionVolumesSaveButton()
00757 {
00758
00759 const mitk::DataTreeFilter::Item* selectedItem
00760 = m_DirectionVolumesDataTreeFilter->GetSelectedItem();
00761 if( !selectedItem ) return;
00762
00763 mitk::Image::Pointer vol =
00764 static_cast<mitk::Image*>(selectedItem->GetNode()->GetData());
00765 if( !vol)return;
00766
00767 typedef itk::Image<itk::Vector<TTensorPixelType,3>,3 > IType;
00768 IType::Pointer itkVol = IType::New();
00769 mitk::CastToItkImage<IType>(vol, itkVol);
00770
00771 typedef itk::VectorImage<TTensorPixelType, 3> VarVecImgType;
00772 VarVecImgType::Pointer vecImg = VarVecImgType::New();
00773 vecImg->SetSpacing( itkVol->GetSpacing() );
00774 vecImg->SetOrigin( itkVol->GetOrigin() );
00775 vecImg->SetDirection( itkVol->GetDirection() );
00776 vecImg->SetLargestPossibleRegion( itkVol->GetLargestPossibleRegion());
00777 vecImg->SetBufferedRegion( itkVol->GetLargestPossibleRegion() );
00778 vecImg->SetVectorLength(3);
00779 vecImg->Allocate();
00780 itk::ImageRegionIterator<VarVecImgType> ot (vecImg, vecImg->GetLargestPossibleRegion() );
00781 ot = ot.Begin();
00782
00783 itk::ImageRegionIterator<IType> it (itkVol, itkVol->GetLargestPossibleRegion() );
00784 it = it.Begin();
00785 for (it = it.Begin(); !it.IsAtEnd(); ++it)
00786 {
00787 itk::Vector<TTensorPixelType,3> vec = it.Get();
00788 VarVecImgType::PixelType varvec(vec.GetDataPointer(), 3);
00789 ot.Set(varvec);
00790 ++ot;
00791 }
00792
00793
00794 std::string sName = selectedItem->GetNode()->GetName();
00795 QString qName;
00796 qName.sprintf("%s.nhdr",sName.c_str());
00797 QString filename = QFileDialog::getSaveFileName(
00798 qName,
00799 "Nrrd Images (*.nrrd *.nhdr)",
00800 this->m_Controls,
00801 "save file dialog",
00802 "Select Nrrd Outputfile" );
00803 if ( !filename )
00804 return;
00805
00806
00807 MBI_INFO << "Writing data ";
00808 typedef itk::ImageFileWriter<VarVecImgType> WriterType;
00809 WriterType::Pointer writer = WriterType::New();
00810 writer->SetFileName(filename.ascii());
00811 writer->SetInput(vecImg);
00812 writer->Update();
00813 }
00814
00815 void QmitkDiffusionTensorEstimation::DirectionVolumesLoadButton()
00816 {
00817
00818 QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE );
00819 w->setMode( QFileDialog::ExistingFiles );
00820 w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" );
00821
00822
00823 if ( w->exec() != QDialog::Accepted )
00824 return;
00825
00826 QStringList filenames = w->selectedFiles();
00827 QStringList::Iterator it = filenames.begin();
00828 while( it != filenames.end() ) {
00829 std::string filename = ( *it ).ascii();
00830 ++it;
00831
00832
00833 typedef itk::Image<itk::Vector<TTensorPixelType,3>,3 > IType;
00834 typedef itk::ImageFileReader<IType> ReaderType;
00835 ReaderType::Pointer reader = ReaderType::New();
00836 reader->SetFileName(filename);
00837 try
00838 {
00839 reader->Update();
00840 }
00841 catch (itk::ExceptionObject e)
00842 {
00843 MBI_INFO << e << std::endl;
00844 }
00845
00846
00847 mitk::Image::Pointer image = mitk::Image::New();
00848 image->InitializeByItk( reader->GetOutput() );
00849 image->SetVolume( reader->GetOutput()->GetBufferPointer() );
00850 mitk::DataNode::Pointer node=mitk::DataNode::New();
00851 node->SetData( image );
00852 mitk::DataStorage::GetInstance()->Add(node);
00853 SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename));
00854 node->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) );
00855
00856 mitk::VectorImageMapper2D::Pointer mapper =
00857 mitk::VectorImageMapper2D::New();
00858 node->SetMapper(1,mapper);
00859
00860 TreeChanged();
00861 }
00862 }
00863
00864 void QmitkDiffusionTensorEstimation::DirectionVolumesRemoveButton()
00865 {
00866 m_DirectionVolumesDataTreeFilter->DeleteSelectedItems();
00867 }
00868
00869 void QmitkDiffusionTensorEstimation::TensorEstimationTeemEstimateButton()
00870 {
00871 try
00872 {
00873 itk::TimeProbe clock;
00874
00875 const mitk::DataTreeFilter::ItemSet* selectedItems
00876 = m_DiffusionVolumesDataTreeFilter->GetSelectedItems();
00877
00878
00879 int nrFiles = selectedItems->size();
00880 if (!nrFiles) return;
00881
00882 QString status;
00883 mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles);
00884
00885 mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() );
00886 mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() );
00887
00888 std::vector<mitk::DataNode::Pointer> nodes;
00889 while ( itemiter != itemiterend )
00890 {
00891
00892 mitk::DiffusionVolumes<DiffusionPixelType>* vols =
00893 static_cast<mitk::DiffusionVolumes<DiffusionPixelType>*>(
00894 (*itemiter)->GetNode()->GetData());
00895
00896 std::string nodename = (*itemiter)->GetProperty("name");
00897 itemiter++;
00898
00899
00900 clock.Start();
00901 MBI_INFO << "Teem Tensor reconstruction ";
00902 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
00903 "Teem Tensor reconstruction for %s", nodename.c_str()));
00904 typedef mitk::TeemDiffusionTensor3DReconstructionImageFilter<
00905 DiffusionPixelType, TTensorPixelType > TensorReconstructionImageFilterType;
00906 TensorReconstructionImageFilterType::Pointer tensorReconstructionFilter =
00907 TensorReconstructionImageFilterType::New();
00908 tensorReconstructionFilter->SetInput( vols );
00909 tensorReconstructionFilter->SetEstimateErrorImage( m_Controls->m_TensorEstimationTeemErrorImage->isChecked() );
00910 if(!m_Controls->m_TensorEstimationTeemSigmaEdit->text().contains(QString("NaN")))
00911 tensorReconstructionFilter->SetSigma( m_Controls->m_TensorEstimationTeemSigmaEdit->text().toFloat() );
00912 switch(m_Controls->m_TensorEstimationTeemEstimationMethodCombo->currentItem())
00913 {
00914 case 0:
00915 tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsLLS);
00916 break;
00917 case 1:
00918 tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsNLS);
00919 break;
00920 case 2:
00921 tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsWLS);
00922 break;
00923 case 3:
00924 tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsMLE);
00925 break;
00926 default:
00927 tensorReconstructionFilter->SetEstimationMethod(mitk::TeemTensorEstimationMethodsLLS);
00928 }
00929 tensorReconstructionFilter->SetNumIterations( m_Controls->m_TensorEstimationTeemNumItsSpin->value() );
00930 if(!m_Controls->m_TensorEstimationTeemConfThresholdEdit->text().contains(QString("NaN")))
00931 tensorReconstructionFilter->SetConfidenceThreshold( m_Controls->m_TensorEstimationTeemConfThresholdEdit->text().toDouble() );
00932 tensorReconstructionFilter->SetConfidenceFuzzyness( m_Controls->m_TensorEstimationTeemFuzzyEdit->text().toFloat() );
00933 tensorReconstructionFilter->SetMinPlausibleValue( m_Controls->m_TensorEstimationTeemMinValEdit->text().toDouble() );
00934 tensorReconstructionFilter->Update();
00935 clock.Stop();
00936 MBI_DEBUG << "took " << clock.GetMeanTime() << "s.";
00937
00938
00939
00940
00941
00942
00943
00944
00945 mitk::DataNode::Pointer node2=mitk::DataNode::New();
00946 node2->SetData( tensorReconstructionFilter->GetOutputItk() );
00947 SetDefaultNodeProperties(node2, nodename.append(" (itk)"));
00948 node2->SetProperty( "IsTensorVolume", mitk::BoolProperty::New( true ) );
00949 nodes.push_back(node2);
00950
00951 mitk::ProgressBar::GetInstance()->Progress();
00952
00953 }
00954
00955 std::vector<mitk::DataNode::Pointer>::iterator nodeIt;
00956 for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt)
00957 mitk::DataStorage::GetInstance()->Add(*nodeIt);
00958
00959 mitk::ProgressBar::GetInstance()->Progress();
00960 TreeChanged();
00961 m_Controls->update();
00962
00963 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles));
00964
00965 }
00966 catch (itk::ExceptionObject &ex)
00967 {
00968 MBI_INFO << ex;
00969 return ;
00970 }
00971 }
00972
00973 void QmitkDiffusionTensorEstimation::TensorEstimationButton()
00974 {
00975 try
00976 {
00977 itk::TimeProbe clock;
00978
00979 const mitk::DataTreeFilter::ItemSet* selectedItems
00980 = m_DiffusionVolumesDataTreeFilter->GetSelectedItems();
00981
00982 int nrFiles = selectedItems->size();
00983 if (!nrFiles) return;
00984
00985 QString status;
00986 mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles);
00987
00988 mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() );
00989 mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() );
00990
00991 std::vector<mitk::DataNode::Pointer> nodes;
00992 while ( itemiter != itemiterend )
00993 {
00994
00995 mitk::DiffusionVolumes<DiffusionPixelType>* vols =
00996 static_cast<mitk::DiffusionVolumes<DiffusionPixelType>*>(
00997 (*itemiter)->GetNode()->GetData());
00998
00999 std::string nodename = (*itemiter)->GetProperty("name");
01000 itemiter++;
01001
01002
01003 clock.Start();
01004 MBI_INFO << "Tensor reconstruction ";
01005 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01006 "Tensor reconstruction for %s", nodename.c_str()));
01007 typedef itk::DiffusionTensor3DReconstructionImageFilter<
01008 DiffusionPixelType, DiffusionPixelType, TTensorPixelType > TensorReconstructionImageFilterType;
01009 TensorReconstructionImageFilterType::Pointer tensorReconstructionFilter =
01010 TensorReconstructionImageFilterType::New();
01011 tensorReconstructionFilter->SetGradientImage( vols->GetDirections(), vols->GetImage() );
01012 tensorReconstructionFilter->SetNumberOfThreads( m_Controls->m_TensorEstimationNumberThreadsSpinbox->value() );
01013 tensorReconstructionFilter->SetBValue(vols->GetB_Value());
01014 tensorReconstructionFilter->SetThreshold( m_Controls->m_TensorEstimationThreasholdEdit->text().toFloat() );
01015 tensorReconstructionFilter->Update();
01016 clock.Stop();
01017 MBI_DEBUG << "took " << clock.GetMeanTime() << "s.";
01018
01019
01020 mitk::Image::Pointer image = mitk::Image::New();
01021 image->InitializeByItk( tensorReconstructionFilter->GetOutput() );
01022 image->SetVolume( tensorReconstructionFilter->GetOutput()->GetBufferPointer() );
01023 mitk::DataNode::Pointer node=mitk::DataNode::New();
01024 node->SetData( image );
01025 SetDefaultNodeProperties(node, nodename.append(" tensors"));
01026 node->SetProperty( "IsTensorVolume", mitk::BoolProperty::New( true ) );
01027 nodes.push_back(node);
01028
01029 mitk::ProgressBar::GetInstance()->Progress();
01030
01031 }
01032
01033 std::vector<mitk::DataNode::Pointer>::iterator nodeIt;
01034 for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt)
01035 mitk::DataStorage::GetInstance()->Add(*nodeIt);
01036
01037 mitk::ProgressBar::GetInstance()->Progress();
01038 TreeChanged();
01039 m_Controls->update();
01040
01041 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles));
01042
01043 }
01044 catch (itk::ExceptionObject &ex)
01045 {
01046 MBI_INFO << ex;
01047 return ;
01048 }
01049 }
01050
01051 void QmitkDiffusionTensorEstimation::QBallReconstructionButton()
01052 {
01053 try
01054 {
01055 itk::TimeProbe clock;
01056
01057 const mitk::DataTreeFilter::ItemSet* selectedItems
01058 = m_DiffusionVolumesDataTreeFilter->GetSelectedItems();
01059
01060 int nrFiles = selectedItems->size();
01061 if (!nrFiles) return;
01062
01063 QString status;
01064 mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles);
01065
01066 mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() );
01067 mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() );
01068
01069 std::vector<mitk::DataNode::Pointer> nodes;
01070 while ( itemiter != itemiterend )
01071 {
01072
01073 mitk::DiffusionVolumes<DiffusionPixelType>* vols =
01074 static_cast<mitk::DiffusionVolumes<DiffusionPixelType>*>(
01075 (*itemiter)->GetNode()->GetData());
01076
01077 std::string nodename = (*itemiter)->GetProperty("name");
01078 ++itemiter;
01079
01080
01081 clock.Start();
01082 MBI_INFO << "QBall reconstruction ";
01083 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01084 "QBall reconstruction for %s", nodename.c_str()));
01085
01086 typedef itk::DiffusionQballReconstructionImageFilter<
01087 DiffusionPixelType, DiffusionPixelType, TTensorPixelType, odfsize>
01088
01089 QballReconstructionImageFilterType;
01090 QballReconstructionImageFilterType::Pointer filter =
01091 QballReconstructionImageFilterType::New();
01092 filter->SetGradientImage( vols->GetDirections(), vols->GetImage() );
01093 filter->SetNumberOfThreads( m_Controls->m_QBallReconstructionNumberThreadsSpinbox->value() );
01094 filter->SetBValue(vols->GetB_Value());
01095 filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdEdit->text().toFloat() );
01096
01097 int normalization = m_Controls->m_QBallReconstructionPostprocessingMethod->currentItem();
01098 switch(normalization)
01099 {
01100 case 0:
01101 {
01102 filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
01103 break;
01104 }
01105 case 1:
01106 {
01107 filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO_B_VALUE);
01108 break;
01109 }
01110 case 2:
01111 {
01112 filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO);
01113 break;
01114 }
01115 case 3:
01116 {
01117 filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_NONE);
01118 break;
01119 }
01120 default:
01121 {
01122 filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
01123 }
01124 }
01125
01126 filter->Update();
01127 clock.Stop();
01128 MBI_DEBUG << "took " << clock.GetMeanTime() << "s." << std::endl;
01129
01130
01131 mitk::Image::Pointer image = mitk::Image::New();
01132 image->InitializeByItk( filter->GetOutput() );
01133
01134 image->SetVolume( filter->GetOutput()->GetBufferPointer() );
01135 mitk::DataNode::Pointer node=mitk::DataNode::New();
01136 node->SetData( image );
01137 QString newname;
01138 newname = newname.append(nodename.c_str());
01139 newname = newname.append("_QN%1").arg(normalization);
01140 SetDefaultNodeProperties(node, newname.ascii());
01141 node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) );
01142 nodes.push_back(node);
01143
01144
01145 mitk::Image::Pointer image4 = mitk::Image::New();
01146 image4->InitializeByItk( filter->GetBZeroImage().GetPointer() );
01147 image4->SetVolume( filter->GetBZeroImage()->GetBufferPointer() );
01148 mitk::DataNode::Pointer node4=mitk::DataNode::New();
01149 node4->SetData( image4 );
01150 SetDefaultNodeProperties(node4, nodename.append("B0"));
01151 nodes.push_back(node4);
01152
01153 mitk::ProgressBar::GetInstance()->Progress();
01154
01155 }
01156
01157 std::vector<mitk::DataNode::Pointer>::iterator nodeIt;
01158 for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt)
01159 mitk::DataStorage::GetInstance()->Add(*nodeIt);
01160
01161 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles));
01162 m_DataTreeIterator->GetTree()->Modified();
01163 m_MultiWidget->RequestUpdate();
01164 TreeChanged();
01165 m_Controls->update();
01166
01167 }
01168 catch (itk::ExceptionObject &ex)
01169 {
01170 MBI_INFO << ex;
01171 return ;
01172 }
01173 }
01174
01175 template<int L>
01176 void QmitkDiffusionTensorEstimation::ReconstructAnalytically(
01177 mitk::DiffusionVolumes<DiffusionPixelType>* vols, float lambda,
01178 std::string nodename, std::vector<mitk::DataNode::Pointer>* nodes)
01179 {
01180 typedef itk::AnalyticalDiffusionQballReconstructionImageFilter
01181 <DiffusionPixelType,DiffusionPixelType,TTensorPixelType,L,odfsize> FilterType;
01182 typename FilterType::Pointer filter = FilterType::New();
01183 filter->SetGradientImage( vols->GetDirections(), vols->GetImage() );
01184 filter->SetNumberOfThreads( m_Controls->m_QBallReconstructionNumberThreadsAnalyticalSpinbox->value() );
01185 filter->SetBValue(vols->GetB_Value());
01186 filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdAnalyticalEdit->text().toFloat() );
01187 filter->SetLambda(lambda);
01188 filter->SetAdcProfileOnly(m_Controls->m_QBallReconstructionAdcOnlyCheckbox->isChecked());
01189 int normalization = m_Controls->m_QBallReconstructionPostprocessingMethodAnalytical->currentItem();
01190 switch(normalization)
01191 {
01192 case 0:
01193 {
01194 filter->SetNormalizationMethod(FilterType::QBAR_STANDARD);
01195 break;
01196 }
01197 case 1:
01198 {
01199 filter->SetNormalizationMethod(FilterType::QBAR_B_ZERO_B_VALUE);
01200 break;
01201 }
01202 case 2:
01203 {
01204 filter->SetNormalizationMethod(FilterType::QBAR_B_ZERO);
01205 break;
01206 }
01207 case 3:
01208 {
01209 filter->SetNormalizationMethod(FilterType::QBAR_NONE);
01210 break;
01211 }
01212 default:
01213 {
01214 filter->SetNormalizationMethod(FilterType::QBAR_STANDARD);
01215 }
01216 }
01217
01218 filter->Update();
01219
01220
01221 mitk::Image::Pointer image = mitk::Image::New();
01222 image->InitializeByItk( filter->GetOutput() );
01223 image->SetVolume( filter->GetOutput()->GetBufferPointer() );
01224 mitk::DataNode::Pointer node=mitk::DataNode::New();
01225 node->SetData( image );
01226 nodes->push_back(node);
01227 QString newname;
01228 newname = newname.append(nodename.c_str());
01229 newname = newname.append("_QA%1").arg(normalization);
01230 SetDefaultNodeProperties(node, newname.ascii());
01231 node->SetProperty( "IsQBallVolume", mitk::BoolProperty::New( true ) );
01232
01233
01234 mitk::Image::Pointer image4 = mitk::Image::New();
01235 image4->InitializeByItk( filter->GetBZeroImage().GetPointer() );
01236 image4->SetVolume( filter->GetBZeroImage()->GetBufferPointer() );
01237 mitk::DataNode::Pointer node4=mitk::DataNode::New();
01238 node4->SetData( image4 );
01239 nodes->push_back(node4);
01240 SetDefaultNodeProperties(node4, nodename.append("B0"));
01241
01242 }
01243
01244 void QmitkDiffusionTensorEstimation::QBallReconstructionAnalyticalButton()
01245 {
01246 try
01247 {
01248 itk::TimeProbe clock;
01249
01250 const mitk::DataTreeFilter::ItemSet* selectedItems
01251 = m_DiffusionVolumesDataTreeFilter->GetSelectedItems();
01252
01253 int nrFiles = selectedItems->size();
01254 if (!nrFiles) return;
01255
01256 std::vector<float> lambdas;
01257 float minLambda = m_Controls->m_QBallReconstructionLambdaLineEdit->text().toFloat();
01258 if(m_Controls->m_QBallReconstructionLambdaMultiCheckbox->isChecked())
01259 {
01260 float stepLambda = m_Controls->m_QBallReconstructionLambdaStepLineEdit->text().toFloat();
01261 float maxLambda = m_Controls->m_QBallReconstructionLambdaMaxLineEdit->text().toFloat();
01262 for(float l=minLambda; l<maxLambda; l+=stepLambda)
01263 {
01264 lambdas.push_back(l);
01265 }
01266 }
01267 int nLambdas = lambdas.size();
01268 if(nLambdas == 0)
01269 {
01270 lambdas.push_back(minLambda);
01271 nLambdas = 1;
01272 }
01273
01274 QString status;
01275 mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles*nLambdas);
01276
01277 mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() );
01278 mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() );
01279
01280 std::vector<mitk::DataNode::Pointer>* nodes
01281 = new std::vector<mitk::DataNode::Pointer>();
01282 while ( itemiter != itemiterend )
01283 {
01284
01285 mitk::DiffusionVolumes<DiffusionPixelType>* vols =
01286 static_cast<mitk::DiffusionVolumes<DiffusionPixelType>*>(
01287 (*itemiter)->GetNode()->GetData());
01288
01289 std::string nodename = (*itemiter)->GetProperty("name");
01290 itemiter++;
01291
01292
01293 clock.Start();
01294 MBI_INFO << "QBall reconstruction ";
01295 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01296 "QBall reconstruction for %s", nodename.c_str()));
01297
01298 for(int i=0; i<nLambdas; i++)
01299 {
01300
01301 float currentLambda = lambdas[i];
01302
01303 switch(m_Controls->m_QBallReconstructionMaxLLevelComboBox->currentItem())
01304 {
01305 case 0:
01306 {
01307 ReconstructAnalytically<2>(vols, currentLambda, nodename, nodes);
01308 break;
01309 }
01310 case 1:
01311 {
01312 ReconstructAnalytically<4>(vols, currentLambda, nodename, nodes);
01313 break;
01314 }
01315 case 2:
01316 {
01317 ReconstructAnalytically<6>(vols, currentLambda, nodename, nodes);
01318 break;
01319 }
01320 case 3:
01321 {
01322 ReconstructAnalytically<8>(vols, currentLambda, nodename, nodes);
01323 break;
01324 }
01325 }
01326
01327 clock.Stop();
01328 MBI_DEBUG << "took " << clock.GetMeanTime() << "s.";
01329 mitk::ProgressBar::GetInstance()->Progress();
01330
01331 }
01332 }
01333
01334 std::vector<mitk::DataNode::Pointer>::iterator nodeIt;
01335 for(nodeIt = nodes->begin(); nodeIt != nodes->end(); ++nodeIt)
01336 mitk::DataStorage::GetInstance()->Add(*nodeIt);
01337
01338 m_DataTreeIterator->GetTree()->Modified();
01339 m_MultiWidget->RequestUpdate();
01340 TreeChanged();
01341 m_Controls->update();
01342
01343 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles));
01344
01345 }
01346 catch (itk::ExceptionObject &ex)
01347 {
01348 MBI_INFO << ex;
01349 return ;
01350 }
01351 }
01352
01353 void QmitkDiffusionTensorEstimation::StandardAlgorithmsFAButton()
01354 {
01355 itk::TimeProbe clock;
01356 QString status;
01357 const mitk::DataTreeFilter::Item* item
01358 = m_TensorVolumesDataTreeFilter->GetSelectedItem();
01359 if(!item)return;
01360
01361 mitk::Image* vol =
01362 static_cast<mitk::Image*>(item->GetNode()->GetData());
01363 itk::Image<TensorPixelType, 3>::Pointer itkvol = itk::Image<TensorPixelType, 3>::New();
01364 mitk::CastToItkImage<TensorImageType>(vol, itkvol);
01365 std::string nodename = item->GetProperty("name");
01366
01367
01368 clock.Start();
01369 MBI_INFO << "Computing FA ";
01370 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01371 "Computing FA for %s", nodename.c_str()));
01372 typedef TensorPixelType::RealValueType RealValueType;
01373 typedef itk::Image< RealValueType, 3 > FAImageType;
01374 typedef itk::TensorFractionalAnisotropyImageFilter<
01375 TensorImageType, FAImageType > FAFilterType;
01376 FAFilterType::Pointer fractionalAnisotropyFilter = FAFilterType::New();
01377 fractionalAnisotropyFilter->SetInput( itkvol );
01378
01379 typedef itk::ShiftScaleImageFilter<FAImageType, FAImageType>
01380 ShiftScaleFilterType;
01381 ShiftScaleFilterType::Pointer multi =
01382 ShiftScaleFilterType::New();
01383 multi->SetShift(0);
01384 multi->SetScale(200);
01385 multi->SetInput(fractionalAnisotropyFilter->GetOutput());
01386 multi->Update();
01387 clock.Stop();
01388 MBI_DEBUG << "took " << clock.GetMeanTime() << "s.";
01389
01390
01391 mitk::Image::Pointer image = mitk::Image::New();
01392 image->InitializeByItk( multi->GetOutput() );
01393 image->SetVolume( multi->GetOutput()->GetBufferPointer() );
01394 mitk::DataNode::Pointer node=mitk::DataNode::New();
01395 node->SetData( image );
01396 mitk::DataStorage::GetInstance()->Add(node);
01397 SetDefaultNodeProperties(node, nodename.append(" FA"));
01398 node->SetProperty( "IsFAVolume", mitk::BoolProperty::New( true ) );
01399
01400 mitk::StatusBar::GetInstance()->DisplayText("Computation complete.");
01401
01402 m_DataTreeIterator->GetTree()->Modified();
01403 m_MultiWidget->RequestUpdate();
01404 TreeChanged();
01405 m_Controls->update();
01406 }
01407
01408 void QmitkDiffusionTensorEstimation::StandardAlgorithmsRAButton()
01409 {
01410 itk::TimeProbe clock;
01411 QString status;
01412 const mitk::DataTreeFilter::Item* item
01413 = m_TensorVolumesDataTreeFilter->GetSelectedItem();
01414 if(!item)return;
01415
01416 mitk::Image* vol =
01417 static_cast<mitk::Image*>(item->GetNode()->GetData());
01418 itk::Image<TensorPixelType, 3>::Pointer itkvol = itk::Image<TensorPixelType, 3>::New();
01419 mitk::CastToItkImage<TensorImageType>(vol, itkvol);
01420 std::string nodename = item->GetProperty("name");
01421
01422
01423 clock.Start();
01424 MBI_INFO << "Computing RA ";
01425 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01426 "Computing RA for %s", nodename.c_str()));
01427 typedef TensorPixelType::RealValueType RealValueType;
01428 typedef itk::Image< RealValueType, 3 > RAImageType;
01429 typedef itk::TensorRelativeAnisotropyImageFilter<
01430 TensorImageType, RAImageType > RAFilterType;
01431 RAFilterType::Pointer relativeAnisotropyFilter = RAFilterType::New();
01432 relativeAnisotropyFilter->SetInput( itkvol );
01433 relativeAnisotropyFilter->Update();
01434 clock.Stop();
01435 MBI_DEBUG << "took " << clock.GetMeanTime() << "s.";
01436
01437
01438 mitk::Image::Pointer image = mitk::Image::New();
01439 image->InitializeByItk( relativeAnisotropyFilter->GetOutput() );
01440 image->SetVolume( relativeAnisotropyFilter->GetOutput()->GetBufferPointer() );
01441 mitk::DataNode::Pointer node=mitk::DataNode::New();
01442 node->SetData( image );
01443 mitk::DataStorage::GetInstance()->Add(node);
01444 SetDefaultNodeProperties(node, nodename.append(" RA"));
01445 node->SetProperty( "IsRAVolume", mitk::BoolProperty::New( true ) );
01446
01447 mitk::StatusBar::GetInstance()->DisplayText("Computation complete.");
01448
01449 m_DataTreeIterator->GetTree()->Modified();
01450 m_MultiWidget->RequestUpdate();
01451 TreeChanged();
01452 m_Controls->update();
01453
01454 }
01455
01456 void QmitkDiffusionTensorEstimation::StandardAlgorithmsDirectionButton()
01457 {
01458
01459 itk::TimeProbe clock;
01460 QString status;
01461 const mitk::DataTreeFilter::Item* item
01462 = m_TensorVolumesDataTreeFilter->GetSelectedItem();
01463 if(!item)return;
01464
01465 typedef itk::DiffusionTensor3D<TTensorPixelType> TensorType;
01466 typedef itk::Image<TensorType,3> TensorImgType;
01467 mitk::Image* vol =
01468 static_cast<mitk::Image*>(item->GetNode()->GetData());
01469 TensorImgType::Pointer itkvol = TensorImgType::New();
01470 mitk::CastToItkImage<TensorImgType>(vol, itkvol);
01471 std::string nodename = item->GetProperty("name");
01472
01473 clock.Start();
01474 MBI_INFO << "Computing Diffusion Direction ";
01475 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01476 "Computing Diffusion Direction for %s", nodename.c_str()));
01477
01478 typedef itk::DiffusionTensorPrincipleDirectionImageFilter<TTensorPixelType,TTensorPixelType>
01479 FilterType;
01480 FilterType::Pointer filter
01481 = FilterType::New();
01482 filter->SetInput(itkvol);
01483 filter->SetNumberOfThreads(4);
01484 filter->Update();
01485 itk::ImageRegionIterator<FilterType::OutputImageType>
01486 it (filter->GetOutput(),
01487 filter->GetOutput()->GetLargestPossibleRegion() );
01488 it = it.Begin();
01489
01490
01491 MBI_DEBUG << "Converting to Vectorfield";
01492
01493 typedef itk::Image<itk::Vector<TTensorPixelType,3>, 3> VecImgType2;
01494 VecImgType2::Pointer vecImg5 = VecImgType2::New();
01495 vecImg5->SetSpacing( itkvol->GetSpacing() );
01496 vecImg5->SetOrigin( itkvol->GetOrigin() );
01497 vecImg5->SetDirection( itkvol->GetDirection() );
01498 vecImg5->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion());
01499 vecImg5->SetBufferedRegion( vecImg5->GetLargestPossibleRegion() );
01500 vecImg5->Allocate();
01501 itk::ImageRegionIterator<VecImgType2> ot5 (vecImg5, vecImg5->GetLargestPossibleRegion() );
01502 ot5 = ot5.Begin();
01503
01504 typedef FilterType::OutputImageType::PixelType VecPixType;
01505 for (it = it.Begin(); !it.IsAtEnd(); ++it)
01506 {
01507 VecPixType vec = it.Get();
01508 itk::Vector<TTensorPixelType,3> pix;
01509 TTensorPixelType uvec[3] = {(TTensorPixelType)(vec[0]),(TTensorPixelType)(vec[1]),(TTensorPixelType)(vec[2])};
01510
01511 pix = uvec;
01512 ot5.Set(pix);
01513 ++ot5;
01514 }
01515
01516
01517 mitk::Image::Pointer image5 = mitk::Image::New();
01518 image5->InitializeByItk( vecImg5.GetPointer() );
01519 image5->SetVolume( vecImg5->GetBufferPointer() );
01520 mitk::DataNode::Pointer node5=mitk::DataNode::New();
01521 node5->SetData( image5 );
01522 node5->SetName( nodename.append(" vecs").c_str());
01523 mitk::DataStorage::GetInstance()->Add(node5);
01524
01525 node5->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) );
01526 node5->SetProperty( "NormalizeVecs", mitk::BoolProperty::New( true ) );
01527 node5->SetProperty( "Scale", mitk::FloatProperty::New( 1.0 ) );
01528 node5->SetProperty( "LineWidth", mitk::FloatProperty::New( 1 ) );
01529
01530 mitk::VectorImageMapper2D::Pointer vecMapper5 =
01531 mitk::VectorImageMapper2D::New();
01532 node5->SetMapper(1,vecMapper5);
01533
01534 m_DataTreeIterator->GetTree()->Modified();
01535 m_MultiWidget->RequestUpdate();
01536 TreeChanged();
01537 m_Controls->update();
01538
01539 }
01540
01541 void QmitkDiffusionTensorEstimation::QBallStandardAlgorithmsGFAButton()
01542 {
01543 itk::TimeProbe clock;
01544 QString status;
01545
01546 const mitk::DataTreeFilter::ItemSet* selectedItems
01547 = m_QballVolumesDataTreeFilter->GetSelectedItems();
01548
01549 int nrFiles = selectedItems->size();
01550 if (!nrFiles) return;
01551
01552 mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() );
01553 mitk::DataTreeFilter::ItemSet::const_iterator itemiterend( selectedItems->end() );
01554
01555 std::vector<mitk::DataNode::Pointer> nodes;
01556 while ( itemiter != itemiterend )
01557 {
01558
01559 typedef itk::Vector<TTensorPixelType,odfsize> OdfVectorType;
01560 typedef itk::Image<OdfVectorType,3> OdfVectorImgType;
01561 mitk::Image* vol =
01562 static_cast<mitk::Image*>((*itemiter)->GetNode()->GetData());
01563 OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New();
01564 mitk::CastToItkImage<OdfVectorImgType>(vol, itkvol);
01565
01566 std::string nodename = (*itemiter)->GetProperty("name");
01567 ++itemiter;
01568
01569 float p1 = m_Controls->m_QBallStandardAlgorithmsGFAParam1->text().toFloat();
01570 float p2 = m_Controls->m_QBallStandardAlgorithmsGFAParam2->text().toFloat();
01571
01572
01573 clock.Start();
01574 MBI_INFO << "Computing GFA ";
01575 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01576 "Computing GFA for %s", nodename.c_str()));
01577 typedef OdfVectorType::ValueType RealValueType;
01578 typedef itk::Image< RealValueType, 3 > RAImageType;
01579 typedef itk::DiffusionQballGeneralizedFaImageFilter<TTensorPixelType,TTensorPixelType,odfsize>
01580 GfaFilterType;
01581 GfaFilterType::Pointer gfaFilter = GfaFilterType::New();
01582 gfaFilter->SetInput(itkvol);
01583 gfaFilter->SetNumberOfThreads(4);
01584
01585 double scale = 1;
01586 std::string newname;
01587 newname.append(nodename);
01588 newname.append(" GFA");
01589 switch(m_Controls->m_QBallStandardAlgorithmsGFAMethod->currentItem())
01590 {
01591 case 0:
01592 {
01593 gfaFilter->SetComputationMethod(GfaFilterType::GFA_STANDARD);
01594 newname.append("00");
01595 scale = 200.0;
01596 break;
01597 }
01598 case 1:
01599 {
01600 gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILES_HIGH_LOW);
01601 newname.append("01");
01602 scale = 200.0;
01603 break;
01604 }
01605 case 2:
01606 {
01607 gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILE_HIGH);
01608 newname.append("02");
01609 scale = 200.0;
01610 break;
01611 }
01612 case 3:
01613 {
01614 gfaFilter->SetComputationMethod(GfaFilterType::GFA_MAX_ODF_VALUE);
01615 newname.append("03");
01616 scale = 200.0;
01617 break;
01618 }
01619 case 4:
01620 {
01621 gfaFilter->SetComputationMethod(GfaFilterType::GFA_DECONVOLUTION_COEFFS);
01622 newname.append("04");
01623 scale = 200.0;
01624 break;
01625 }
01626 case 5:
01627 {
01628 gfaFilter->SetComputationMethod(GfaFilterType::GFA_MIN_MAX_NORMALIZED_STANDARD);
01629 newname.append("05");
01630 scale = 200.0;
01631 break;
01632 }
01633 case 6:
01634 {
01635 gfaFilter->SetComputationMethod(GfaFilterType::GFA_NORMALIZED_ENTROPY);
01636 newname.append("06");
01637 break;
01638 }
01639 case 7:
01640 {
01641 gfaFilter->SetComputationMethod(GfaFilterType::GFA_NEMATIC_ORDER_PARAMETER);
01642 newname.append("07");
01643 scale = 200.0;
01644 break;
01645 }
01646 case 8:
01647 {
01648 gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILES_LOW_HIGH);
01649 newname.append("08");
01650 scale = 200.0;
01651 break;
01652 }
01653 case 9:
01654 {
01655 gfaFilter->SetComputationMethod(GfaFilterType::GFA_QUANTILE_LOW);
01656 newname.append("09");
01657 scale = 200.0;
01658 break;
01659 }
01660 case 10:
01661 {
01662 gfaFilter->SetComputationMethod(GfaFilterType::GFA_MIN_ODF_VALUE);
01663 newname.append("10");
01664 scale = 200.0;
01665 break;
01666 }
01667 case 11:
01668 {
01669 gfaFilter->SetComputationMethod(GfaFilterType::GFA_STD_BY_MAX);
01670 newname.append("11");
01671 scale = 200.0;
01672 break;
01673 }
01674 case 12:
01675 {
01676 gfaFilter->SetComputationMethod(GfaFilterType::GFA_PRINCIPLE_CURVATURE);
01677 newname.append("12");
01678 gfaFilter->SetParam1(p1);
01679 scale = 200.0;
01680 break;
01681 }
01682 case 13:
01683 {
01684 gfaFilter->SetComputationMethod(GfaFilterType::GFA_GENERALIZED_GFA);
01685 QString paramString;
01686 paramString = paramString.append(" K%1P%2").arg(p1).arg(p2);
01687 newname.append("13").append(paramString.ascii());
01688 gfaFilter->SetParam1(p1);
01689 gfaFilter->SetParam2(p2);
01690 scale = 200.0;
01691 break;
01692 }
01693 default:
01694 {
01695 newname.append("0");
01696 gfaFilter->SetComputationMethod(GfaFilterType::GFA_STANDARD);
01697 scale = 200.0;
01698 }
01699 }
01700 gfaFilter->Update();
01701 clock.Stop();
01702 MBI_DEBUG << "took " << clock.GetMeanTime() << "s.";
01703
01704 typedef itk::Image<TTensorPixelType, 3> ImgType;
01705 ImgType::Pointer img = ImgType::New();
01706 img->SetSpacing( gfaFilter->GetOutput()->GetSpacing() );
01707 img->SetOrigin( gfaFilter->GetOutput()->GetOrigin() );
01708 img->SetDirection( gfaFilter->GetOutput()->GetDirection() );
01709 img->SetLargestPossibleRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion());
01710 img->SetBufferedRegion( gfaFilter->GetOutput()->GetLargestPossibleRegion() );
01711 img->Allocate();
01712 itk::ImageRegionIterator<ImgType> ot (img, img->GetLargestPossibleRegion() );
01713 ot = ot.Begin();
01714 itk::ImageRegionConstIterator<GfaFilterType::OutputImageType> it
01715 (gfaFilter->GetOutput(), gfaFilter->GetOutput()->GetLargestPossibleRegion() );
01716 it = it.Begin();
01717
01718 for (it = it.Begin(); !it.IsAtEnd(); ++it)
01719 {
01720 GfaFilterType::OutputImageType::PixelType val = it.Get();
01721 ot.Set(val * scale);
01722 ++ot;
01723 }
01724
01725
01726
01727 mitk::Image::Pointer image = mitk::Image::New();
01728 image->InitializeByItk( img.GetPointer() );
01729 image->SetVolume( img->GetBufferPointer() );
01730 mitk::DataNode::Pointer node=mitk::DataNode::New();
01731 node->SetData( image );
01732 nodes.push_back(node);
01733 SetDefaultNodeProperties(node, newname.c_str());
01734 node->SetProperty( "IsGFAVolume", mitk::BoolProperty::New( true ) );
01735
01736 mitk::StatusBar::GetInstance()->DisplayText("Computation complete.");
01737
01738 }
01739
01740 std::vector<mitk::DataNode::Pointer>::iterator nodeIt;
01741 for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt)
01742 mitk::DataStorage::GetInstance()->Add(*nodeIt);
01743
01744 m_DataTreeIterator->GetTree()->Modified();
01745 m_MultiWidget->RequestUpdate();
01746 TreeChanged();
01747 m_Controls->update();
01748
01749 }
01750
01751 void QmitkDiffusionTensorEstimation::QBallStandardAlgorithmsDirectionButton()
01752 {
01753
01754 itk::TimeProbe clock;
01755 QString status;
01756 const mitk::DataTreeFilter::Item* item
01757 = m_QballVolumesDataTreeFilter->GetSelectedItem();
01758 if(!item)return;
01759
01760 typedef itk::Vector<TTensorPixelType,odfsize> OdfVectorType;
01761 typedef itk::Image<OdfVectorType,3> OdfVectorImgType;
01762 mitk::Image* vol =
01763 static_cast<mitk::Image*>(item->GetNode()->GetData());
01764 OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New();
01765 mitk::CastToItkImage<OdfVectorImgType>(vol, itkvol);
01766 std::string nodename = item->GetProperty("name");
01767
01768 clock.Start();
01769 MBI_INFO << "Computing Diffusion Direction ";
01770 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01771 "Computing Diffusion Direction for %s", nodename.c_str()));
01772
01773 typedef itk::DiffusionQballGeneralizedFaImageFilter<TTensorPixelType,TTensorPixelType,odfsize>
01774 GfaFilterType;
01775 GfaFilterType::Pointer gfaFilter = GfaFilterType::New();
01776 gfaFilter->SetInput(itkvol);
01777 gfaFilter->SetNumberOfThreads(4);
01778 gfaFilter->Update();
01779 itk::ImageRegionIterator<GfaFilterType::OutputImageType>
01780 itGfa (gfaFilter->GetOutput(),
01781 gfaFilter->GetOutput()->GetLargestPossibleRegion() );
01782 itGfa = itGfa.Begin();
01783
01784 int numdir = m_Controls->m_QBallStandardAlgorithmsOrderSpinbox->value();
01785
01786 typedef itk::DiffusionQballPrincipleDirectionsImageFilter<TTensorPixelType,TTensorPixelType,odfsize>
01787 PrincipleDirectionsFilterType;
01788 PrincipleDirectionsFilterType::Pointer principleDirectionsFilter
01789 = PrincipleDirectionsFilterType::New();
01790 principleDirectionsFilter->SetThreshold(m_Controls->m_QBallStandardAlgorithmsProbThreshEdit->text().toFloat());
01791 principleDirectionsFilter->SetNrDirectionToExtract(numdir);
01792 principleDirectionsFilter->SetInput(itkvol);
01793 principleDirectionsFilter->SetNumberOfThreads(m_Controls->m_QBallStandardAlgorithmsNumberThreadsSpinbox->value());
01794 principleDirectionsFilter->SetMultiplyGfa(false);
01795 principleDirectionsFilter->Update();
01796
01797 itk::ImageRegionIterator<PrincipleDirectionsFilterType::OutputImageType>
01798 it (principleDirectionsFilter->GetOutput(),
01799 principleDirectionsFilter->GetOutput()->GetLargestPossibleRegion() );
01800
01801 if(numdir == 0)
01802 {
01803
01804 MBI_INFO << "Converting to RGB";
01805
01806 typedef itk::Image<itk::RGBPixel<uchar>, 3> VecImgType;
01807 VecImgType::Pointer vecImg = VecImgType::New();
01808 vecImg->SetSpacing( itkvol->GetSpacing() );
01809 vecImg->SetOrigin( itkvol->GetOrigin() );
01810 vecImg->SetDirection( itkvol->GetDirection() );
01811 vecImg->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion());
01812 vecImg->SetBufferedRegion( vecImg->GetLargestPossibleRegion() );
01813 vecImg->Allocate();
01814 itk::ImageRegionIterator<VecImgType> ot (vecImg, vecImg->GetLargestPossibleRegion() );
01815 ot = ot.Begin();
01816
01817 typedef PrincipleDirectionsFilterType::OutputImageType::PixelType VecPixType;
01818 for (it = it.Begin(); !it.IsAtEnd(); ++it)
01819 {
01820 VecPixType vec = it.Get();
01821
01822 itk::RGBPixel<uchar> pix;
01823 vec*=200*itGfa.Get();
01824 vec[0] = abs(vec[0]);
01825 vec[1] = abs(vec[1]);
01826 vec[2] = abs(vec[2]);
01827 if(vec[0] > 255 || vec[1] > 255 || vec[2] > 255)
01828 {
01829
01830 double max = vec[0];
01831 max = max<vec[1] ? vec[1] : max;
01832 max = max<vec[2] ? vec[2] : max;
01833 vec /= max/255;
01834 }
01835 uchar uvec[3] = {(uchar)(vec[0]),(uchar)(vec[1]),(uchar)(vec[2])};
01836 pix = uvec;
01837 ot.Set(pix);
01838 ++ot;
01839 ++itGfa;
01840 }
01841
01842
01843 mitk::Image::Pointer image2 = mitk::Image::New();
01844 image2->InitializeByItk( vecImg.GetPointer() );
01845 image2->SetVolume( vecImg->GetBufferPointer() );
01846 mitk::DataNode::Pointer node2=mitk::DataNode::New();
01847 node2->SetData( image2 );
01848 mitk::DataStorage::GetInstance()->Add(node2);
01849 switch(numdir)
01850 {
01851 case 0:
01852 {
01853 SetDefaultNodeProperties(node2, nodename.append(" PD0"));
01854 break;
01855 }
01856 case 1:
01857 {
01858 SetDefaultNodeProperties(node2, nodename.append(" PD1"));
01859 }
01860 case 2:
01861 {
01862 SetDefaultNodeProperties(node2, nodename.append(" PD2"));
01863 }
01864 default:
01865 {
01866 SetDefaultNodeProperties(node2, nodename.append(" PDn"));
01867 }
01868 }
01869
01870 node2->SetProperty( "IsRGBVolume", mitk::BoolProperty::New( true ) );
01871
01872 }
01873
01874
01875 MBI_DEBUG << "Converting to Vectorfield";
01876
01877 typedef itk::Image<itk::Vector<TTensorPixelType,3>, 3> VecImgType2;
01878 VecImgType2::Pointer vecImg5 = VecImgType2::New();
01879 vecImg5->SetSpacing( itkvol->GetSpacing() );
01880 vecImg5->SetOrigin( itkvol->GetOrigin() );
01881 vecImg5->SetDirection( itkvol->GetDirection() );
01882 vecImg5->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion());
01883 vecImg5->SetBufferedRegion( vecImg5->GetLargestPossibleRegion() );
01884 vecImg5->Allocate();
01885 itk::ImageRegionIterator<VecImgType2> ot5 (vecImg5, vecImg5->GetLargestPossibleRegion() );
01886 ot5 = ot5.Begin();
01887
01888 typedef PrincipleDirectionsFilterType::OutputImageType::PixelType VecPixType;
01889 for (it = it.Begin(); !it.IsAtEnd(); ++it)
01890 {
01891 VecPixType vec = it.Get();
01892 itk::Vector<TTensorPixelType,3> pix;
01893 TTensorPixelType uvec[3] = {(TTensorPixelType)(vec[0]),(TTensorPixelType)(vec[1]),(TTensorPixelType)(vec[2])};
01894 pix = uvec;
01895 ot5.Set(pix);
01896 ++ot5;
01897 }
01898
01899
01900 mitk::Image::Pointer image5 = mitk::Image::New();
01901 image5->InitializeByItk( vecImg5.GetPointer() );
01902 image5->SetVolume( vecImg5->GetBufferPointer() );
01903 mitk::DataNode::Pointer node5=mitk::DataNode::New();
01904 node5->SetData( image5 );
01905 mitk::DataStorage::GetInstance()->Add(node5);
01906 switch(numdir)
01907 {
01908 case 0:
01909 {
01910 SetDefaultNodeProperties(node5, nodename.append(" Vec0"));
01911 break;
01912 }
01913 case 1:
01914 {
01915 SetDefaultNodeProperties(node5, nodename.append(" Vec1"));
01916 }
01917 case 2:
01918 {
01919 SetDefaultNodeProperties(node5, nodename.append(" Vec2"));
01920 }
01921 default:
01922 {
01923 SetDefaultNodeProperties(node5, nodename.append(" Vecn"));
01924 }
01925 }
01926 node5->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) );
01927 node5->SetProperty( "NormalizeVecs", mitk::BoolProperty::New( true ) );
01928 node5->SetProperty( "Scale", mitk::FloatProperty::New( 0.8 ) );
01929 node5->SetProperty( "LineWidth", mitk::FloatProperty::New( 3 ) );
01930
01931 mitk::VectorImageMapper2D::Pointer vecMapper5 =
01932 mitk::VectorImageMapper2D::New();
01933 node5->SetMapper(1,vecMapper5);
01934
01935 m_DataTreeIterator->GetTree()->Modified();
01936 m_MultiWidget->RequestUpdate();
01937 TreeChanged();
01938 m_Controls->update();
01939
01940 }
01941
01942 void QmitkDiffusionTensorEstimation::QBallStandardAlgorithmsDeconvolutionButton()
01943 {
01944
01945 itk::TimeProbe clock;
01946 QString status;
01947 const mitk::DataTreeFilter::Item* item
01948 = m_QballVolumesDataTreeFilter->GetSelectedItem();
01949 if(!item)return;
01950
01951 typedef itk::Vector<TTensorPixelType,odfsize> OdfVectorType;
01952 typedef itk::Image<OdfVectorType,3> OdfVectorImgType;
01953 mitk::Image* vol =
01954 static_cast<mitk::Image*>(item->GetNode()->GetData());
01955 OdfVectorImgType::Pointer itkvol = OdfVectorImgType::New();
01956 mitk::CastToItkImage<OdfVectorImgType>(vol, itkvol);
01957 std::string nodename = item->GetProperty("name");
01958
01959 clock.Start();
01960 MBI_INFO << "Computing Diffusion Direction ";
01961 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
01962 "Computing Diffusion Direction for %s", nodename.c_str()));
01963
01964 typedef itk::DiffusionQballGeneralizedFaImageFilter<TTensorPixelType,TTensorPixelType,odfsize>
01965 GfaFilterType;
01966 GfaFilterType::Pointer gfaFilter = GfaFilterType::New();
01967 gfaFilter->SetInput(itkvol);
01968 gfaFilter->SetNumberOfThreads(4);
01969 gfaFilter->Update();
01970 itk::ImageRegionIterator<GfaFilterType::OutputImageType>
01971 itGfa (gfaFilter->GetOutput(),
01972 gfaFilter->GetOutput()->GetLargestPossibleRegion() );
01973 itGfa = itGfa.Begin();
01974
01975 int numdirs = m_Controls->m_QBallStandardAlgorithmsDeconvolutionSpinbox->value();
01976
01977
01978
01979
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991 typedef itk::DiffusionQballSphericalDeconvolutionImageFilter<TTensorPixelType,TTensorPixelType,odfsize,nrconvkernels>
01992 DeconvolutionFilterType;
01993 DeconvolutionFilterType::Pointer devonvolutionFilter
01994 = DeconvolutionFilterType::New();
01995 devonvolutionFilter->SetFractionalThreshold(m_Controls->m_QBallStandardAlgorithmsDeconvolutionThreshEdit->text().toFloat());
01996 if(!m_Controls->m_QBallStandardAlgorithmsDeconvolutionAngResThresholdEdit->text().contains(QString("NaN")))
01997 {
01998 float angRes = m_Controls->m_QBallStandardAlgorithmsDeconvolutionAngResThresholdEdit->text().toFloat();
01999 angRes /= 360/DIFF_EST_PI;
02000 devonvolutionFilter->SetAngularResolutionThreshold(angRes);
02001 }
02002 devonvolutionFilter->SetSamplingQuantileStart(m_Controls->m_QBallStandardAlgorithmsDeconvQuantStart->text().toFloat());
02003 devonvolutionFilter->SetSamplingQuantileStep(m_Controls->m_QBallStandardAlgorithmsDeconvQuantStep->text().toFloat());
02004 devonvolutionFilter->SetMinimumNumberOfSamples(m_Controls->m_QBallStandardAlgorithmsDeconvQuantMinNr->text().toInt());
02005 devonvolutionFilter->SetIterateQuantiles(m_Controls->m_QBallStandardAlgorithmsDeconvQuantMulti->isChecked());
02006 devonvolutionFilter->SetNrDirectionsToExtract(numdirs);
02007 devonvolutionFilter->SetInput(itkvol);
02008 devonvolutionFilter->SetNumberOfThreads(m_Controls->m_QBallStandardAlgorithmsDeconvNumberThreadsSpinbox->value());
02009 devonvolutionFilter->SetGfaImage(gfaFilter->GetOutput());
02010
02011 devonvolutionFilter->Update();
02012
02013 for(int i=0; i<numdirs; i++)
02014 {
02015 itk::ImageRegionIterator<DeconvolutionFilterType::OutputImageType>
02016 it (devonvolutionFilter->GetOutput(i),
02017 devonvolutionFilter->GetOutput()->GetLargestPossibleRegion() );
02018 it = it.Begin();
02019
02020 if(i==0)
02021 {
02022 MBI_INFO << "Converting to RGB";
02023
02024 typedef itk::Image<itk::RGBPixel<uchar>, 3> VecImgType;
02025 VecImgType::Pointer vecImg = VecImgType::New();
02026 vecImg->SetSpacing( itkvol->GetSpacing() );
02027 vecImg->SetOrigin( itkvol->GetOrigin() );
02028 vecImg->SetDirection( itkvol->GetDirection() );
02029 vecImg->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion());
02030 vecImg->SetBufferedRegion( vecImg->GetLargestPossibleRegion() );
02031 vecImg->Allocate();
02032 itk::ImageRegionIterator<VecImgType> ot (vecImg, vecImg->GetLargestPossibleRegion() );
02033 ot = ot.Begin();
02034
02035 typedef DeconvolutionFilterType::OutputImageType::PixelType VecPixType;
02036 for (it = it.Begin(); !it.IsAtEnd(); ++it)
02037 {
02038 VecPixType vec = it.Get();
02039 vnl_vector_fixed<TTensorPixelType, 3> vnlvec = vec.GetVnlVector();
02040 TTensorPixelType len = vnlvec.two_norm();
02041 vnlvec = vnlvec.normalize();
02042
02043 itk::RGBPixel<uchar> pix;
02044 vnlvec*=200*itGfa.Get();
02045 vnlvec[0] = abs(vnlvec[0]);
02046 vnlvec[1] = abs(vnlvec[1]);
02047 vnlvec[2] = abs(vnlvec[2]);
02048 if(vnlvec[0] > 255 || vnlvec[1] > 255 || vnlvec[2] > 255)
02049 {
02050
02051 double max = vnlvec[0];
02052 max = max<vnlvec[1] ? vnlvec[1] : max;
02053 max = max<vnlvec[2] ? vnlvec[2] : max;
02054 vnlvec /= max/255;
02055 }
02056 uchar uvec[3] = {(uchar)(vnlvec[0]),(uchar)(vnlvec[1]),(uchar)(vnlvec[2])};
02057 pix = uvec;
02058 ot.Set(pix);
02059 ++ot;
02060 ++itGfa;
02061 }
02062
02063
02064 mitk::Image::Pointer image2 = mitk::Image::New();
02065 image2->InitializeByItk( vecImg.GetPointer() );
02066 image2->SetVolume( vecImg->GetBufferPointer() );
02067 mitk::DataNode::Pointer node2=mitk::DataNode::New();
02068 node2->SetData( image2 );
02069 mitk::DataStorage::GetInstance()->Add(node2);
02070 switch(i)
02071 {
02072 case 0:
02073 {
02074 SetDefaultNodeProperties(node2, nodename.append(" PD0"));
02075 break;
02076 }
02077 case 1:
02078 {
02079 SetDefaultNodeProperties(node2, nodename.append(" PD1"));
02080 break;
02081 }
02082 case 2:
02083 {
02084 SetDefaultNodeProperties(node2, nodename.append(" PD2"));
02085 break;
02086 }
02087 default:
02088 {
02089 SetDefaultNodeProperties(node2, nodename.append(" PDn"));
02090 break;
02091 }
02092 }
02093
02094 node2->SetProperty( "IsRGBVolume", mitk::BoolProperty::New( true ) );
02095 }
02096
02097
02098 MBI_INFO << "Converting to Vectorfield";
02099
02100 typedef itk::Image<itk::Vector<TTensorPixelType,3>, 3> VecImgType2;
02101 VecImgType2::Pointer vecImg5 = VecImgType2::New();
02102 vecImg5->SetSpacing( itkvol->GetSpacing() );
02103 vecImg5->SetOrigin( itkvol->GetOrigin() );
02104 vecImg5->SetDirection( itkvol->GetDirection() );
02105 vecImg5->SetLargestPossibleRegion( itkvol->GetLargestPossibleRegion());
02106 vecImg5->SetBufferedRegion( vecImg5->GetLargestPossibleRegion() );
02107 vecImg5->Allocate();
02108 itk::ImageRegionIterator<VecImgType2> ot5 (vecImg5, vecImg5->GetLargestPossibleRegion() );
02109 ot5 = ot5.Begin();
02110
02111 typedef DeconvolutionFilterType::OutputImageType::PixelType VecPixType;
02112 for (it = it.Begin(); !it.IsAtEnd(); ++it)
02113 {
02114 VecPixType vec = it.Get();
02115 vnl_vector_fixed<TTensorPixelType, 3> vnlvec = vec.GetVnlVector();
02116 vnlvec = vnlvec.normalize();
02117
02118 itk::Vector<TTensorPixelType,3> pix;
02119 TTensorPixelType uvec[3] = {(TTensorPixelType)(vnlvec[0]),(TTensorPixelType)(vnlvec[1]),(TTensorPixelType)(vnlvec[2])};
02120 pix = uvec;
02121 ot5.Set(pix);
02122 ++ot5;
02123 }
02124
02125
02126 mitk::Image::Pointer image5 = mitk::Image::New();
02127 image5->InitializeByItk( vecImg5.GetPointer() );
02128 image5->SetVolume( vecImg5->GetBufferPointer() );
02129 mitk::DataNode::Pointer node5=mitk::DataNode::New();
02130 node5->SetData( image5 );
02131 mitk::DataStorage::GetInstance()->Add(node5);
02132 switch(i)
02133 {
02134 case 0:
02135 {
02136 SetDefaultNodeProperties(node5, nodename.append(" Vec0"));
02137 break;
02138 }
02139 case 1:
02140 {
02141 SetDefaultNodeProperties(node5, nodename.append(" Vec1"));
02142 break;
02143 }
02144 case 2:
02145 {
02146 SetDefaultNodeProperties(node5, nodename.append(" Vec2"));
02147 break;
02148 }
02149 default:
02150 {
02151 SetDefaultNodeProperties(node5, nodename.append(" Vecn"));
02152 break;
02153 }
02154 }
02155 node5->SetProperty( "IsDirectionVolume", mitk::BoolProperty::New( true ) );
02156 node5->SetProperty( "NormalizeVecs", mitk::BoolProperty::New( true ) );
02157 node5->SetProperty( "Scale", mitk::FloatProperty::New( 0.8 ) );
02158 node5->SetProperty( "LineWidth", mitk::FloatProperty::New( 3 ) );
02159
02160 mitk::VectorImageMapper2D::Pointer vecMapper5 =
02161 mitk::VectorImageMapper2D::New();
02162 node5->SetMapper(1,vecMapper5);
02163 }
02164 m_DataTreeIterator->GetTree()->Modified();
02165 m_MultiWidget->RequestUpdate();
02166 TreeChanged();
02167 m_Controls->update();
02168
02169 }
02170
02171 void QmitkDiffusionTensorEstimation::SetDefaultNodeProperties(mitk::DataNode::Pointer node, std::string name)
02172 {
02173 node->SetProperty( "volumerendering", mitk::BoolProperty::New( false ) );
02174 node->SetProperty( "use color", mitk::BoolProperty::New( true ) );
02175 node->SetProperty( "texture interpolation", mitk::BoolProperty::New( true ) );
02176 node->SetProperty( "reslice interpolation", mitk::VtkResliceInterpolationProperty::New() );
02177 node->SetProperty( "layer", mitk::IntProperty::New(0));
02178 node->SetProperty( "in plane resample extent by geometry", mitk::BoolProperty::New( false ) );
02179 node->SetOpacity(1.0f);
02180 node->SetColor(1.0,1.0,1.0);
02181 node->SetVisibility(true);
02182
02183 mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New();
02184 mitk::LevelWindow levelwindow;
02185
02186 levWinProp->SetLevelWindow( levelwindow );
02187 node->GetPropertyList()->SetProperty( "levelwindow", levWinProp );
02188
02189
02190 if(!node->GetProperty("LookupTable"))
02191 {
02192 mitk::LookupTable::Pointer mitkLut = mitk::LookupTable::New();
02193 vtkLookupTable* vtkLut = mitkLut->GetVtkLookupTable();
02194 vtkLut->SetHueRange(0.6667, 0.0);
02195 vtkLut->SetTableRange(0.0, 20.0);
02196 vtkLut->Build();
02197 mitk::LookupTableProperty::Pointer mitkLutProp = mitk::LookupTableProperty::New();
02198 mitkLutProp->SetLookupTable(mitkLut);
02199 node->SetProperty( "LookupTable", mitkLutProp );
02200 }
02201 if(!node->GetProperty("binary"))
02202 node->SetProperty( "binary", mitk::BoolProperty::New( false ) );
02203
02204
02205 mitk::TransferFunction::Pointer tf = mitk::TransferFunction::New();
02206 node->SetProperty ( "TransferFunction", mitk::TransferFunctionProperty::New ( tf.GetPointer() ) );
02207
02208
02209 mitk::StringProperty::Pointer nameProp = mitk::StringProperty::New( name );
02210 node->SetProperty( "name", nameProp );
02211 }
02212
02213 void QmitkDiffusionTensorEstimation::DirectionVolumesAngularErrorButton()
02214 {
02215 try
02216 {
02217
02218 const mitk::DataTreeFilter::ItemSet* selectedItems
02219 = m_DirectionVolumesDataTreeFilter->GetSelectedItems();
02220 int nrFiles = selectedItems->size();
02221 if (nrFiles != 2) return;
02222
02223 mitk::DataTreeFilter::ItemSet::const_iterator itemiter( selectedItems->begin() );
02224
02225 mitk::Image::Pointer vol1 =
02226 static_cast<mitk::Image*>((*itemiter)->GetNode()->GetData());
02227 if( !vol1)return;
02228 std::string nodename1 = (*itemiter)->GetProperty("name");
02229
02230 itemiter++;
02231
02232 mitk::Image::Pointer vol2 =
02233 static_cast<mitk::Image*>((*itemiter)->GetNode()->GetData());
02234 if( !vol2)return;
02235 std::string nodename2 = (*itemiter)->GetProperty("name");
02236
02237 typedef itk::Image<itk::Vector<TTensorPixelType,3>,3 > IType;
02238 IType::Pointer itkVol1 = IType::New();
02239 mitk::CastToItkImage<IType>(vol1, itkVol1);
02240
02241 IType::Pointer itkVol2 = IType::New();
02242 mitk::CastToItkImage<IType>(vol2, itkVol2);
02243
02244 typedef itk::VectorImagesAngularErrorImageFilter<TTensorPixelType,3> FilterType;
02245 FilterType::Pointer filter = FilterType::New();
02246 filter->SetInput(itkVol1);
02247 filter->SetImage2(itkVol2.GetPointer());
02248 filter->SetNumberOfThreads(4);
02249 filter->Update();
02250
02251
02252 mitk::Image::Pointer image = mitk::Image::New();
02253 image->InitializeByItk( filter->GetOutput() );
02254 image->SetVolume( filter->GetOutput()->GetBufferPointer() );
02255 mitk::DataNode::Pointer node=mitk::DataNode::New();
02256 node->SetData( image );
02257 mitk::DataStorage::GetInstance()->Add(node);
02258 SetDefaultNodeProperties(node, nodename1.append(" ").append(nodename2).append(" ERR"));
02259 node->SetProperty( "IsErrorVolume", mitk::BoolProperty::New( true ) );
02260
02261 TreeChanged();
02262 m_Controls->update();
02263
02264 QString status;
02265 mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished computing Angular Error"));
02266
02267 }
02268 catch (itk::ExceptionObject &ex)
02269 {
02270 MBI_INFO << ex;
02271 return ;
02272 }
02273
02274 }
02275
02276
02277
02278
02279
02280
02281
02282
02283
02284
02285
02286
02287
02288
02289
02290
02291
02292
02293
02294
02295
02296
02297
02298
02299
02300
02301
02302
02303
02304
02305
02306
02307
02308
02309
02310
02311
02312
02313
02314
02315
02316
02317
02318
02319
02320
02321
02322
02323
02324
02325
02326
02327
02328
02329
02330
02331
02332
02333
02334
02335
02336
02337
02338
02339
02340
02341
02342
02343
02344
02345
02346
02347
02348
02349
02350
02351
02352
02353
02354
02355
02356
02357
02358
02359
02360
02361
02362
02363
02364
02365
02366
02367
02368
02369
02370
02371
02372
02373
02374
02375
02376
02377
02378
02379
02380
02381
02382 void QmitkDiffusionTensorEstimation::DiffusionVolumeSaveButton()
02383 {
02384
02385 const mitk::DataTreeFilter::Item* selectedItem
02386 = m_DiffusionVolumesDataTreeFilter->GetSelectedItem();
02387 if( !selectedItem )
02388 return;
02389 mitk::DiffusionVolumes<DiffusionPixelType>::Pointer diffVolumes =
02390 static_cast<mitk::DiffusionVolumes<DiffusionPixelType>*>(selectedItem->GetNode()->GetData());
02391
02392 std::string sName = selectedItem->GetNode()->GetName();
02393 QString qName;
02394 qName.sprintf("%s.nhdr",sName.c_str());
02395
02396
02397
02398
02399
02400
02401
02402
02403
02404
02405
02406 QString filename = QFileDialog::getSaveFileName(
02407 qName,
02408 "Nrrd Images (*.nrrd *.nhdr)",
02409 this->m_Controls,
02410 "save file dialog",
02411 "Select Nrrd Outputfile" );
02412
02413 if ( !filename )
02414 return;
02415
02416
02417 typedef mitk::NrrdDiffusionVolumesWriter<DiffusionImageType> WriterType;
02418 WriterType::Pointer nrrdWriter = WriterType::New();
02419 nrrdWriter->SetInput( diffVolumes->GetImage() );
02420 nrrdWriter->SetDirections(diffVolumes->GetDirections());
02421 nrrdWriter->SetB_Value(diffVolumes->GetB_Value());
02422 nrrdWriter->SetFileName(filename.ascii());
02423 try
02424 {
02425 nrrdWriter->Update();
02426 }
02427 catch (itk::ExceptionObject e)
02428 {
02429 MBI_INFO << e;
02430 }
02431 }
02432
02433 void QmitkDiffusionTensorEstimation::DiffusionVolumesLoadButton()
02434 {
02435
02436 QFileDialog* w = new QFileDialog( this->m_Controls, "Select DWI data file", TRUE );
02437 w->setMode( QFileDialog::ExistingFiles );
02438 w->setFilter( "Nrrd Images (*.nrrd *.nhdr)" );
02439
02440
02441 if ( w->exec() != QDialog::Accepted )
02442 return;
02443
02444 QStringList filenames = w->selectedFiles();
02445 QStringList::Iterator it = filenames.begin();
02446 while( it != filenames.end() ) {
02447 std::string filename = ( *it ).ascii();
02448 ++it;
02449
02450
02451 typedef mitk::NrrdDiffusionVolumesReader<DiffusionImageType> ReaderType;
02452 ReaderType::Pointer nrrdReader = ReaderType::New();
02453 nrrdReader->SetFileName(filename);
02454 try
02455 {
02456 nrrdReader->Update();
02457
02458
02459 typedef mitk::DiffusionVolumes<DiffusionPixelType> DiffVolumesType;
02460 DiffVolumesType::Pointer diffVolumes = DiffVolumesType::New();
02461 diffVolumes->SetDirections(nrrdReader->GetDiffusionVectors());
02462 diffVolumes->SetB_Value(nrrdReader->GetB_Value());
02463 diffVolumes->SetImage(nrrdReader->GetOutput());
02464 mitk::DataNode::Pointer node=mitk::DataNode::New();
02465 node->SetData( diffVolumes );
02466 mitk::DataStorage::GetInstance()->Add(node);
02467 SetDefaultNodeProperties(node, itksys::SystemTools::GetFilenameName(filename));
02468
02469 TreeChanged();
02470 }
02471 catch (itk::ExceptionObject e)
02472 {
02473 MBI_INFO << e;
02474 }
02475
02476 }
02477 }
02478
02479 void QmitkDiffusionTensorEstimation::DiffusionVolumesRemoveButton()
02480 {
02481 m_DiffusionVolumesDataTreeFilter->DeleteSelectedItems();
02482 }
02483
02484 void QmitkDiffusionTensorEstimation::DiffusionVolumesSelectAll()
02485 {
02486 const mitk::DataTreeFilter::ItemList* items = m_DiffusionVolumesDataTreeFilter->GetItems();
02487
02488 mitk::DataTreeFilter::ConstItemIterator itemiter( items->Begin() );
02489 mitk::DataTreeFilter::ConstItemIterator itemiterend( items->End() );
02490
02491 while ( itemiter != itemiterend )
02492 {
02493 m_DiffusionVolumesDataTreeFilter->SelectItem(*itemiter);
02494 ++itemiter;
02495 }
02496
02497 }