Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <qvalidator.h>
00019 #include <mitkImageCast.h>
00020 #include <stdio.h>
00021 #include <stdlib.h>
00022 #include <mitkLevelWindowProperty.h>
00023 #include <mitkRenderingManager.h>
00024 #include "itkRegularStepGradientDescentOptimizer.h"
00025 #include <qfiledialog.h>
00026 #include <qmessagebox.h>
00027 #include "QmitkBSplineRegistrationView.h"
00028 #include "ui_QmitkBSplineRegistrationViewControls.h"
00029 #include "mitkBSplineRegistration.h"
00030 #include "itkImageFileReader.h"
00031
00032
00033 typedef itk::Vector< float, 3 > VectorType;
00034 typedef itk::Image< VectorType, 3 > DeformationFieldType;
00035
00036 typedef itk::ImageFileReader< DeformationFieldType > ImageReaderType;
00037
00038 QmitkBSplineRegistrationView::QmitkBSplineRegistrationView(QWidget* parent, Qt::WindowFlags f ) : QWidget( parent, f ),
00039 m_FixedNode(NULL), m_MovingNode(NULL)
00040 {
00041 m_Controls.setupUi(parent);
00042
00043 QObject::connect( (QObject*)(m_Controls.m_PrintDeformField),
00044 SIGNAL(clicked()),
00045 (QObject*) this,
00046 SLOT(PrintDeformationField()) );
00047
00048
00049
00050
00051 QObject::connect( (QObject*)(m_Controls.m_BrowseDeformationField),
00052 SIGNAL(clicked()),
00053 (QObject*) this,
00054 SLOT(SelectDeformationField()) );
00055
00056 connect( m_Controls.m_OptimizerSelector, SIGNAL(activated(int)), m_Controls.m_OptimizerWidgetStack, SLOT(setCurrentIndex(int)));
00057 connect( m_Controls.m_OptimizerSelector, SIGNAL(activated(int)), this, SLOT(OptimizerSelected(int)));
00058
00059 }
00060
00061 QmitkBSplineRegistrationView::~QmitkBSplineRegistrationView()
00062 {
00063 }
00064
00065
00066 void QmitkBSplineRegistrationView::OptimizerSelected(int optimizer)
00067 {
00068 HideAllOptimizerFrames();
00069 if(optimizer == 0)
00070 {
00071 m_Controls.m_LBFGSFrame->show();
00072 }
00073 else if(optimizer == 1)
00074 {
00075 m_Controls.m_GradientDescentFrame->show();
00076 }
00077 }
00078
00079 void QmitkBSplineRegistrationView::HideAllOptimizerFrames()
00080 {
00081 m_Controls.m_LBFGSFrame->hide();
00082 m_Controls.m_GradientDescentFrame->hide();
00083 }
00084
00085 void QmitkBSplineRegistrationView::SelectDeformationField()
00086 {
00087
00088 QFileDialog* w = new QFileDialog( this, "Select Deformation Field" );
00089 w->setFileMode( QFileDialog::ExistingFiles );
00090 w->setFilter( "Images (*.mhd)" );
00091 w->setDirectory("G:\\home\\vanbrugg\\testimages\\deformable");
00092
00093
00094 if ( w->exec() != QDialog::Accepted )
00095 {
00096 return;
00097 cout << "Failed to load" << endl;
00098 }
00099
00100 QStringList filenames = w->selectedFiles();
00101 QStringList::Iterator it = filenames.begin();
00102 if( it != filenames.end() ) {
00103 std::string filename = ( *it ).toStdString();
00104 ++it;
00105 QString qStr = QString( filename.c_str() );
00106 m_Controls.m_DeformationField->setText(qStr);
00107 }
00108
00109 }
00110
00111
00112
00113 void QmitkBSplineRegistrationView::PrintDeformationField()
00114 {
00115
00116 ImageReaderType::Pointer reader = ImageReaderType::New();
00117 reader->SetFileName( m_Controls.m_DeformationField->text().toStdString() );
00118 reader->Update();
00119
00120 DeformationFieldType::Pointer deformationField = reader->GetOutput();
00121
00122
00123 typedef itk::ImageRegionIterator<DeformationFieldType> IteratorType;
00124 IteratorType deformIter(deformationField, deformationField->GetRequestedRegion());
00125
00126 for(deformIter.GoToBegin(); !deformIter.IsAtEnd(); ++deformIter)
00127 {
00128 std::cout << deformIter.Get() << std::endl;
00129 }
00130 }
00131
00132
00133 void QmitkBSplineRegistrationView::CalculateTransformation()
00134 {
00135 if (m_FixedNode != NULL && m_MovingNode != NULL)
00136 {
00137 mitk::Image::Pointer fimage = dynamic_cast<mitk::Image*>(m_FixedNode->GetData());
00138 mitk::Image::Pointer mimage = dynamic_cast<mitk::Image*>(m_MovingNode->GetData());
00139
00140
00141 mitk::BSplineRegistration::Pointer registration = mitk::BSplineRegistration::New();
00142
00143 registration->SetSaveResult(false);
00144 registration->SetReferenceImage(fimage);
00145 registration->SetInput(mimage);
00146
00147
00148 setOptimizerParameters();
00149
00150 registration->SetNumberOfGridPoints( m_Controls.m_NumberOfGridNodes->text().toInt() );
00151 registration->SetOptimizerParameters(m_OptimizerParameters);
00152 registration->SetUpdateInputImage(true);
00153
00154 if(m_Controls.m_SaveDeformFieldCheck->isChecked())
00155 {
00156
00157 registration->SetSaveDeformationField(true);
00158 registration->SetDeformationFileName( m_Controls.m_DeformationField->text().toStdString() );
00159 }
00160
00161
00162 try
00163 {
00164 registration->Update();
00165 }
00166 catch (itk::ExceptionObject& excpt)
00167 {
00168 QMessageBox::information( this, "Registration exception", excpt.GetDescription(), QMessageBox::Ok );
00169 }
00170
00171 mitk::Image::Pointer image = registration->GetOutput();
00172
00173 if (image.IsNotNull())
00174 {
00175 m_MovingNode->SetData(image);
00176 mitk::LevelWindowProperty::Pointer levWinProp = mitk::LevelWindowProperty::New();
00177 mitk::LevelWindow levelWindow;
00178 levelWindow.SetAuto( image );
00179 levWinProp->SetLevelWindow(levelWindow);
00180 m_MovingNode->GetPropertyList()->SetProperty("levelwindow",levWinProp);
00181 }
00182
00183 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00184 }
00185 }
00186
00187 void QmitkBSplineRegistrationView::setOptimizerParameters()
00188 {
00189 m_OptimizerParameters = mitk::OptimizerParameters::New();
00190
00191 if(m_Controls.m_OptimizerSelector->currentText() == "LBFGSOptimizer")
00192 {
00193 m_OptimizerParameters->SetOptimizer(mitk::OptimizerParameters::LBFGSOPTIMIZER);
00194 m_OptimizerParameters->SetGradientConvergenceToleranceLBFGS( m_Controls.m_GradConvTolerance->text().toFloat() );
00195 m_OptimizerParameters->SetLineSearchAccuracyLBFGS( m_Controls.m_LineSearchAccuracy->text().toFloat() );
00196 m_OptimizerParameters->SetDefaultStepLengthLBFGS( m_Controls.m_DefaultStepLength->text().toFloat() );
00197 m_OptimizerParameters->SetNumberOfIterationsLBFGS( m_Controls.m_FunctionEvaluations->text().toInt() );
00198 }
00199 else if(m_Controls.m_OptimizerSelector->currentText() == "Gradient Descent")
00200 {
00201 m_OptimizerParameters->SetOptimizer(mitk::OptimizerParameters::GRADIENTDESCENTOPTIMIZER);
00202 m_OptimizerParameters->SetLearningRateGradientDescent( m_Controls.m_LearningRateGradientDescent->text().toFloat() );
00203 m_OptimizerParameters->SetNumberOfIterationsGradientDescent (m_Controls.m_NumberOfIterationsGradientDescent->text().toInt() );
00204 }
00205 }
00206
00207
00208 void QmitkBSplineRegistrationView::SetFixedNode( mitk::DataNode * fixedNode )
00209 {
00210 m_FixedNode = fixedNode;
00211 }
00212
00213 void QmitkBSplineRegistrationView::SetMovingNode( mitk::DataNode * movingNode )
00214 {
00215 m_MovingNode = movingNode;
00216 }
00217