diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.cpp index 9e261e2fe9..8e175cbf65 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkAffineTransformView.cpp @@ -1,258 +1,264 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkAffineTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkAffineTransformView::QmitkAffineTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkAffineTransformView::~QmitkAffineTransformView() { } mitk::TransformParameters::TransformType QmitkAffineTransformView::GetTransformType() { return mitk::TransformParameters::AFFINETRANSFORM; } itk::Object::Pointer QmitkAffineTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { AccessByItk(m_FixedImage, GetTransform2); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkAffineTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkAffineTransformView::GetTransform2(itk::Image* itkImage1) { typedef typename itk::Image< TPixelType, VImageDimension > FixedImageType; typedef typename itk::Image< TPixelType, VImageDimension > MovingImageType; - typename FixedImageType::Pointer fixedImage; - mitk::CastToItkImage(m_FixedImage, fixedImage); - typename MovingImageType::Pointer movingImage; - mitk::CastToItkImage(m_MovingImage, movingImage); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImageType::Pointer fixedImage = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImageType::Pointer movingImage = movingImageToItk->GetOutput(); + typename itk::AffineTransform< double, VImageDimension>::Pointer transformPointer = itk::AffineTransform< double, VImageDimension>::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerAffine->isChecked()) { typedef typename itk::AffineTransform< double, VImageDimension > AffineTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); transformInitializer->SetFixedImage( fixedImage ); transformInitializer->SetMovingImage( movingImage ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsAffine->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_CenterZ = transformPointer->GetCenter()[2]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } itk::Array QmitkAffineTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(15); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesAffine->isChecked(); transformValues[1] = m_Controls.m_ScalesAffineTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesAffineTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesAffineTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_ScalesAffineTransformScale4->text().toDouble(); transformValues[5] = m_Controls.m_ScalesAffineTransformScale5->text().toDouble(); transformValues[6] = m_Controls.m_ScalesAffineTransformScale6->text().toDouble(); transformValues[7] = m_Controls.m_ScalesAffineTransformScale7->text().toDouble(); transformValues[8] = m_Controls.m_ScalesAffineTransformScale8->text().toDouble(); transformValues[9] = m_Controls.m_ScalesAffineTransformScale9->text().toDouble(); transformValues[10] = m_Controls.m_ScalesAffineTransformScaleTranslationX->text().toDouble(); transformValues[11] = m_Controls.m_ScalesAffineTransformScaleTranslationY->text().toDouble(); transformValues[12] = m_Controls.m_ScalesAffineTransformScaleTranslationZ->text().toDouble(); transformValues[13] = m_Controls.m_CenterForInitializerAffine->isChecked(); transformValues[14] = m_Controls.m_MomentsAffine->isChecked(); return transformValues; } void QmitkAffineTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesAffine->setChecked(transformValues[0]); m_Controls.m_ScalesAffineTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesAffineTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesAffineTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_ScalesAffineTransformScale4->setText(QString::number(transformValues[4])); m_Controls.m_ScalesAffineTransformScale5->setText(QString::number(transformValues[5])); m_Controls.m_ScalesAffineTransformScale6->setText(QString::number(transformValues[6])); m_Controls.m_ScalesAffineTransformScale7->setText(QString::number(transformValues[7])); m_Controls.m_ScalesAffineTransformScale8->setText(QString::number(transformValues[8])); m_Controls.m_ScalesAffineTransformScale9->setText(QString::number(transformValues[9])); m_Controls.m_ScalesAffineTransformScaleTranslationX->setText(QString::number(transformValues[10])); m_Controls.m_ScalesAffineTransformScaleTranslationY->setText(QString::number(transformValues[11])); m_Controls.m_ScalesAffineTransformScaleTranslationZ->setText(QString::number(transformValues[12])); m_Controls.m_CenterForInitializerAffine->setChecked(transformValues[13]); m_Controls.m_MomentsAffine->setChecked(transformValues[14]); m_Controls.m_GeometryAffine->setChecked(!transformValues[14]); } QString QmitkAffineTransformView::GetName() { return "Affine"; } void QmitkAffineTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesAffineTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale3->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale4->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale5->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale6->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale7->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale8->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScale9->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesAffineTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); } itk::Array QmitkAffineTransformView::GetScales() { itk::Array scales; scales.SetSize(12); scales.Fill(1.0); scales[0] = m_Controls.m_ScalesAffineTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesAffineTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesAffineTransformScale3->text().toDouble(); scales[3] = m_Controls.m_ScalesAffineTransformScale4->text().toDouble(); scales[4] = m_Controls.m_ScalesAffineTransformScale5->text().toDouble(); scales[5] = m_Controls.m_ScalesAffineTransformScale6->text().toDouble(); scales[6] = m_Controls.m_ScalesAffineTransformScale7->text().toDouble(); scales[7] = m_Controls.m_ScalesAffineTransformScale8->text().toDouble(); scales[8] = m_Controls.m_ScalesAffineTransformScale9->text().toDouble(); scales[9] = m_Controls.m_ScalesAffineTransformScaleTranslationX->text().toDouble(); scales[10] = m_Controls.m_ScalesAffineTransformScaleTranslationY->text().toDouble(); scales[11] = m_Controls.m_ScalesAffineTransformScaleTranslationZ->text().toDouble(); return scales; } vtkTransform* QmitkAffineTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { // - the 9 rotation-coefficients are copied // directly to the top left part of the matrix int m = 0; for (unsigned int i = 0; i < m_FixedImage->GetDimension(); i++) { for (unsigned int j = 0; j < m_FixedImage->GetDimension(); j++) { vtkmatrix->SetElement(i, j, transformParams[m]); m++; } } // - the 3 translation-coefficients are corrected to take // into account the center of the transformation float center[4]; center[0] = m_CenterX; center[1] = m_CenterY; center[2] = m_CenterZ; center[3] = 1; std::cout<< "rotation center: " << center[0] << " " << center[1] << " " << center [2] << std::endl; float translation[4]; vtkmatrix->MultiplyPoint(center, translation); if (m_FixedImage->GetDimension() == 2) { vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); } else if (m_FixedImage->GetDimension() == 3) { vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[9]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[10]); vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[11]); } // set the transform matrix to init the transform vtktransform->SetMatrix(vtkmatrix); } return vtktransform; } int QmitkAffineTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) { m_Controls.m_ScalesAffineTransformScale7->hide(); m_Controls.m_ScalesAffineTransformScale8->hide(); m_Controls.m_ScalesAffineTransformScale9->hide(); m_Controls.m_ScalesAffineTransformScaleTranslationX->hide(); m_Controls.m_ScalesAffineTransformScaleTranslationY->hide(); m_Controls.m_ScalesAffineTransformScaleTranslationZ->hide(); m_Controls.textLabel2_7->setText("Translation Scale X:"); m_Controls.textLabel3_6->setText("Translation Scale Y:"); m_Controls.textLabel4_4->hide(); m_Controls.textLabel5_4->hide(); m_Controls.textLabel6_4->hide(); m_Controls.textLabel11_3->hide(); m_Controls.textLabel12_3->hide(); m_Controls.textLabel13_2->hide(); return 6; } else { m_Controls.m_ScalesAffineTransformScale7->show(); m_Controls.m_ScalesAffineTransformScale8->show(); m_Controls.m_ScalesAffineTransformScale9->show(); m_Controls.m_ScalesAffineTransformScaleTranslationX->show(); m_Controls.m_ScalesAffineTransformScaleTranslationY->show(); m_Controls.m_ScalesAffineTransformScaleTranslationZ->show(); m_Controls.textLabel2_7->setText("Scale 5:"); m_Controls.textLabel3_6->setText("Scale 6:"); m_Controls.textLabel4_4->show(); m_Controls.textLabel5_4->show(); m_Controls.textLabel6_4->show(); m_Controls.textLabel11_3->show(); m_Controls.textLabel12_3->show(); m_Controls.textLabel13_2->show(); return 12; } } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp index f3b844d2ed..1789631ecf 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredRigid2DTransformView.cpp @@ -1,178 +1,185 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkCenteredRigid2DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkCenteredRigid2DTransformView::QmitkCenteredRigid2DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkCenteredRigid2DTransformView::~QmitkCenteredRigid2DTransformView() { } mitk::TransformParameters::TransformType QmitkCenteredRigid2DTransformView::GetTransformType() { return mitk::TransformParameters::CENTEREDRIGID2DTRANSFORM; } itk::Object::Pointer QmitkCenteredRigid2DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkCenteredRigid2DTransformView::GetTransform2(itk::Image* /* itkImage1 */) +itk::Object::Pointer QmitkCenteredRigid2DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 2) { typedef typename itk::Image< TPixelType, 2 > FixedImage2DType; typedef typename itk::Image< TPixelType, 2 > MovingImage2DType; - typename FixedImage2DType::Pointer fixedImage2D; - mitk::CastToItkImage(m_FixedImage, fixedImage2D); - typename MovingImage2DType::Pointer movingImage2D; - mitk::CastToItkImage(m_MovingImage, movingImage2D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage2DType::Pointer fixedImage2D = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = + mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); + typename itk::CenteredRigid2DTransform< double >::Pointer transformPointer = itk::CenteredRigid2DTransform< double >::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerCenteredRigid2D->isChecked()) { typedef typename itk::CenteredRigid2DTransform< double > CenteredRigid2DTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); transformInitializer->SetFixedImage( fixedImage2D ); transformInitializer->SetMovingImage( movingImage2D ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsCenteredRigid2D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } transformPointer->SetAngle( m_Controls.m_AngleCenteredRigid2D->text().toFloat() ); m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkCenteredRigid2DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(9); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesCenteredRigid2D->isChecked(); transformValues[1] = m_Controls.m_RotationScaleCenteredRigid2D->text().toDouble(); transformValues[2] = m_Controls.m_CenterXScaleCenteredRigid2D->text().toDouble(); transformValues[3] = m_Controls.m_CenterYScaleCenteredRigid2D->text().toDouble(); transformValues[4] = m_Controls.m_TranslationXScaleCenteredRigid2D->text().toDouble(); transformValues[5] = m_Controls.m_TranslationYScaleCenteredRigid2D->text().toDouble(); transformValues[6] = m_Controls.m_AngleCenteredRigid2D->text().toFloat(); transformValues[7] = m_Controls.m_CenterForInitializerCenteredRigid2D->isChecked(); transformValues[8] = m_Controls.m_MomentsCenteredRigid2D->isChecked(); return transformValues; } void QmitkCenteredRigid2DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesCenteredRigid2D->setChecked(transformValues[0]); m_Controls.m_RotationScaleCenteredRigid2D->setText(QString::number(transformValues[1])); m_Controls.m_CenterXScaleCenteredRigid2D->setText(QString::number(transformValues[2])); m_Controls.m_CenterYScaleCenteredRigid2D->setText(QString::number(transformValues[3])); m_Controls.m_TranslationXScaleCenteredRigid2D->setText(QString::number(transformValues[4])); m_Controls.m_TranslationYScaleCenteredRigid2D->setText(QString::number(transformValues[5])); m_Controls.m_AngleCenteredRigid2D->setText(QString::number(transformValues[6])); m_Controls.m_CenterForInitializerCenteredRigid2D->setChecked(transformValues[7]); m_Controls.m_MomentsCenteredRigid2D->setChecked(transformValues[8]); m_Controls.m_GeometryCenteredRigid2D->setChecked(!transformValues[8]); } QString QmitkCenteredRigid2DTransformView::GetName() { return "CenteredRigid2D"; } void QmitkCenteredRigid2DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_AngleCenteredRigid2D->setValidator(validatorLineEditInputFloat); m_Controls.m_RotationScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); m_Controls.m_CenterXScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); m_Controls.m_CenterYScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); m_Controls.m_TranslationXScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); m_Controls.m_TranslationYScaleCenteredRigid2D->setValidator(validatorLineEditInputFloat); } itk::Array QmitkCenteredRigid2DTransformView::GetScales() { itk::Array scales; scales.SetSize(5); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesCenteredRigid2D->isChecked()) { scales[0] = m_Controls.m_RotationScaleCenteredRigid2D->text().toDouble(); scales[1] = m_Controls.m_CenterXScaleCenteredRigid2D->text().toDouble(); scales[2] = m_Controls.m_CenterYScaleCenteredRigid2D->text().toDouble(); scales[3] = m_Controls.m_TranslationXScaleCenteredRigid2D->text().toDouble(); scales[4] = m_Controls.m_TranslationYScaleCenteredRigid2D->text().toDouble(); } return scales; } vtkTransform* QmitkCenteredRigid2DTransformView::Transform(vtkMatrix4x4* /* vtkmatrix */, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { mitk::ScalarType angle = transformParams[0] * 45.0 / atan(1.0);; vtktransform->PostMultiply(); vtktransform->Translate(-transformParams[1], -transformParams[2], 0); vtktransform->RotateZ(angle); vtktransform->Translate(transformParams[1], transformParams[2], 0); vtktransform->Translate(transformParams[3], transformParams[4], 0); vtktransform->PreMultiply(); } return vtktransform; } int QmitkCenteredRigid2DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 5; else return 0; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp index fe248a4aaf..4d052e4ad9 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkCenteredSimilarity2DTransformView.cpp @@ -1,186 +1,192 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkCenteredSimilarity2DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkCenteredSimilarity2DTransformView::QmitkCenteredSimilarity2DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkCenteredSimilarity2DTransformView::~QmitkCenteredSimilarity2DTransformView() { } mitk::TransformParameters::TransformType QmitkCenteredSimilarity2DTransformView::GetTransformType() { return mitk::TransformParameters::CENTEREDSIMILARITY2DTRANSFORM; } itk::Object::Pointer QmitkCenteredSimilarity2DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkCenteredSimilarity2DTransformView::GetTransform2(itk::Image* /* itkImage1 */) +itk::Object::Pointer QmitkCenteredSimilarity2DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 2) { typedef typename itk::Image< TPixelType, 2 > FixedImage2DType; typedef typename itk::Image< TPixelType, 2 > MovingImage2DType; - typename FixedImage2DType::Pointer fixedImage2D; - mitk::CastToItkImage(m_FixedImage, fixedImage2D); - typename MovingImage2DType::Pointer movingImage2D; - mitk::CastToItkImage(m_MovingImage, movingImage2D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage2DType::Pointer fixedImage2D = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = + mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); typename itk::CenteredSimilarity2DTransform< double >::Pointer transformPointer = itk::CenteredSimilarity2DTransform< double >::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerCenteredSimilarity2D->isChecked()) { typedef typename itk::CenteredSimilarity2DTransform< double > CenteredSimilarity2DTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); transformInitializer->SetFixedImage( fixedImage2D ); transformInitializer->SetMovingImage( movingImage2D ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsCenteredSimilarity2D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } transformPointer->SetScale( m_Controls.m_InitialScaleCenteredSimilarity2D->text().toFloat() ); transformPointer->SetAngle( m_Controls.m_AngleCenteredSimilarity2D->text().toFloat() ); m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkCenteredSimilarity2DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(11); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesCenteredSimilarity2D->isChecked(); transformValues[1] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->text().toDouble(); transformValues[5] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->text().toDouble(); transformValues[6] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->text().toDouble(); transformValues[7] = m_Controls.m_InitialScaleCenteredSimilarity2D->text().toFloat(); transformValues[8] = m_Controls.m_AngleCenteredSimilarity2D->text().toFloat(); transformValues[9] = m_Controls.m_CenterForInitializerCenteredSimilarity2D->isChecked(); transformValues[10] = m_Controls.m_MomentsCenteredSimilarity2D->isChecked(); return transformValues; } void QmitkCenteredSimilarity2DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesCenteredSimilarity2D->setChecked(transformValues[0]); m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->setText(QString::number(transformValues[4])); m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->setText(QString::number(transformValues[5])); m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->setText(QString::number(transformValues[6])); m_Controls.m_InitialScaleCenteredSimilarity2D->setText(QString::number(transformValues[7])); m_Controls.m_AngleCenteredSimilarity2D->setText(QString::number(transformValues[8])); m_Controls.m_CenterForInitializerCenteredSimilarity2D->setChecked(transformValues[9]); m_Controls.m_MomentsCenteredSimilarity2D->setChecked(transformValues[10]); m_Controls.m_GeometryCenteredSimilarity2D->setChecked(!transformValues[10]); } QString QmitkCenteredSimilarity2DTransformView::GetName() { return "CenteredSimilarity2D"; } void QmitkCenteredSimilarity2DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); } itk::Array QmitkCenteredSimilarity2DTransformView::GetScales() { itk::Array scales; scales.SetSize(6); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesCenteredSimilarity2D->isChecked()) { scales[0] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale3->text().toDouble(); scales[3] = m_Controls.m_ScalesCenteredSimilarity2DTransformScale4->text().toDouble(); scales[4] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationX->text().toDouble(); scales[5] = m_Controls.m_ScalesCenteredSimilarity2DTransformScaleTranslationY->text().toDouble(); } return scales; } vtkTransform* QmitkCenteredSimilarity2DTransformView::Transform(vtkMatrix4x4* /*vtkmatrix*/, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { mitk::ScalarType angle = transformParams[1] * 45.0 / atan(1.0); vtktransform->PostMultiply(); vtktransform->Translate(-transformParams[2], -transformParams[3], 0); vtktransform->Scale(transformParams[0], transformParams[0], 1); vtktransform->RotateZ(angle); vtktransform->Translate(transformParams[2], transformParams[3], 0); vtktransform->Translate(transformParams[4], transformParams[5], 0); vtktransform->PreMultiply(); } return vtktransform; } int QmitkCenteredSimilarity2DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 6; else return 0; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp index 9b89d7c7a8..aaa6a8f174 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkEuler2DTransformView.cpp @@ -1,162 +1,169 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkEuler2DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkEuler2DTransformView::QmitkEuler2DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkEuler2DTransformView::~QmitkEuler2DTransformView() { } mitk::TransformParameters::TransformType QmitkEuler2DTransformView::GetTransformType() { return mitk::TransformParameters::EULER2DTRANSFORM; } itk::Object::Pointer QmitkEuler2DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkEuler2DTransformView::GetTransform2(itk::Image* /* itkImage1 */) +itk::Object::Pointer QmitkEuler2DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 2) { typedef typename itk::Image< TPixelType, 2 > FixedImage2DType; typedef typename itk::Image< TPixelType, 2 > MovingImage2DType; - typename FixedImage2DType::Pointer fixedImage2D; - mitk::CastToItkImage(m_FixedImage, fixedImage2D); - typename MovingImage2DType::Pointer movingImage2D; - mitk::CastToItkImage(m_MovingImage, movingImage2D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage2DType::Pointer fixedImage2D = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = + mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); + typename itk::Euler2DTransform< double >::Pointer transformPointer = itk::Euler2DTransform< double >::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerEuler2D->isChecked()) { typedef typename itk::Euler2DTransform< double > Euler2DTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); transformInitializer->SetFixedImage( fixedImage2D ); transformInitializer->SetMovingImage( movingImage2D ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsEuler2D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkEuler2DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(6); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesEuler2D->isChecked(); transformValues[1] = m_Controls.m_RotationScaleEuler2D->text().toDouble(); transformValues[2] = m_Controls.m_TranslationXScaleEuler2D->text().toDouble(); transformValues[3] = m_Controls.m_TranslationYScaleEuler2D->text().toDouble(); transformValues[4] = m_Controls.m_CenterForInitializerEuler2D->isChecked(); transformValues[5] = m_Controls.m_MomentsEuler2D->isChecked(); return transformValues; } void QmitkEuler2DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesEuler2D->setChecked(transformValues[0]); m_Controls.m_RotationScaleEuler2D->setText(QString::number(transformValues[1])); m_Controls.m_TranslationXScaleEuler2D->setText(QString::number(transformValues[2])); m_Controls.m_TranslationYScaleEuler2D->setText(QString::number(transformValues[3])); m_Controls.m_CenterForInitializerEuler2D->setChecked(transformValues[4]); m_Controls.m_MomentsEuler2D->setChecked(transformValues[5]); m_Controls.m_GeometryEuler2D->setChecked(!transformValues[5]); } QString QmitkEuler2DTransformView::GetName() { return "Euler2D"; } void QmitkEuler2DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_RotationScaleEuler2D->setValidator(validatorLineEditInputFloat); m_Controls.m_TranslationXScaleEuler2D->setValidator(validatorLineEditInputFloat); m_Controls.m_TranslationYScaleEuler2D->setValidator(validatorLineEditInputFloat); } itk::Array QmitkEuler2DTransformView::GetScales() { itk::Array scales; scales.SetSize(3); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesEuler2D->isChecked()) { scales[0] = m_Controls.m_RotationScaleEuler2D->text().toDouble(); scales[1] = m_Controls.m_TranslationXScaleEuler2D->text().toDouble(); scales[2] = m_Controls.m_TranslationYScaleEuler2D->text().toDouble(); } return scales; } vtkTransform* QmitkEuler2DTransformView::Transform(vtkMatrix4x4* /*vtkmatrix*/, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { mitk::ScalarType angle = transformParams[0] * 45.0 / atan(1.0); vtktransform->PostMultiply(); vtktransform->RotateZ(angle); vtktransform->Translate(transformParams[1], transformParams[2], 0); vtktransform->PreMultiply(); } return vtktransform; } int QmitkEuler2DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 3; else return 0; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp index 966081f3c3..82f63f32fd 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkFixedCenterOfRotationAffineTransformView.cpp @@ -1,253 +1,259 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkFixedCenterOfRotationAffineTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkFixedCenterOfRotationAffineTransformView::QmitkFixedCenterOfRotationAffineTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkFixedCenterOfRotationAffineTransformView::~QmitkFixedCenterOfRotationAffineTransformView() { } mitk::TransformParameters::TransformType QmitkFixedCenterOfRotationAffineTransformView::GetTransformType() { return mitk::TransformParameters::FIXEDCENTEROFROTATIONAFFINETRANSFORM; } itk::Object::Pointer QmitkFixedCenterOfRotationAffineTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { AccessByItk(m_FixedImage, GetTransform2); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkFixedCenterOfRotationAffineTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkFixedCenterOfRotationAffineTransformView::GetTransform2(itk::Image* itkImage1) { typedef typename itk::Image< TPixelType, VImageDimension > FixedImageType; typedef typename itk::Image< TPixelType, VImageDimension > MovingImageType; - typename FixedImageType::Pointer fixedImage; - mitk::CastToItkImage(m_FixedImage, fixedImage); - typename MovingImageType::Pointer movingImage; - mitk::CastToItkImage(m_MovingImage, movingImage); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImageType::Pointer fixedImage = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImageType::Pointer movingImage = movingImageToItk->GetOutput(); + typedef typename itk::FixedCenterOfRotationAffineTransform< double, VImageDimension > CenteredAffineTransformType; typename itk::FixedCenterOfRotationAffineTransform< double, VImageDimension>::Pointer transformPointer = itk::FixedCenterOfRotationAffineTransform< double, VImageDimension>::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->isChecked()) { typedef typename itk::FixedCenterOfRotationAffineTransform< double, VImageDimension > FixedCenterOfRotationAffineTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); transformInitializer->SetFixedImage( fixedImage ); transformInitializer->SetMovingImage( movingImage ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsFixedCenterOfRotationAffine->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_CenterZ = transformPointer->GetCenter()[2]; transformInitializer->InitializeTransform(); } m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } itk::Array QmitkFixedCenterOfRotationAffineTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(15); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->isChecked(); transformValues[1] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->text().toDouble(); transformValues[5] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->text().toDouble(); transformValues[6] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->text().toDouble(); transformValues[7] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->text().toDouble(); transformValues[8] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->text().toDouble(); transformValues[9] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->text().toDouble(); transformValues[10] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->text().toDouble(); transformValues[11] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->text().toDouble(); transformValues[12] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->text().toDouble(); transformValues[13] = m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->isChecked(); transformValues[14] = m_Controls.m_MomentsFixedCenterOfRotationAffine->isChecked(); return transformValues; } void QmitkFixedCenterOfRotationAffineTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->setChecked(transformValues[0]); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->setText(QString::number(transformValues[4])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->setText(QString::number(transformValues[5])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->setText(QString::number(transformValues[6])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->setText(QString::number(transformValues[7])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->setText(QString::number(transformValues[8])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->setText(QString::number(transformValues[9])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->setText(QString::number(transformValues[10])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->setText(QString::number(transformValues[11])); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->setText(QString::number(transformValues[12])); m_Controls.m_CenterForInitializerFixedCenterOfRotationAffine->setChecked(transformValues[13]); m_Controls.m_MomentsFixedCenterOfRotationAffine->setChecked(transformValues[14]); m_Controls.m_GeometryFixedCenterOfRotationAffine->setChecked(!transformValues[14]); } QString QmitkFixedCenterOfRotationAffineTransformView::GetName() { return "FixedCenterOfRotationAffine"; } void QmitkFixedCenterOfRotationAffineTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); } itk::Array QmitkFixedCenterOfRotationAffineTransformView::GetScales() { itk::Array scales; scales.SetSize(12); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesFixedCenterOfRotationAffine->isChecked()) { scales[0] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale3->text().toDouble(); scales[3] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale4->text().toDouble(); scales[4] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale5->text().toDouble(); scales[5] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale6->text().toDouble(); scales[6] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->text().toDouble(); scales[7] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->text().toDouble(); scales[8] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->text().toDouble(); scales[9] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->text().toDouble(); scales[10] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->text().toDouble(); scales[11] = m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->text().toDouble(); } return scales; } vtkTransform* QmitkFixedCenterOfRotationAffineTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { int m = 0; for (unsigned int i = 0; i < m_FixedImage->GetDimension(); i++) { for (unsigned int j = 0; j < m_FixedImage->GetDimension(); j++) { vtkmatrix->SetElement(i, j, transformParams[m]); m++; } } float center[4]; float translation[4]; center[0] = m_CenterX; center[1] = m_CenterY; center[2] = m_CenterZ; center[3] = 1; vtkmatrix->MultiplyPoint(center, translation); if (m_FixedImage->GetDimension() == 2) { vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); } else if (m_FixedImage->GetDimension() == 3) { vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[9]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[10]); vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[11]); } vtktransform->SetMatrix(vtkmatrix); } return vtktransform; } int QmitkFixedCenterOfRotationAffineTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) { m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->hide(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->hide(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->hide(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->hide(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->hide(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->hide(); m_Controls.textLabel2_7_2_2->setText("Translation Scale X:"); m_Controls.textLabel3_6_2_2->setText("Translation Scale Y:"); m_Controls.textLabel4_4_3_2->hide(); m_Controls.textLabel5_4_2_2->hide(); m_Controls.textLabel6_4_2_2->hide(); m_Controls.textLabel11_3_2_2->hide(); m_Controls.textLabel12_3_2_2->hide(); m_Controls.textLabel13_2_2_2->hide(); return 6; } else { m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale7->show(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale8->show(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScale9->show(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationX->show(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationY->show(); m_Controls.m_ScalesFixedCenterOfRotationAffineTransformScaleTranslationZ->show(); m_Controls.textLabel2_7_2_2->setText("Scale 5:"); m_Controls.textLabel3_6_2_2->setText("Scale 6:"); m_Controls.textLabel4_4_3_2->show(); m_Controls.textLabel5_4_2_2->show(); m_Controls.textLabel6_4_2_2->show(); m_Controls.textLabel11_3_2_2->show(); m_Controls.textLabel12_3_2_2->show(); m_Controls.textLabel13_2_2_2->show(); return 12; } } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp index 89b956eb19..3f559a5724 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkQuaternionRigidTransformView.cpp @@ -1,197 +1,203 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkQuaternionRigidTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkQuaternionRigidTransformView::QmitkQuaternionRigidTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkQuaternionRigidTransformView::~QmitkQuaternionRigidTransformView() { } mitk::TransformParameters::TransformType QmitkQuaternionRigidTransformView::GetTransformType() { return mitk::TransformParameters::QUATERNIONRIGIDTRANSFORM; } itk::Object::Pointer QmitkQuaternionRigidTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkQuaternionRigidTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkQuaternionRigidTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 3) { - typedef typename itk::Image< TPixelType, 3 > FixedImage3DType; - typedef typename itk::Image< TPixelType, 3 > MovingImage3DType; - typename FixedImage3DType::Pointer fixedImage3D; - mitk::CastToItkImage(m_FixedImage, fixedImage3D); - typename MovingImage3DType::Pointer movingImage3D; - mitk::CastToItkImage(m_MovingImage, movingImage3D); + typedef typename itk::Image< TPixelType, 3 > FixedImageType; + typedef typename itk::Image< TPixelType, 3 > MovingImageType; + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImageType::Pointer fixedImage = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImageType::Pointer movingImage = movingImageToItk->GetOutput(); + typename itk::QuaternionRigidTransform< double >::Pointer transformPointer = itk::QuaternionRigidTransform< double >::New(); transformPointer->SetIdentity(); typedef typename itk::QuaternionRigidTransform< double > QuaternionRigidTransformType; if (m_Controls.m_CenterForInitializerQuaternionRigid->isChecked()) { - typedef typename itk::CenteredTransformInitializer TransformInitializerType; + typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage( fixedImage3D ); - transformInitializer->SetMovingImage( movingImage3D ); + transformInitializer->SetFixedImage( fixedImage ); + transformInitializer->SetMovingImage( movingImage ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsQuaternionRigid->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_CenterZ = transformPointer->GetCenter()[2]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkQuaternionRigidTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(10); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesQuaternionRigid->isChecked(); transformValues[1] = m_Controls.m_ScalesQuaternionRigidTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesQuaternionRigidTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesQuaternionRigidTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_ScalesQuaternionRigidTransformScale4->text().toDouble(); transformValues[5] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->text().toDouble(); transformValues[6] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->text().toDouble(); transformValues[7] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->text().toDouble(); transformValues[8] = m_Controls.m_CenterForInitializerQuaternionRigid->isChecked(); transformValues[9] = m_Controls.m_MomentsQuaternionRigid->isChecked(); return transformValues; } void QmitkQuaternionRigidTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesQuaternionRigid->setChecked(transformValues[0]); m_Controls.m_ScalesQuaternionRigidTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesQuaternionRigidTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesQuaternionRigidTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_ScalesQuaternionRigidTransformScale4->setText(QString::number(transformValues[4])); m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->setText(QString::number(transformValues[5])); m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->setText(QString::number(transformValues[6])); m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->setText(QString::number(transformValues[7])); m_Controls.m_CenterForInitializerQuaternionRigid->setChecked(transformValues[8]); m_Controls.m_MomentsQuaternionRigid->setChecked(transformValues[9]); m_Controls.m_GeometryQuaternionRigid->setChecked(!transformValues[9]); } QString QmitkQuaternionRigidTransformView::GetName() { return "QuaternionRigid"; } void QmitkQuaternionRigidTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesQuaternionRigidTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesQuaternionRigidTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesQuaternionRigidTransformScale3->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesQuaternionRigidTransformScale4->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); } itk::Array QmitkQuaternionRigidTransformView::GetScales() { itk::Array scales; scales.SetSize(7); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesQuaternionRigid->isChecked()) { scales[0] = m_Controls.m_ScalesQuaternionRigidTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesQuaternionRigidTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesQuaternionRigidTransformScale3->text().toDouble(); scales[3] = m_Controls.m_ScalesQuaternionRigidTransformScale4->text().toDouble(); scales[4] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationX->text().toDouble(); scales[5] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationY->text().toDouble(); scales[6] = m_Controls.m_ScalesQuaternionRigidTransformScaleTranslationZ->text().toDouble(); } return scales; } vtkTransform* QmitkQuaternionRigidTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { itk::QuaternionRigidTransform::Pointer quaternionTransform = itk::QuaternionRigidTransform::New(); quaternionTransform->SetParameters(transformParams); itk::Matrix Matrix = quaternionTransform->GetMatrix(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { vtkmatrix->SetElement(i, j, Matrix[i][j]); } } float center[4]; float translation[4]; center[0] = m_CenterX; center[1] = m_CenterY; center[2] = m_CenterZ; center[3] = 1; vtkmatrix->MultiplyPoint(center, translation); vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[6]); vtktransform->SetMatrix(vtkmatrix); } return vtktransform; } int QmitkQuaternionRigidTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 0; else return 7; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp index df5eaf94f5..a2500abc83 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkRigid2DTransformView.cpp @@ -1,162 +1,169 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkRigid2DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkRigid2DTransformView::QmitkRigid2DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkRigid2DTransformView::~QmitkRigid2DTransformView() { } mitk::TransformParameters::TransformType QmitkRigid2DTransformView::GetTransformType() { return mitk::TransformParameters::RIGID2DTRANSFORM; } itk::Object::Pointer QmitkRigid2DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkRigid2DTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkRigid2DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 2) { typedef typename itk::Image< TPixelType, 2 > FixedImage2DType; typedef typename itk::Image< TPixelType, 2 > MovingImage2DType; - typename FixedImage2DType::Pointer fixedImage2D; - mitk::CastToItkImage(m_FixedImage, fixedImage2D); - typename MovingImage2DType::Pointer movingImage2D; - mitk::CastToItkImage(m_MovingImage, movingImage2D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage2DType::Pointer fixedImage2D = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = + mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); + typename itk::Rigid2DTransform< double >::Pointer transformPointer = itk::Rigid2DTransform< double >::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerRigid2D->isChecked()) { typedef typename itk::Rigid2DTransform< double > Rigid2DTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); transformInitializer->SetFixedImage( fixedImage2D ); transformInitializer->SetMovingImage( movingImage2D ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsRigid2D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkRigid2DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(6); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesRigid2D->isChecked(); transformValues[1] = m_Controls.m_ScalesRigid2DTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesRigid2DTransformScaleTranslationX->text().toDouble(); transformValues[3] = m_Controls.m_ScalesRigid2DTransformScaleTranslationY->text().toDouble(); transformValues[4] = m_Controls.m_CenterForInitializerRigid2D->isChecked(); transformValues[5] = m_Controls.m_MomentsRigid2D->isChecked(); return transformValues; } void QmitkRigid2DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesRigid2D->setChecked(transformValues[0]); m_Controls.m_ScalesRigid2DTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesRigid2DTransformScaleTranslationX->setText(QString::number(transformValues[2])); m_Controls.m_ScalesRigid2DTransformScaleTranslationY->setText(QString::number(transformValues[3])); m_Controls.m_CenterForInitializerRigid2D->setChecked(transformValues[4]); m_Controls.m_MomentsRigid2D->setChecked(transformValues[5]); m_Controls.m_GeometryRigid2D->setChecked(!transformValues[5]); } QString QmitkRigid2DTransformView::GetName() { return "Rigid2D"; } void QmitkRigid2DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesRigid2DTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesRigid2DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesRigid2DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); } itk::Array QmitkRigid2DTransformView::GetScales() { itk::Array scales; scales.SetSize(3); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesRigid2D->isChecked()) { scales[0] = m_Controls.m_ScalesRigid2DTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesRigid2DTransformScaleTranslationX->text().toDouble(); scales[2] = m_Controls.m_ScalesRigid2DTransformScaleTranslationY->text().toDouble(); } return scales; } vtkTransform* QmitkRigid2DTransformView::Transform(vtkMatrix4x4* /*vtkmatrix*/, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { mitk::ScalarType angle = transformParams[0] * 45.0 / atan(1.0); vtktransform->PostMultiply(); vtktransform->RotateZ(angle); vtktransform->Translate(transformParams[1], transformParams[2], 0); vtktransform->PreMultiply(); } return vtktransform; } int QmitkRigid2DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 3; else return 0; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp index 0789d591bb..5c7fd29278 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkScaleSkewVersor3DTransformView.cpp @@ -1,228 +1,235 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkScaleSkewVersor3DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkScaleSkewVersor3DTransformView::QmitkScaleSkewVersor3DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkScaleSkewVersor3DTransformView::~QmitkScaleSkewVersor3DTransformView() { } mitk::TransformParameters::TransformType QmitkScaleSkewVersor3DTransformView::GetTransformType() { return mitk::TransformParameters::SCALESKEWVERSOR3DTRANSFORM; } itk::Object::Pointer QmitkScaleSkewVersor3DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkScaleSkewVersor3DTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkScaleSkewVersor3DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 3) { - typedef typename itk::Image< TPixelType, 3 > FixedImage3DType; - typedef typename itk::Image< TPixelType, 3 > MovingImage3DType; - typename FixedImage3DType::Pointer fixedImage3D; - mitk::CastToItkImage(m_FixedImage, fixedImage3D); - typename MovingImage3DType::Pointer movingImage3D; - mitk::CastToItkImage(m_MovingImage, movingImage3D); + typedef typename itk::Image< TPixelType, 3 > FixedImageType; + typedef typename itk::Image< TPixelType, 3 > MovingImageType; + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImageType::Pointer fixedImage = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImageType::Pointer movingImage = movingImageToItk->GetOutput(); + + typename itk::ScaleSkewVersor3DTransform< double >::Pointer transformPointer = itk::ScaleSkewVersor3DTransform< double >::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->isChecked()) { typedef typename itk::ScaleSkewVersor3DTransform< double > ScaleSkewVersor3DTransformType; - typedef typename itk::CenteredTransformInitializer TransformInitializerType; + typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage( fixedImage3D ); - transformInitializer->SetMovingImage( movingImage3D ); + transformInitializer->SetFixedImage( fixedImage ); + transformInitializer->SetMovingImage( movingImage ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsScaleSkewVersorRigid3D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_CenterZ = transformPointer->GetCenter()[2]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkScaleSkewVersor3DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(18); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->isChecked(); transformValues[1] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->text().toDouble(); transformValues[5] = m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->text().toDouble(); transformValues[6] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->text().toDouble(); transformValues[7] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->text().toDouble(); transformValues[8] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->text().toDouble(); transformValues[9] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->text().toDouble(); transformValues[10] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->text().toDouble(); transformValues[11] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->text().toDouble(); transformValues[12] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->text().toDouble(); transformValues[13] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->text().toDouble(); transformValues[14] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->text().toDouble(); transformValues[15] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->text().toDouble(); transformValues[16] = m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->isChecked(); transformValues[17] = m_Controls.m_MomentsScaleSkewVersorRigid3D->isChecked(); return transformValues; } void QmitkScaleSkewVersor3DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->setChecked(transformValues[0]); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->setText(QString::number(transformValues[4])); m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->setText(QString::number(transformValues[5])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->setText(QString::number(transformValues[6])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->setText(QString::number(transformValues[7])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->setText(QString::number(transformValues[8])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->setText(QString::number(transformValues[9])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->setText(QString::number(transformValues[10])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->setText(QString::number(transformValues[11])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->setText(QString::number(transformValues[12])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->setText(QString::number(transformValues[13])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->setText(QString::number(transformValues[14])); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->setText(QString::number(transformValues[15])); m_Controls.m_CenterForInitializerScaleSkewVersorRigid3D->setChecked(transformValues[16]); m_Controls.m_MomentsScaleSkewVersorRigid3D->setChecked(transformValues[17]); m_Controls.m_GeometryScaleSkewVersorRigid3D->setChecked(!transformValues[17]); } QString QmitkScaleSkewVersor3DTransformView::GetName() { return "ScaleSkewVersor3D"; } void QmitkScaleSkewVersor3DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->setValidator(validatorLineEditInputFloat); } itk::Array QmitkScaleSkewVersor3DTransformView::GetScales() { itk::Array scales; scales.SetSize(15); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesScaleSkewVersorRigid3DTransform->isChecked()) { scales[0] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale3->text().toDouble(); scales[3] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationX->text().toDouble(); scales[4] = m_Controls.m_ScaleScaleSkewVersorRigid3DTransformScaleTranslationY->text().toDouble(); scales[5] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScaleTranslationZ->text().toDouble(); scales[6] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale7->text().toDouble(); scales[7] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale8->text().toDouble(); scales[8] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale9->text().toDouble(); scales[9] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale10->text().toDouble(); scales[10] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale11->text().toDouble(); scales[11] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale12->text().toDouble(); scales[12] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale13->text().toDouble(); scales[13] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale14->text().toDouble(); scales[14] = m_Controls.m_ScalesScaleSkewVersorRigid3DTransformScale15->text().toDouble(); } return scales; } vtkTransform* QmitkScaleSkewVersor3DTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { itk::ScaleSkewVersor3DTransform::Pointer versorTransform = itk::ScaleSkewVersor3DTransform::New(); versorTransform->SetParameters(transformParams); itk::Matrix Matrix = versorTransform->GetMatrix(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { vtkmatrix->SetElement(i, j, Matrix[i][j]); } } float center[4]; float translation[4]; center[0] = m_CenterX; center[1] = m_CenterY; center[2] = m_CenterZ; center[3] = 1; vtkmatrix->MultiplyPoint(center, translation); vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[3]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[4]); vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[5]); vtktransform->SetMatrix(vtkmatrix); } return vtktransform; } int QmitkScaleSkewVersor3DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 0; else return 15; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp index 1d0d6335fb..a303046921 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity2DTransformView.cpp @@ -1,173 +1,181 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkSimilarity2DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkSimilarity2DTransformView::QmitkSimilarity2DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkSimilarity2DTransformView::~QmitkSimilarity2DTransformView() { } mitk::TransformParameters::TransformType QmitkSimilarity2DTransformView::GetTransformType() { return mitk::TransformParameters::SIMILARITY2DTRANSFORM; } itk::Object::Pointer QmitkSimilarity2DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 2); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkSimilarity2DTransformView::GetTransform2(itk::Image* /* itkImage1 */) +itk::Object::Pointer QmitkSimilarity2DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 2) { typedef typename itk::Image< TPixelType, 2 > FixedImage2DType; typedef typename itk::Image< TPixelType, 2 > MovingImage2DType; - typename FixedImage2DType::Pointer fixedImage2D; - mitk::CastToItkImage(m_FixedImage, fixedImage2D); - typename MovingImage2DType::Pointer movingImage2D; - mitk::CastToItkImage(m_MovingImage, movingImage2D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage2DType::Pointer fixedImage2D = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = + mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage2DType::Pointer movingImage2D = movingImageToItk->GetOutput(); + + typename itk::Similarity2DTransform< double >::Pointer transformPointer = itk::Similarity2DTransform< double >::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerSimilarity2D->isChecked()) { typedef typename itk::Similarity2DTransform< double > Similarity2DTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); transformInitializer->SetFixedImage( fixedImage2D ); transformInitializer->SetMovingImage( movingImage2D ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsSimilarity2D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } transformPointer->SetScale( m_Controls.m_InitialScaleSimilarity2D->text().toFloat() ); transformPointer->SetAngle( m_Controls.m_AngleSimilarity2D->text().toFloat() ); m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkSimilarity2DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(9); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesSimilarity2D->isChecked(); transformValues[1] = m_Controls.m_ScalingScaleSimilarity2D->text().toDouble(); transformValues[2] = m_Controls.m_RotationScaleSimilarity2D->text().toDouble(); transformValues[3] = m_Controls.m_TranslationXScaleSimilarity2D->text().toDouble(); transformValues[4] = m_Controls.m_TranslationYScaleSimilarity2D->text().toDouble(); transformValues[5] = m_Controls.m_InitialScaleSimilarity2D->text().toFloat(); transformValues[6] = m_Controls.m_AngleSimilarity2D->text().toFloat(); transformValues[7] = m_Controls.m_CenterForInitializerSimilarity2D->isChecked(); transformValues[8] = m_Controls.m_MomentsSimilarity2D->isChecked(); return transformValues; } void QmitkSimilarity2DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesSimilarity2D->setChecked(transformValues[0]); m_Controls.m_ScalingScaleSimilarity2D->setText(QString::number(transformValues[1])); m_Controls.m_RotationScaleSimilarity2D->setText(QString::number(transformValues[2])); m_Controls.m_TranslationXScaleSimilarity2D->setText(QString::number(transformValues[3])); m_Controls.m_TranslationYScaleSimilarity2D->setText(QString::number(transformValues[4])); m_Controls.m_InitialScaleSimilarity2D->setText(QString::number(transformValues[5])); m_Controls.m_AngleSimilarity2D->setText(QString::number(transformValues[6])); m_Controls.m_CenterForInitializerSimilarity2D->setChecked(transformValues[7]); m_Controls.m_MomentsSimilarity2D->setChecked(transformValues[8]); m_Controls.m_GeometrySimilarity2D->setChecked(!transformValues[8]); } QString QmitkSimilarity2DTransformView::GetName() { return "Similarity2D"; } void QmitkSimilarity2DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalingScaleSimilarity2D->setValidator(validatorLineEditInputFloat); m_Controls.m_RotationScaleSimilarity2D->setValidator(validatorLineEditInputFloat); m_Controls.m_TranslationXScaleSimilarity2D->setValidator(validatorLineEditInputFloat); m_Controls.m_TranslationYScaleSimilarity2D->setValidator(validatorLineEditInputFloat); } itk::Array QmitkSimilarity2DTransformView::GetScales() { itk::Array scales; scales.SetSize(4); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesSimilarity2D->isChecked()) { scales[0] = m_Controls.m_ScalingScaleSimilarity2D->text().toDouble(); scales[1] = m_Controls.m_RotationScaleSimilarity2D->text().toDouble(); scales[2] = m_Controls.m_TranslationXScaleSimilarity2D->text().toDouble(); scales[3] = m_Controls.m_TranslationYScaleSimilarity2D->text().toDouble(); } return scales; } vtkTransform* QmitkSimilarity2DTransformView::Transform(vtkMatrix4x4* /* vtkmatrix */, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { mitk::ScalarType angle = transformParams[1] * 45.0 / atan(1.0); vtktransform->PostMultiply(); vtktransform->Scale(transformParams[0], transformParams[0], 1); vtktransform->RotateZ(angle); vtktransform->Translate(transformParams[2], transformParams[3], 0); vtktransform->PreMultiply(); } return vtktransform; } int QmitkSimilarity2DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 4; else return 0; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp index bbea4b71a4..376643a3b6 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkSimilarity3DTransformView.cpp @@ -1,197 +1,203 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkSimilarity3DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkSimilarity3DTransformView::QmitkSimilarity3DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkSimilarity3DTransformView::~QmitkSimilarity3DTransformView() { } mitk::TransformParameters::TransformType QmitkSimilarity3DTransformView::GetTransformType() { return mitk::TransformParameters::SIMILARITY3DTRANSFORM; } itk::Object::Pointer QmitkSimilarity3DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkSimilarity3DTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkSimilarity3DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 3) { typedef typename itk::Image< TPixelType, 3 > FixedImage3DType; typedef typename itk::Image< TPixelType, 3 > MovingImage3DType; - typename FixedImage3DType::Pointer fixedImage3D; - mitk::CastToItkImage(m_FixedImage, fixedImage3D); - typename MovingImage3DType::Pointer movingImage3D; - mitk::CastToItkImage(m_MovingImage, movingImage3D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage3DType::Pointer fixedImage = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage3DType::Pointer movingImage = movingImageToItk->GetOutput(); + typename itk::Similarity3DTransform< double >::Pointer transformPointer = itk::Similarity3DTransform< double >::New(); transformPointer->SetIdentity(); if (m_Controls.m_CenterForInitializerSimilarity3D->isChecked()) { typedef typename itk::Similarity3DTransform< double > Similarity3DTransformType; typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage( fixedImage3D ); - transformInitializer->SetMovingImage( movingImage3D ); + transformInitializer->SetFixedImage( fixedImage ); + transformInitializer->SetMovingImage( movingImage ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsSimilarity3D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_CenterZ = transformPointer->GetCenter()[2]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkSimilarity3DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(10); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesSimilarity3D->isChecked(); transformValues[1] = m_Controls.m_ScalesSimilarity3DTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesSimilarity3DTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesSimilarity3DTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_ScalesSimilarity3DTransformScale4->text().toDouble(); transformValues[5] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->text().toDouble(); transformValues[6] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->text().toDouble(); transformValues[7] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->text().toDouble(); transformValues[8] = m_Controls.m_CenterForInitializerSimilarity3D->isChecked(); transformValues[9] = m_Controls.m_MomentsSimilarity3D->isChecked(); return transformValues; } void QmitkSimilarity3DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesSimilarity3D->setChecked(transformValues[0]); m_Controls.m_ScalesSimilarity3DTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesSimilarity3DTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesSimilarity3DTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_ScalesSimilarity3DTransformScale4->setText(QString::number(transformValues[4])); m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->setText(QString::number(transformValues[5])); m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->setText(QString::number(transformValues[6])); m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->setText(QString::number(transformValues[7])); m_Controls.m_CenterForInitializerSimilarity3D->setChecked(transformValues[8]); m_Controls.m_MomentsSimilarity3D->setChecked(transformValues[9]); m_Controls.m_GeometrySimilarity3D->setChecked(!transformValues[9]); } QString QmitkSimilarity3DTransformView::GetName() { return "Similarity3D"; } void QmitkSimilarity3DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesSimilarity3DTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesSimilarity3DTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesSimilarity3DTransformScale3->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesSimilarity3DTransformScale4->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); } itk::Array QmitkSimilarity3DTransformView::GetScales() { itk::Array scales; scales.SetSize(7); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesSimilarity3D->isChecked()) { scales[0] = m_Controls.m_ScalesSimilarity3DTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesSimilarity3DTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesSimilarity3DTransformScale3->text().toDouble(); scales[3] = m_Controls.m_ScalesSimilarity3DTransformScale4->text().toDouble(); scales[4] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationX->text().toDouble(); scales[5] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationY->text().toDouble(); scales[6] = m_Controls.m_ScalesSimilarity3DTransformScaleTranslationZ->text().toDouble(); } return scales; } vtkTransform* QmitkSimilarity3DTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { itk::Similarity3DTransform::Pointer similarityTransform = itk::Similarity3DTransform::New(); similarityTransform->SetParameters(transformParams); itk::Matrix Matrix = similarityTransform->GetMatrix(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { vtkmatrix->SetElement(i, j, Matrix[i][j]); } } float center[4]; float translation[4]; center[0] = m_CenterX; center[1] = m_CenterY; center[2] = m_CenterZ; center[3] = 1; vtkmatrix->MultiplyPoint(center, translation); vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[4]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[5]); vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[6]); vtktransform->SetMatrix(vtkmatrix); } return vtktransform; } int QmitkSimilarity3DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 0; else return 7; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp index 10bb83975a..2a4fed2e8d 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorRigid3DTransformView.cpp @@ -1,208 +1,214 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkVersorRigid3DTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkVersorRigid3DTransformView::QmitkVersorRigid3DTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkVersorRigid3DTransformView::~QmitkVersorRigid3DTransformView() { } mitk::TransformParameters::TransformType QmitkVersorRigid3DTransformView::GetTransformType() { return mitk::TransformParameters::VERSORRIGID3DTRANSFORM; } itk::Object::Pointer QmitkVersorRigid3DTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkVersorRigid3DTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkVersorRigid3DTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 3) { typedef typename itk::Image< TPixelType, 3 > FixedImage3DType; typedef typename itk::Image< TPixelType, 3 > MovingImage3DType; - typename FixedImage3DType::Pointer fixedImage3D; - mitk::CastToItkImage(m_FixedImage, fixedImage3D); - typename MovingImage3DType::Pointer movingImage3D; - mitk::CastToItkImage(m_MovingImage, movingImage3D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage3DType::Pointer fixedImage = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage3DType::Pointer movingImage = movingImageToItk->GetOutput(); + typename itk::VersorRigid3DTransform< double >::Pointer transformPointer = itk::VersorRigid3DTransform< double >::New(); transformPointer->SetIdentity(); typedef typename itk::VersorRigid3DTransform< double > VersorRigid3DTransformType; if (m_Controls.m_CenterForInitializerVersorRigid3D->isChecked()) { typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage( fixedImage3D ); - transformInitializer->SetMovingImage( movingImage3D ); + transformInitializer->SetFixedImage( fixedImage ); + transformInitializer->SetMovingImage( movingImage ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsVersorRigid3D->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } typedef VersorRigid3DTransformType::VersorType VersorType; typedef VersorType::VectorType VectorType; VersorType rotation; VectorType axis; axis[0] = 0.0; axis[1] = 0.0; axis[2] = 1.0; const double angle = 0; rotation.Set( axis, angle ); transformPointer->SetRotation( rotation ); m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_CenterZ = transformPointer->GetCenter()[2]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkVersorRigid3DTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(9); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesVersorRigid3D->isChecked(); transformValues[1] = m_Controls.m_ScalesVersorRigid3DTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesVersorRigid3DTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesVersorRigid3DTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->text().toDouble(); transformValues[5] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->text().toDouble(); transformValues[6] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->text().toDouble(); transformValues[7] = m_Controls.m_CenterForInitializerVersorRigid3D->isChecked(); transformValues[8] = m_Controls.m_MomentsVersorRigid3D->isChecked(); return transformValues; } void QmitkVersorRigid3DTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesVersorRigid3D->setChecked(transformValues[0]); m_Controls.m_ScalesVersorRigid3DTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesVersorRigid3DTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesVersorRigid3DTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->setText(QString::number(transformValues[4])); m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->setText(QString::number(transformValues[5])); m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->setText(QString::number(transformValues[6])); m_Controls.m_CenterForInitializerVersorRigid3D->setChecked(transformValues[7]); m_Controls.m_MomentsVersorRigid3D->setChecked(transformValues[8]); m_Controls.m_GeometryVersorRigid3D->setChecked(!transformValues[8]); } QString QmitkVersorRigid3DTransformView::GetName() { return "VersorRigid3D"; } void QmitkVersorRigid3DTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesVersorRigid3DTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesVersorRigid3DTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesVersorRigid3DTransformScale3->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->setValidator(validatorLineEditInputFloat); } itk::Array QmitkVersorRigid3DTransformView::GetScales() { itk::Array scales; scales.SetSize(6); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesVersorRigid3D->isChecked()) { scales[0] = m_Controls.m_ScalesVersorRigid3DTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesVersorRigid3DTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesVersorRigid3DTransformScale3->text().toDouble(); scales[3] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationX->text().toDouble(); scales[4] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationY->text().toDouble(); scales[5] = m_Controls.m_ScalesVersorRigid3DTransformScaleTranslationZ->text().toDouble(); } return scales; } vtkTransform* QmitkVersorRigid3DTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { itk::VersorRigid3DTransform::Pointer versorTransform = itk::VersorRigid3DTransform::New(); versorTransform->SetParameters(transformParams); itk::Matrix Matrix = versorTransform->GetMatrix(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { vtkmatrix->SetElement(i, j, Matrix[i][j]); } } float center[4]; float translation[4]; center[0] = m_CenterX; center[1] = m_CenterY; center[2] = m_CenterZ; center[3] = 1; vtkmatrix->MultiplyPoint(center, translation); vtkmatrix->SetElement(0, 3, -translation[0] + center[0] + transformParams[3]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1] + transformParams[4]); vtkmatrix->SetElement(2, 3, -translation[2] + center[2] + transformParams[5]); vtktransform->SetMatrix(vtkmatrix); } return vtktransform; } int QmitkVersorRigid3DTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 0; else return 6; } else return 0; } diff --git a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.cpp b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.cpp index 677de1cb58..7887289566 100644 --- a/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.cpp +++ b/Modules/RigidRegistrationUI/RigidRegistrationTransforms/QmitkVersorTransformView.cpp @@ -1,181 +1,187 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkVersorTransformView.h" #include "mitkImageAccessByItk.h" #include #include #include #include QmitkVersorTransformView::QmitkVersorTransformView(QWidget* parent, Qt::WindowFlags f ) : QmitkRigidRegistrationTransformsGUIBase(parent, f), m_CenterX(0), m_CenterY(0), m_CenterZ(0) { } QmitkVersorTransformView::~QmitkVersorTransformView() { } mitk::TransformParameters::TransformType QmitkVersorTransformView::GetTransformType() { return mitk::TransformParameters::VERSORTRANSFORM; } itk::Object::Pointer QmitkVersorTransformView::GetTransform() { if (m_FixedImage.IsNotNull()) { - AccessByItk(m_FixedImage, GetTransform2); + AccessFixedDimensionByItk(m_FixedImage, GetTransform2, 3); return m_TransformObject; } return NULL; } template < class TPixelType, unsigned int VImageDimension > -itk::Object::Pointer QmitkVersorTransformView::GetTransform2(itk::Image* /*itkImage1*/) +itk::Object::Pointer QmitkVersorTransformView::GetTransform2(itk::Image* itkImage1) { if (VImageDimension == 3) { typedef typename itk::Image< TPixelType, 3 > FixedImage3DType; typedef typename itk::Image< TPixelType, 3 > MovingImage3DType; - typename FixedImage3DType::Pointer fixedImage3D; - mitk::CastToItkImage(m_FixedImage, fixedImage3D); - typename MovingImage3DType::Pointer movingImage3D; - mitk::CastToItkImage(m_MovingImage, movingImage3D); + + // the fixedImage is the input parameter (fix for Bug #14626) + typename FixedImage3DType::Pointer fixedImage = itkImage1; + + // the movingImage type is known, use the ImageToItk filter (fix for Bug #14626) + typename mitk::ImageToItk::Pointer movingImageToItk = mitk::ImageToItk::New(); + movingImageToItk->SetInput(m_MovingImage); + movingImageToItk->Update(); + typename MovingImage3DType::Pointer movingImage = movingImageToItk->GetOutput(); + typename itk::VersorTransform< double >::Pointer transformPointer = itk::VersorTransform< double >::New(); transformPointer->SetIdentity(); typedef typename itk::VersorTransform< double > VersorTransformType; if (m_Controls.m_CenterForInitializerVersor->isChecked()) { typedef typename itk::CenteredTransformInitializer TransformInitializerType; typename TransformInitializerType::Pointer transformInitializer = TransformInitializerType::New(); - transformInitializer->SetFixedImage( fixedImage3D ); - transformInitializer->SetMovingImage( movingImage3D ); + transformInitializer->SetFixedImage( fixedImage ); + transformInitializer->SetMovingImage( movingImage ); transformInitializer->SetTransform( transformPointer ); if (m_Controls.m_MomentsVersor->isChecked()) { transformInitializer->MomentsOn(); } else { transformInitializer->GeometryOn(); } transformInitializer->InitializeTransform(); } m_CenterX = transformPointer->GetCenter()[0]; m_CenterY = transformPointer->GetCenter()[1]; m_CenterZ = transformPointer->GetCenter()[2]; m_TransformObject = transformPointer.GetPointer(); return transformPointer.GetPointer(); } return NULL; } itk::Array QmitkVersorTransformView::GetTransformParameters() { itk::Array transformValues; transformValues.SetSize(6); transformValues.fill(0); transformValues[0] = m_Controls.m_UseOptimizerScalesVersor->isChecked(); transformValues[1] = m_Controls.m_ScalesVersorTransformScale1->text().toDouble(); transformValues[2] = m_Controls.m_ScalesVersorTransformScale2->text().toDouble(); transformValues[3] = m_Controls.m_ScalesVersorTransformScale3->text().toDouble(); transformValues[4] = m_Controls.m_CenterForInitializerVersor->isChecked(); transformValues[5] = m_Controls.m_MomentsVersor->isChecked(); return transformValues; } void QmitkVersorTransformView::SetTransformParameters(itk::Array transformValues) { m_Controls.m_UseOptimizerScalesVersor->setChecked(transformValues[0]); m_Controls.m_ScalesVersorTransformScale1->setText(QString::number(transformValues[1])); m_Controls.m_ScalesVersorTransformScale2->setText(QString::number(transformValues[2])); m_Controls.m_ScalesVersorTransformScale3->setText(QString::number(transformValues[3])); m_Controls.m_CenterForInitializerVersor->setChecked(transformValues[4]); m_Controls.m_MomentsVersor->setChecked(transformValues[5]); m_Controls.m_GeometryVersor->setChecked(!transformValues[5]); } QString QmitkVersorTransformView::GetName() { return "Versor"; } void QmitkVersorTransformView::SetupUI(QWidget* parent) { m_Controls.setupUi(parent); QValidator* validatorLineEditInputFloat = new QDoubleValidator(0, 20000000, 8, this); m_Controls.m_ScalesVersorTransformScale1->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesVersorTransformScale2->setValidator(validatorLineEditInputFloat); m_Controls.m_ScalesVersorTransformScale3->setValidator(validatorLineEditInputFloat); } itk::Array QmitkVersorTransformView::GetScales() { itk::Array scales; scales.SetSize(3); scales.Fill(1.0); if (m_Controls.m_UseOptimizerScalesVersor->isChecked()) { scales[0] = m_Controls.m_ScalesVersorTransformScale1->text().toDouble(); scales[1] = m_Controls.m_ScalesVersorTransformScale2->text().toDouble(); scales[2] = m_Controls.m_ScalesVersorTransformScale3->text().toDouble(); } return scales; } vtkTransform* QmitkVersorTransformView::Transform(vtkMatrix4x4* vtkmatrix, vtkTransform* vtktransform, itk::Array transformParams) { if (m_MovingImage.IsNotNull()) { itk::VersorTransform::Pointer versorTransform = itk::VersorTransform::New(); versorTransform->SetParameters(transformParams); itk::Matrix Matrix = versorTransform->GetMatrix(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { vtkmatrix->SetElement(i, j, Matrix[i][j]); } } float center[4]; float translation[4]; center[0] = m_CenterX; center[1] = m_CenterY; center[2] = m_CenterZ; center[3] = 1; vtkmatrix->MultiplyPoint(center, translation); vtkmatrix->SetElement(0, 3, -translation[0] + center[0]); vtkmatrix->SetElement(1, 3, -translation[1] + center[1]); vtkmatrix->SetElement(2, 3, -translation[2] + center[2]); vtktransform->SetMatrix(vtkmatrix); } return vtktransform; } int QmitkVersorTransformView::GetNumberOfTransformParameters() { if (m_FixedImage.IsNotNull()) { if (m_FixedImage->GetDimension() == 2) return 0; else return 3; } else return 0; }