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 "QmitkDemonsRegistrationView.h"
00028 #include "ui_QmitkDemonsRegistrationViewControls.h"
00029 #include "mitkITKImageImport.h"
00030 #include "mitkProgressBar.h"
00031
00032 QmitkDemonsRegistrationView::QmitkDemonsRegistrationView(QWidget* parent, Qt::WindowFlags f ) : QWidget( parent, f ),
00033 m_FixedNode(NULL), m_MovingNode(NULL), m_ResultImage(NULL), m_ResultDeformationField(NULL)
00034 {
00035 m_Controls.setupUi(parent);
00036
00037 QValidator* validatorHistogramLevels = new QIntValidator(1, 20000000, this);
00038 m_Controls.m_NumberOfHistogramLevels->setValidator(validatorHistogramLevels);
00039
00040 QValidator* validatorMatchPoints = new QIntValidator(1, 20000000, this);
00041 m_Controls.m_NumberOfMatchPoints->setValidator(validatorMatchPoints);
00042
00043 QValidator* validatorIterations = new QIntValidator(1, 20000000, this);
00044 m_Controls.m_Iterations->setValidator(validatorIterations);
00045
00046 QValidator* validatorStandardDeviation = new QDoubleValidator(0, 20000000, 2, this);
00047 m_Controls.m_StandardDeviation->setValidator(validatorStandardDeviation);
00048 }
00049
00050 QmitkDemonsRegistrationView::~QmitkDemonsRegistrationView()
00051 {
00052 }
00053
00054
00055 int QmitkDemonsRegistrationView::GetNumberOfIterations()
00056 {
00057 return atoi(m_Controls.m_Iterations->text().toLatin1());
00058 }
00059
00060 float QmitkDemonsRegistrationView::GetStandardDeviation()
00061 {
00062 return atof(m_Controls.m_StandardDeviation->text().toLatin1());
00063 }
00064
00065 mitk::Image::Pointer QmitkDemonsRegistrationView::GetResultImage()
00066 {
00067 return m_ResultImage;
00068 }
00069
00070 mitk::Image::Pointer QmitkDemonsRegistrationView::GetResultDeformationfield()
00071 {
00072 return m_ResultDeformationField;
00073 }
00074
00075 void QmitkDemonsRegistrationView::CalculateTransformation()
00076 {
00077 if (m_FixedNode.IsNotNull() && m_MovingNode.IsNotNull())
00078 {
00079 mitk::Image::Pointer fimage = dynamic_cast<mitk::Image*>(m_FixedNode->GetData());
00080 mitk::Image::Pointer mimage = dynamic_cast<mitk::Image*>(m_MovingNode->GetData());
00081
00082 mitk::Image::RegionType fimageRegion = fimage->GetLargestPossibleRegion();
00083 mitk::Image::RegionType mimageRegion = mimage->GetLargestPossibleRegion();
00084 if (!((fimageRegion.GetSize(0)>=mimageRegion.GetSize(0))&&(fimageRegion.GetSize(1)>=mimageRegion.GetSize(1))
00085 &&(fimageRegion.GetSize(2)>=mimageRegion.GetSize(2))))
00086 {
00087 QMessageBox::information(NULL,"Registration","Fixed image must be equal or bigger in size than moving image.");
00088 return;
00089 }
00090 if ( m_Controls.m_RegistrationSelection->currentIndex() == 0)
00091 {
00092 mitk::DemonsRegistration::Pointer registration = mitk::DemonsRegistration::New();
00093 registration->SetSaveDeformationField(false);
00094 registration->SetSaveResult(false);
00095 registration->SetReferenceImage(fimage);
00096 registration->SetNumberOfIterations(atoi(m_Controls.m_Iterations->text().toLatin1()));
00097 registration->SetStandardDeviation(atof(m_Controls.m_StandardDeviation->text().toLatin1()));
00098 if (m_Controls.m_UseHistogramMatching->isChecked())
00099 {
00100 mitk::HistogramMatching::Pointer histogramMatching = mitk::HistogramMatching::New();
00101 histogramMatching->SetReferenceImage(fimage);
00102 histogramMatching->SetInput(mimage);
00103 histogramMatching->SetNumberOfHistogramLevels(atoi(m_Controls.m_NumberOfHistogramLevels->text().toLatin1()));
00104 histogramMatching->SetNumberOfMatchPoints(atoi(m_Controls.m_NumberOfMatchPoints->text().toLatin1()));
00105 histogramMatching->SetThresholdAtMeanIntensity(m_Controls.m_ThresholdAtMeanIntensity->isChecked());
00106 histogramMatching->Update();
00107 mitk::Image::Pointer histimage = histogramMatching->GetOutput();
00108 if (histimage.IsNotNull())
00109 {
00110 registration->SetInput(histimage);
00111 }
00112 else
00113 {
00114 registration->SetInput(mimage);
00115 }
00116 }
00117 else
00118 {
00119 registration->SetInput(mimage);
00120 }
00121 try
00122 {
00123 registration->Update();
00124 }
00125 catch (itk::ExceptionObject& excpt)
00126 {
00127 QMessageBox::information( this, "Registration exception", excpt.GetDescription(), QMessageBox::Ok );
00128 mitk::ProgressBar::GetInstance()->Progress(4);
00129 return;
00130 }
00131 m_ResultImage = registration->GetOutput();
00132 typedef itk::Image<itk::Vector<float,3>, 3> VectorImageType;
00133 VectorImageType::Pointer deformationField = registration->GetDeformationField();
00134 m_ResultDeformationField = mitk::ImportItkImage(deformationField);
00135 }
00136 else if(m_Controls.m_RegistrationSelection->currentIndex() == 1)
00137 {
00138 mitk::SymmetricForcesDemonsRegistration::Pointer registration = mitk::SymmetricForcesDemonsRegistration::New();
00139 registration->SetSaveDeformationField(false);
00140 registration->SetSaveResult(false);
00141 registration->SetReferenceImage(fimage);
00142 registration->SetNumberOfIterations(atoi(m_Controls.m_Iterations->text().toLatin1()));
00143 registration->SetStandardDeviation(atof(m_Controls.m_StandardDeviation->text().toLatin1()));
00144 if (m_Controls.m_UseHistogramMatching->isChecked())
00145 {
00146 mitk::HistogramMatching::Pointer histogramMatching = mitk::HistogramMatching::New();
00147 histogramMatching->SetReferenceImage(fimage);
00148 histogramMatching->SetInput(mimage);
00149 histogramMatching->SetNumberOfHistogramLevels(atoi(m_Controls.m_NumberOfHistogramLevels->text().toLatin1()));
00150 histogramMatching->SetNumberOfMatchPoints(atoi(m_Controls.m_NumberOfMatchPoints->text().toLatin1()));
00151 histogramMatching->SetThresholdAtMeanIntensity(m_Controls.m_ThresholdAtMeanIntensity->isChecked());
00152 histogramMatching->Update();
00153 mitk::Image::Pointer histimage = histogramMatching->GetOutput();
00154 if (histimage.IsNotNull())
00155 {
00156 registration->SetInput(histimage);
00157 }
00158 else
00159 {
00160 registration->SetInput(mimage);
00161 }
00162 }
00163 else
00164 {
00165 registration->SetInput(mimage);
00166 }
00167 try
00168 {
00169 registration->Update();
00170 }
00171 catch (itk::ExceptionObject& excpt)
00172 {
00173 QMessageBox::information( this, "Registration exception", excpt.GetDescription(), QMessageBox::Ok );
00174 mitk::ProgressBar::GetInstance()->Progress(4);
00175 return;
00176 }
00177 m_ResultImage = registration->GetOutput();
00178 typedef itk::Image<itk::Vector<float,3>, 3> VectorImageType;
00179 VectorImageType::Pointer deformationField = registration->GetDeformationField();
00180 m_ResultDeformationField = mitk::ImportItkImage(deformationField);
00181 }
00182 }
00183 }
00184
00185 void QmitkDemonsRegistrationView::SetFixedNode( mitk::DataNode * fixedNode )
00186 {
00187 m_FixedNode = fixedNode;
00188 }
00189
00190 void QmitkDemonsRegistrationView::SetMovingNode( mitk::DataNode * movingNode )
00191 {
00192 m_MovingNode = movingNode;
00193 }
00194
00195 void QmitkDemonsRegistrationView::UseHistogramMatching( bool useHM )
00196 {
00197 if (useHM)
00198 {
00199 m_Controls.numberOfHistogramLevels->setEnabled(true);
00200 m_Controls.m_NumberOfHistogramLevels->setEnabled(true);
00201 m_Controls.numberOfMatchPoints->setEnabled(true);
00202 m_Controls.m_NumberOfMatchPoints->setEnabled(true);
00203 m_Controls.thresholdAtMeanIntensity->setEnabled(true);
00204 m_Controls.m_ThresholdAtMeanIntensity->setEnabled(true);
00205 }
00206 else
00207 {
00208 m_Controls.numberOfHistogramLevels->setEnabled(false);
00209 m_Controls.m_NumberOfHistogramLevels->setEnabled(false);
00210 m_Controls.numberOfMatchPoints->setEnabled(false);
00211 m_Controls.m_NumberOfMatchPoints->setEnabled(false);
00212 m_Controls.thresholdAtMeanIntensity->setEnabled(false);
00213 m_Controls.m_ThresholdAtMeanIntensity->setEnabled(false);
00214 }
00215 }