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 "QmitkSimilarity2DTransformView.h"
00019 #include "mitkImageAccessByItk.h"
00020 #include <itkSimilarity2DTransform.h>
00021 #include <itkCenteredTransformInitializer.h>
00022 #include <QValidator>
00023
00024 QmitkSimilarity2DTransformView::QmitkSimilarity2DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f),
00025 m_CenterX(0), m_CenterY(0), m_CenterZ(0)
00026 {
00027 }
00028
00029 QmitkSimilarity2DTransformView::~QmitkSimilarity2DTransformView()
00030 {
00031 }
00032
00033 itk::Object::Pointer QmitkSimilarity2DTransformView::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 QmitkSimilarity2DTransformView::GetTransform2(itk::Image<TPixelType, VImageDimension>* )
00045 {
00046 if (VImageDimension == 2)
00047 {
00048 typedef typename itk::Image< TPixelType, 2 > FixedImage2DType;
00049 typedef typename itk::Image< TPixelType, 2 > MovingImage2DType;
00050 typename FixedImage2DType::Pointer fixedImage2D;
00051 mitk::CastToItkImage(m_FixedImage, fixedImage2D);
00052 typename MovingImage2DType::Pointer movingImage2D;
00053 mitk::CastToItkImage(m_MovingImage, movingImage2D);
00054 typename itk::Similarity2DTransform< double >::Pointer transformPointer = itk::Similarity2DTransform< double >::New();
00055 transformPointer->SetIdentity();
00056 if (m_Controls.m_CenterForInitializerSimilarity2D->isChecked())
00057 {
00058 typedef typename itk::Similarity2DTransform< double > Similarity2DTransformType;
00059 typedef typename itk::CenteredTransformInitializer<Similarity2DTransformType, FixedImage2DType, MovingImage2DType> TransformInitializerType;
00060 typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New();
00061 transformInitializer->SetFixedImage( fixedImage2D );
00062 transformInitializer->SetMovingImage( movingImage2D );
00063 transformInitializer->SetTransform( transformPointer );
00064 if (m_Controls.m_MomentsSimilarity2D->isChecked())
00065 {
00066 transformInitializer->MomentsOn();
00067 }
00068 else
00069 {
00070 transformInitializer->GeometryOn();
00071 }
00072 transformInitializer->InitializeTransform();
00073 }
00074 transformPointer->SetScale( m_Controls.m_InitialScaleSimilarity2D->text().toFloat() );
00075 transformPointer->SetAngle( m_Controls.m_AngleSimilarity2D->text().toFloat() );
00076 m_TransformObject = transformPointer.GetPointer();
00077 return transformPointer.GetPointer();
00078 }
00079 return NULL;
00080 }
00081
00082 itk::Array<double> QmitkSimilarity2DTransformView::GetTransformParameters()
00083 {
00084 itk::Array<double> transformValues;
00085 transformValues.SetSize(9);
00086 transformValues.fill(0);
00087 transformValues[0] = m_Controls.m_UseOptimizerScalesSimilarity2D->isChecked();
00088 transformValues[1] = m_Controls.m_ScalingScaleSimilarity2D->text().toDouble();
00089 transformValues[2] = m_Controls.m_RotationScaleSimilarity2D->text().toDouble();
00090 transformValues[3] = m_Controls.m_TranslationXScaleSimilarity2D->text().toDouble();
00091 transformValues[4] = m_Controls.m_TranslationYScaleSimilarity2D->text().toDouble();
00092 transformValues[5] = m_Controls.m_InitialScaleSimilarity2D->text().toFloat();
00093 transformValues[6] = m_Controls.m_AngleSimilarity2D->text().toFloat();
00094 transformValues[7] = m_Controls.m_CenterForInitializerSimilarity2D->isChecked();
00095 transformValues[8] = m_Controls.m_MomentsSimilarity2D->isChecked();
00096 return transformValues;
00097 }
00098
00099 void QmitkSimilarity2DTransformView::SetTransformParameters(itk::Array<double> transformValues)
00100 {
00101 m_Controls.m_UseOptimizerScalesSimilarity2D->setChecked(transformValues[0]);
00102 m_Controls.m_ScalingScaleSimilarity2D->setText(QString::number(transformValues[1]));
00103 m_Controls.m_RotationScaleSimilarity2D->setText(QString::number(transformValues[2]));
00104 m_Controls.m_TranslationXScaleSimilarity2D->setText(QString::number(transformValues[3]));
00105 m_Controls.m_TranslationYScaleSimilarity2D->setText(QString::number(transformValues[4]));
00106 m_Controls.m_InitialScaleSimilarity2D->setText(QString::number(transformValues[5]));
00107 m_Controls.m_AngleSimilarity2D->setText(QString::number(transformValues[6]));
00108 m_Controls.m_CenterForInitializerSimilarity2D->setChecked(transformValues[7]);
00109 m_Controls.m_MomentsSimilarity2D->setChecked(transformValues[8]);
00110 m_Controls.m_GeometrySimilarity2D->setChecked(!transformValues[8]);
00111 }
00112
00113 QString QmitkSimilarity2DTransformView::GetName()
00114 {
00115 return "Similarity2D";
00116 }
00117
00118 void QmitkSimilarity2DTransformView::SetupUI(QWidget* parent)
00119 {
00120 m_Controls.setupUi(parent);
00121 QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this);
00122 m_Controls.m_ScalingScaleSimilarity2D->setValidator(validatorLineEditInputFloat);
00123 m_Controls.m_RotationScaleSimilarity2D->setValidator(validatorLineEditInputFloat);
00124 m_Controls.m_TranslationXScaleSimilarity2D->setValidator(validatorLineEditInputFloat);
00125 m_Controls.m_TranslationYScaleSimilarity2D->setValidator(validatorLineEditInputFloat);
00126 }
00127
00128 itk::Array<double> QmitkSimilarity2DTransformView::GetScales()
00129 {
00130 itk::Array<double> scales;
00131 scales.SetSize(4);
00132 scales.Fill(1.0);
00133 if (m_Controls.m_UseOptimizerScalesSimilarity2D->isChecked())
00134 {
00135 scales[0] = m_Controls.m_ScalingScaleSimilarity2D->text().toDouble();
00136 scales[1] = m_Controls.m_RotationScaleSimilarity2D->text().toDouble();
00137 scales[2] = m_Controls.m_TranslationXScaleSimilarity2D->text().toDouble();
00138 scales[3] = m_Controls.m_TranslationYScaleSimilarity2D->text().toDouble();
00139 }
00140 return scales;
00141 }
00142
00143 vtkTransform* QmitkSimilarity2DTransformView::Transform(vtkMatrix4x4* , vtkTransform* vtktransform, itk::Array<double> transformParams)
00144 {
00145 if (m_MovingImage.IsNotNull())
00146 {
00147 mitk::ScalarType angle = transformParams[1] * 45.0 / atan(1.0);
00148 vtktransform->PostMultiply();
00149 vtktransform->Scale(transformParams[0], transformParams[0], 1);
00150 vtktransform->RotateZ(angle);
00151 vtktransform->Translate(transformParams[2], transformParams[3], 0);
00152 vtktransform->PreMultiply();
00153 }
00154 return vtktransform;
00155 }
00156
00157 int QmitkSimilarity2DTransformView::GetNumberOfTransformParameters()
00158 {
00159 if (m_FixedImage.IsNotNull())
00160 {
00161 if (m_FixedImage->GetDimension() == 2)
00162 return 4;
00163 else
00164 return 0;
00165 }
00166 else
00167 return 0;
00168 }