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 "QmitkVersorTransformView.h"
00019 #include "mitkImageAccessByItk.h"
00020 #include <itkVersorTransform.h>
00021 #include <itkCenteredTransformInitializer.h>
00022 #include <QValidator>
00023
00024 QmitkVersorTransformView::QmitkVersorTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f),
00025 m_CenterX(0), m_CenterY(0), m_CenterZ(0)
00026 {
00027 }
00028
00029 QmitkVersorTransformView::~QmitkVersorTransformView()
00030 {
00031 }
00032
00033 itk::Object::Pointer QmitkVersorTransformView::GetTransform()
00034 {
00035 if (m_FixedImage.IsNotNull())
00036 {
00037 AccessByItk(m_FixedImage, GetTransform2);
00038 return m_TransformObject;
00039 }
00040 return NULL;
00041 }
00042
00043 template < class TPixelType, unsigned int VImageDimension >
00044 itk::Object::Pointer QmitkVersorTransformView::GetTransform2(itk::Image<TPixelType, VImageDimension>* )
00045 {
00046 if (VImageDimension == 3)
00047 {
00048 typedef typename itk::Image< TPixelType, 3 > FixedImage3DType;
00049 typedef typename itk::Image< TPixelType, 3 > MovingImage3DType;
00050 typename FixedImage3DType::Pointer fixedImage3D;
00051 mitk::CastToItkImage(m_FixedImage, fixedImage3D);
00052 typename MovingImage3DType::Pointer movingImage3D;
00053 mitk::CastToItkImage(m_MovingImage, movingImage3D);
00054 typename itk::VersorTransform< double >::Pointer transformPointer = itk::VersorTransform< double >::New();
00055 transformPointer->SetIdentity();
00056 typedef typename itk::VersorTransform< double > VersorTransformType;
00057 if (m_Controls.m_CenterForInitializerVersor->isChecked())
00058 {
00059 typedef typename itk::CenteredTransformInitializer<VersorTransformType, FixedImage3DType, MovingImage3DType> TransformInitializerType;
00060 typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New();
00061 transformInitializer->SetFixedImage( fixedImage3D );
00062 transformInitializer->SetMovingImage( movingImage3D );
00063 transformInitializer->SetTransform( transformPointer );
00064 if (m_Controls.m_MomentsVersor->isChecked())
00065 {
00066 transformInitializer->MomentsOn();
00067 }
00068 else
00069 {
00070 transformInitializer->GeometryOn();
00071 }
00072 transformInitializer->InitializeTransform();
00073 }
00074 m_CenterX = transformPointer->GetCenter()[0];
00075 m_CenterY = transformPointer->GetCenter()[1];
00076 m_CenterZ = transformPointer->GetCenter()[2];
00077 m_TransformObject = transformPointer.GetPointer();
00078 return transformPointer.GetPointer();
00079 }
00080 return NULL;
00081 }
00082
00083 itk::Array<double> QmitkVersorTransformView::GetTransformParameters()
00084 {
00085 itk::Array<double> transformValues;
00086 transformValues.SetSize(6);
00087 transformValues.fill(0);
00088 transformValues[0] = m_Controls.m_UseOptimizerScalesVersor->isChecked();
00089 transformValues[1] = m_Controls.m_ScalesVersorTransformScale1->text().toDouble();
00090 transformValues[2] = m_Controls.m_ScalesVersorTransformScale2->text().toDouble();
00091 transformValues[3] = m_Controls.m_ScalesVersorTransformScale3->text().toDouble();
00092 transformValues[4] = m_Controls.m_CenterForInitializerVersor->isChecked();
00093 transformValues[5] = m_Controls.m_MomentsVersor->isChecked();
00094 return transformValues;
00095 }
00096
00097 void QmitkVersorTransformView::SetTransformParameters(itk::Array<double> transformValues)
00098 {
00099 m_Controls.m_UseOptimizerScalesVersor->setChecked(transformValues[0]);
00100 m_Controls.m_ScalesVersorTransformScale1->setText(QString::number(transformValues[1]));
00101 m_Controls.m_ScalesVersorTransformScale2->setText(QString::number(transformValues[2]));
00102 m_Controls.m_ScalesVersorTransformScale3->setText(QString::number(transformValues[3]));
00103 m_Controls.m_CenterForInitializerVersor->setChecked(transformValues[4]);
00104 m_Controls.m_MomentsVersor->setChecked(transformValues[5]);
00105 m_Controls.m_GeometryVersor->setChecked(!transformValues[5]);
00106 }
00107
00108 QString QmitkVersorTransformView::GetName()
00109 {
00110 return "Versor";
00111 }
00112
00113 void QmitkVersorTransformView::SetupUI(QWidget* parent)
00114 {
00115 m_Controls.setupUi(parent);
00116 QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this);
00117 m_Controls.m_ScalesVersorTransformScale1->setValidator(validatorLineEditInputFloat);
00118 m_Controls.m_ScalesVersorTransformScale2->setValidator(validatorLineEditInputFloat);
00119 m_Controls.m_ScalesVersorTransformScale3->setValidator(validatorLineEditInputFloat);
00120 }
00121
00122 itk::Array<double> QmitkVersorTransformView::GetScales()
00123 {
00124 itk::Array<double> scales;
00125 scales.SetSize(3);
00126 scales.Fill(1.0);
00127 if (m_Controls.m_UseOptimizerScalesVersor->isChecked())
00128 {
00129 scales[0] = m_Controls.m_ScalesVersorTransformScale1->text().toDouble();
00130 scales[1] = m_Controls.m_ScalesVersorTransformScale2->text().toDouble();
00131 scales[2] = m_Controls.m_ScalesVersorTransformScale3->text().toDouble();
00132 }
00133 return scales;
00134 }
00135
00136 vtkTransform* QmitkVersorTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array<double> transformParams)
00137 {
00138 if (m_MovingImage.IsNotNull())
00139 {
00140 itk::VersorTransform<double>::Pointer versorTransform = itk::VersorTransform<double>::New();
00141 versorTransform->SetParameters(transformParams);
00142 itk::Matrix<double, 3, 3> Matrix = versorTransform->GetMatrix();
00143 for (int i = 0; i < 3; i++)
00144 {
00145 for (int j = 0; j < 3; j++)
00146 {
00147 vtkmatrix->SetElement(i, j, Matrix[i][j]);
00148 }
00149 }
00150 float center[4];
00151 float translation[4];
00152 center[0] = m_CenterX;
00153 center[1] = m_CenterY;
00154 center[2] = m_CenterZ;
00155 center[3] = 1;
00156 vtkmatrix->MultiplyPoint(center, translation);
00157 vtkmatrix->SetElement(0, 3, -translation[0] + center[0]);
00158 vtkmatrix->SetElement(1, 3, -translation[1] + center[1]);
00159 vtkmatrix->SetElement(2, 3, -translation[2] + center[2]);
00160 vtktransform->SetMatrix(vtkmatrix);
00161 }
00162 return vtktransform;
00163 }
00164
00165 int QmitkVersorTransformView::GetNumberOfTransformParameters()
00166 {
00167 if (m_FixedImage.IsNotNull())
00168 {
00169 if (m_FixedImage->GetDimension() == 2)
00170 return 0;
00171 else
00172 return 3;
00173 }
00174 else
00175 return 0;
00176 }