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