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 "QmitkFixedCenterOfRotationAffineTransformView.h"
00019 #include "mitkImageAccessByItk.h"
00020 #include <itkFixedCenterOfRotationAffineTransform.h>
00021 #include <itkCenteredTransformInitializer.h>
00022 #include <QValidator>
00023
00024 QmitkFixedCenterOfRotationAffineTransformView::QmitkFixedCenterOfRotationAffineTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f),
00025 m_CenterX(0), m_CenterY(0), m_CenterZ(0)
00026 {
00027 }
00028
00029 QmitkFixedCenterOfRotationAffineTransformView::~QmitkFixedCenterOfRotationAffineTransformView()
00030 {
00031 }
00032
00033 itk::Object::Pointer QmitkFixedCenterOfRotationAffineTransformView::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 QmitkFixedCenterOfRotationAffineTransformView::GetTransform2(itk::Image<TPixelType, VImageDimension>* )
00045 {
00046 typedef typename itk::Image< TPixelType, VImageDimension > FixedImageType;
00047 typedef typename itk::Image< TPixelType, VImageDimension > MovingImageType;
00048 typename FixedImageType::Pointer fixedImage;
00049 mitk::CastToItkImage(m_FixedImage, fixedImage);
00050 typename MovingImageType::Pointer movingImage;
00051 mitk::CastToItkImage(m_MovingImage, movingImage);
00052 typedef typename itk::FixedCenterOfRotationAffineTransform< double, VImageDimension > CenteredAffineTransformType;
00053 typename itk::FixedCenterOfRotationAffineTransform< double, VImageDimension>::Pointer transformPointer = itk::FixedCenterOfRotationAffineTransform< double, VImageDimension>::New();
00054 transformPointer->SetIdentity();
00055 if (m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->isChecked())
00056 {
00057 typedef typename itk::FixedCenterOfRotationAffineTransform< double, VImageDimension > FixedCenterOfRotationAffineTransformType;
00058 typedef typename itk::CenteredTransformInitializer<FixedCenterOfRotationAffineTransformType, FixedImageType, MovingImageType> TransformInitializerType;
00059 typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New();
00060 transformInitializer->SetFixedImage( fixedImage );
00061 transformInitializer->SetMovingImage( movingImage );
00062 transformInitializer->SetTransform( transformPointer );
00063 if (m_Controls.m_MomentsFixedCenterOfRotationAffine->isChecked())
00064 {
00065 transformInitializer->MomentsOn();
00066 }
00067 else
00068 {
00069 transformInitializer->GeometryOn();
00070 }
00071 m_CenterX = transformPointer->GetCenter()[0];
00072 m_CenterY = transformPointer->GetCenter()[1];
00073 m_CenterZ = transformPointer->GetCenter()[2];
00074 transformInitializer->InitializeTransform();
00075 }
00076 m_TransformObject = transformPointer.GetPointer();
00077 return transformPointer.GetPointer();
00078 }
00079
00080 itk::Array<double> QmitkFixedCenterOfRotationAffineTransformView::GetTransformParameters()
00081 {
00082 itk::Array<double> transformValues;
00083 transformValues.SetSize(15);
00084 transformValues.fill(0);
00085 transformValues[0] = m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->isChecked();
00086 transformValues[1] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->text().toDouble();
00087 transformValues[2] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->text().toDouble();
00088 transformValues[3] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->text().toDouble();
00089 transformValues[4] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->text().toDouble();
00090 transformValues[5] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->text().toDouble();
00091 transformValues[6] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->text().toDouble();
00092 transformValues[7] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->text().toDouble();
00093 transformValues[8] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->text().toDouble();
00094 transformValues[9] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->text().toDouble();
00095 transformValues[10] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->text().toDouble();
00096 transformValues[11] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->text().toDouble();
00097 transformValues[12] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->text().toDouble();
00098 transformValues[13] = m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->isChecked();
00099 transformValues[14] = m_Controls.m_MomentsFixedCenterOfRotationAffine->isChecked();
00100 return transformValues;
00101 }
00102
00103 void QmitkFixedCenterOfRotationAffineTransformView::SetTransformParameters(itk::Array<double> transformValues)
00104 {
00105 m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->setChecked(transformValues[0]);
00106 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->setText(QString::number(transformValues[1]));
00107 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->setText(QString::number(transformValues[2]));
00108 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->setText(QString::number(transformValues[3]));
00109 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->setText(QString::number(transformValues[4]));
00110 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->setText(QString::number(transformValues[5]));
00111 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->setText(QString::number(transformValues[6]));
00112 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->setText(QString::number(transformValues[7]));
00113 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->setText(QString::number(transformValues[8]));
00114 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->setText(QString::number(transformValues[9]));
00115 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->setText(QString::number(transformValues[10]));
00116 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->setText(QString::number(transformValues[11]));
00117 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->setText(QString::number(transformValues[12]));
00118 m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->setChecked(transformValues[13]);
00119 m_Controls.m_MomentsFixedCenterOfRotationAffine->setChecked(transformValues[14]);
00120 m_Controls.m_GeometryFixedCenterOfRotationAffine->setChecked(!transformValues[14]);
00121 }
00122
00123 QString QmitkFixedCenterOfRotationAffineTransformView::GetName()
00124 {
00125 return "FixedCenterOfRotationAffine";
00126 }
00127
00128 void QmitkFixedCenterOfRotationAffineTransformView::SetupUI(QWidget* parent)
00129 {
00130 m_Controls.setupUi(parent);
00131 QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this);
00132 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->setValidator(validatorLineEditInputFloat);
00133 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->setValidator(validatorLineEditInputFloat);
00134 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->setValidator(validatorLineEditInputFloat);
00135 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->setValidator(validatorLineEditInputFloat);
00136 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->setValidator(validatorLineEditInputFloat);
00137 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->setValidator(validatorLineEditInputFloat);
00138 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->setValidator(validatorLineEditInputFloat);
00139 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->setValidator(validatorLineEditInputFloat);
00140 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->setValidator(validatorLineEditInputFloat);
00141 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->setValidator(validatorLineEditInputFloat);
00142 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->setValidator(validatorLineEditInputFloat);
00143 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat);
00144 }
00145
00146 itk::Array<double> QmitkFixedCenterOfRotationAffineTransformView::GetScales()
00147 {
00148 itk::Array<double> scales;
00149 scales.SetSize(12);
00150 scales.Fill(1.0);
00151 if (m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->isChecked())
00152 {
00153 scales[0] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->text().toDouble();
00154 scales[1] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->text().toDouble();
00155 scales[2] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->text().toDouble();
00156 scales[3] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->text().toDouble();
00157 scales[4] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->text().toDouble();
00158 scales[5] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->text().toDouble();
00159 scales[6] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->text().toDouble();
00160 scales[7] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->text().toDouble();
00161 scales[8] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->text().toDouble();
00162 scales[9] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->text().toDouble();
00163 scales[10] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->text().toDouble();
00164 scales[11] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->text().toDouble();
00165 }
00166 return scales;
00167 }
00168
00169 vtkTransform* QmitkFixedCenterOfRotationAffineTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array<double> transformParams)
00170 {
00171 if (m_MovingImage.IsNotNull())
00172 {
00173 int m = 0;
00174 for (unsigned int i = 0; i < m_FixedImage->GetDimension(); i++)
00175 {
00176 for (unsigned int j = 0; j < m_FixedImage->GetDimension(); j++)
00177 {
00178 vtkmatrix->SetElement(i, j, transformParams[m]);
00179 m++;
00180 }
00181 }
00182 float center[4];
00183 float translation[4];
00184 center[0] = m_CenterX;
00185 center[1] = m_CenterY;
00186 center[2] = m_CenterZ;
00187 center[3] = 1;
00188 vtkmatrix->MultiplyPoint(center, translation);
00189 if (m_FixedImage->GetDimension() == 2)
00190 {
00191 vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]);
00192 vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]);
00193 }
00194 else if (m_FixedImage->GetDimension() == 3)
00195 {
00196 vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[9]);
00197 vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[10]);
00198 vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[11]);
00199 }
00200 vtktransform->SetMatrix(vtkmatrix);
00201 }
00202 return vtktransform;
00203 }
00204
00205 int QmitkFixedCenterOfRotationAffineTransformView::GetNumberOfTransformParameters()
00206 {
00207 if (m_FixedImage.IsNotNull())
00208 {
00209 if (m_FixedImage->GetDimension() == 2)
00210 {
00211 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->hide();
00212 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->hide();
00213 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->hide();
00214 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->hide();
00215 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->hide();
00216 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->hide();
00217 m_Controls.textLabel2_7_2_2->setText("Translation Scale X:");
00218 m_Controls.textLabel3_6_2_2->setText("Translation Scale Y:");
00219 m_Controls.textLabel4_4_3_2->hide();
00220 m_Controls.textLabel5_4_2_2->hide();
00221 m_Controls.textLabel6_4_2_2->hide();
00222 m_Controls.textLabel11_3_2_2->hide();
00223 m_Controls.textLabel12_3_2_2->hide();
00224 m_Controls.textLabel13_2_2_2->hide();
00225 return 6;
00226 }
00227 else
00228 {
00229 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->show();
00230 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->show();
00231 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->show();
00232 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->show();
00233 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->show();
00234 m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->show();
00235 m_Controls.textLabel2_7_2_2->setText("Scale 5:");
00236 m_Controls.textLabel3_6_2_2->setText("Scale 6:");
00237 m_Controls.textLabel4_4_3_2->show();
00238 m_Controls.textLabel5_4_2_2->show();
00239 m_Controls.textLabel6_4_2_2->show();
00240 m_Controls.textLabel11_3_2_2->show();
00241 m_Controls.textLabel12_3_2_2->show();
00242 m_Controls.textLabel13_2_2_2->show();
00243 return 12;
00244 }
00245 }
00246 else
00247 return 0;
00248 }