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 "QmitkScaleSkewVersor3DTransformView.h"
00019 #include "mitkImageAccessByItk.h"
00020 #include <itkScaleSkewVersor3DTransform.h>
00021 #include <itkCenteredTransformInitializer.h>
00022 #include <QValidator>
00023
00024 QmitkScaleSkewVersor3DTransformView::QmitkScaleSkewVersor3DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f),
00025 m_CenterX(0), m_CenterY(0), m_CenterZ(0)
00026 {
00027 }
00028
00029 QmitkScaleSkewVersor3DTransformView::~QmitkScaleSkewVersor3DTransformView()
00030 {
00031 }
00032
00033 itk::Object::Pointer QmitkScaleSkewVersor3DTransformView::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 QmitkScaleSkewVersor3DTransformView::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::ScaleSkewVersor3DTransform< double >::Pointer transformPointer = itk::ScaleSkewVersor3DTransform< double >::New();
00055 transformPointer->SetIdentity();
00056 if (m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->isChecked())
00057 {
00058 typedef typename itk::ScaleSkewVersor3DTransform< double > ScaleSkewVersor3DTransformType;
00059 typedef typename itk::CenteredTransformInitializer<ScaleSkewVersor3DTransformType, 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_MomentsScaleSkewVersorRigid3D->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> QmitkScaleSkewVersor3DTransformView::GetTransformParameters()
00084 {
00085 itk::Array<double> transformValues;
00086 transformValues.SetSize(18);
00087 transformValues.fill(0);
00088 transformValues[0] = m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->isChecked();
00089 transformValues[1] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->text().toDouble();
00090 transformValues[2] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->text().toDouble();
00091 transformValues[3] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->text().toDouble();
00092 transformValues[4] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->text().toDouble();
00093 transformValues[5] = m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->text().toDouble();
00094 transformValues[6] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->text().toDouble();
00095 transformValues[7] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->text().toDouble();
00096 transformValues[8] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->text().toDouble();
00097 transformValues[9] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->text().toDouble();
00098 transformValues[10] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->text().toDouble();
00099 transformValues[11] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->text().toDouble();
00100 transformValues[12] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->text().toDouble();
00101 transformValues[13] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->text().toDouble();
00102 transformValues[14] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->text().toDouble();
00103 transformValues[15] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->text().toDouble();
00104 transformValues[16] = m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->isChecked();
00105 transformValues[17] = m_Controls.m_MomentsScaleSkewVersorRigid3D->isChecked();
00106 return transformValues;
00107 }
00108
00109 void QmitkScaleSkewVersor3DTransformView::SetTransformParameters(itk::Array<double> transformValues)
00110 {
00111 m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->setChecked(transformValues[0]);
00112 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->setText(QString::number(transformValues[1]));
00113 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->setText(QString::number(transformValues[2]));
00114 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->setText(QString::number(transformValues[3]));
00115 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->setText(QString::number(transformValues[4]));
00116 m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->setText(QString::number(transformValues[5]));
00117 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->setText(QString::number(transformValues[6]));
00118 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->setText(QString::number(transformValues[7]));
00119 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->setText(QString::number(transformValues[8]));
00120 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->setText(QString::number(transformValues[9]));
00121 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->setText(QString::number(transformValues[10]));
00122 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->setText(QString::number(transformValues[11]));
00123 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->setText(QString::number(transformValues[12]));
00124 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->setText(QString::number(transformValues[13]));
00125 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->setText(QString::number(transformValues[14]));
00126 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->setText(QString::number(transformValues[15]));
00127 m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->setChecked(transformValues[16]);
00128 m_Controls.m_MomentsScaleSkewVersorRigid3D->setChecked(transformValues[17]);
00129 m_Controls.m_GeometryScaleSkewVersorRigid3D->setChecked(!transformValues[17]);
00130 }
00131
00132 QString QmitkScaleSkewVersor3DTransformView::GetName()
00133 {
00134 return "ScaleSkewVersor3D";
00135 }
00136
00137 void QmitkScaleSkewVersor3DTransformView::SetupUI(QWidget* parent)
00138 {
00139 m_Controls.setupUi(parent);
00140 QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this);
00141 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->setValidator(validatorLineEditInputFloat);
00142 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->setValidator(validatorLineEditInputFloat);
00143 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->setValidator(validatorLineEditInputFloat);
00144 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat);
00145 m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat);
00146 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat);
00147 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->setValidator(validatorLineEditInputFloat);
00148 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->setValidator(validatorLineEditInputFloat);
00149 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->setValidator(validatorLineEditInputFloat);
00150 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->setValidator(validatorLineEditInputFloat);
00151 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->setValidator(validatorLineEditInputFloat);
00152 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->setValidator(validatorLineEditInputFloat);
00153 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->setValidator(validatorLineEditInputFloat);
00154 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->setValidator(validatorLineEditInputFloat);
00155 m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->setValidator(validatorLineEditInputFloat);
00156 }
00157
00158 itk::Array<double> QmitkScaleSkewVersor3DTransformView::GetScales()
00159 {
00160 itk::Array<double> scales;
00161 scales.SetSize(15);
00162 scales.Fill(1.0);
00163 if (m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->isChecked())
00164 {
00165 scales[0] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->text().toDouble();
00166 scales[1] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->text().toDouble();
00167 scales[2] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->text().toDouble();
00168 scales[3] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->text().toDouble();
00169 scales[4] = m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->text().toDouble();
00170 scales[5] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->text().toDouble();
00171 scales[6] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->text().toDouble();
00172 scales[7] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->text().toDouble();
00173 scales[8] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->text().toDouble();
00174 scales[9] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->text().toDouble();
00175 scales[10] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->text().toDouble();
00176 scales[11] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->text().toDouble();
00177 scales[12] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->text().toDouble();
00178 scales[13] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->text().toDouble();
00179 scales[14] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->text().toDouble();
00180 }
00181 return scales;
00182 }
00183
00184 vtkTransform* QmitkScaleSkewVersor3DTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array<double> transformParams)
00185 {
00186 if (m_MovingImage.IsNotNull())
00187 {
00188 itk::ScaleSkewVersor3DTransform<double>::Pointer versorTransform = itk::ScaleSkewVersor3DTransform<double>::New();
00189 versorTransform->SetParameters(transformParams);
00190 itk::Matrix<double, 3, 3> Matrix = versorTransform->GetMatrix();
00191 for (int i = 0; i < 3; i++)
00192 {
00193 for (int j = 0; j < 3; j++)
00194 {
00195 vtkmatrix->SetElement(i, j, Matrix[i][j]);
00196 }
00197 }
00198 float center[4];
00199 float translation[4];
00200 center[0] = m_CenterX;
00201 center[1] = m_CenterY;
00202 center[2] = m_CenterZ;
00203 center[3] = 1;
00204 vtkmatrix->MultiplyPoint(center, translation);
00205 vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[3]);
00206 vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[4]);
00207 vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[5]);
00208 vtktransform->SetMatrix(vtkmatrix);
00209 }
00210 return vtktransform;
00211 }
00212
00213 int QmitkScaleSkewVersor3DTransformView::GetNumberOfTransformParameters()
00214 {
00215 if (m_FixedImage.IsNotNull())
00216 {
00217 if (m_FixedImage->GetDimension() == 2)
00218 return 0;
00219 else
00220 return 15;
00221 }
00222 else
00223 return 0;
00224 }