I'm using ITK to perform a affine coregistration on 3D MRI scans.
Now similar to what is suggested in https://github.com/InsightSoftwareConsortium/ITKElastix/blob/master/examples/ITK_Example08_SimpleTransformix.ipynb I would like to perform the affine transformation on another image but we are using another library for that.
So I would need a full affine matrix for the transformation that describes the affine coregistration.
I noticed that the registration returns the transform parameters:
result_image, result_transform_parameters = itk.elastix_registration_method( ...
parameter_map = transform_parameters.GetParameterMap(0)
transform_parameters = np.array(parameter_map['TransformParameters'], dtype=float)
From other GitHub issues I gathered that the last 3 values of the 12 values in transform_parameters is for the translation and the first 9 are for the rotation. Not sure if that is correct.
Based on this I started playing around and got close to the correct affine transformation matrix (the resulting images are similar but not quite right).
rotation = transform_parameters[:9].reshape(3, 3)
translation = transform_parameters[-3:][..., np.newaxis]
translation = -np.flip(translation)
reg_affine: np.ndarray = np.append(rotation, translation, axis=1)
reg_affine = np.append(reg_affine, [[0,0 ,0,1]], axis=0)
The translation might be right but the rotation is slightly off. What am I missing / what is wrong? Also why do I need to flip and negate the translation? Do I need to do something similar with the rotation matrix?
Would really appreciate some insight. The ITK methods are a blackbox to me.
Not sure what example data I can share. Here some example values for the above variables:
transform_parameters = [ 9.98573286e-01, -3.92533565e-03, -7.45617495e-03, 6.11828178e-04,
9.98081930e-01, 7.21948277e-03, 2.74329272e-03, -1.22292851e-02,
1.00763651e+00, -1.52612188e-01, 8.89476641e-01, 2.55258072e+00]
with the resulting affine matrix:
reg_affine = [[ 1.00763651e+00, -1.22292851e-02, 2.74329272e-03, -2.55258072e+00],
[ 7.21948277e-03, 9.98081930e-01, 6.11828178e-04, -8.89476641e-01],
[-7.45617495e-03, -3.92533565e-03, 9.98573286e-01, 1.52612188e-01],
[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]
I'm using ITK to perform a affine coregistration on 3D MRI scans.
Now similar to what is suggested in https://github.com/InsightSoftwareConsortium/ITKElastix/blob/master/examples/ITK_Example08_SimpleTransformix.ipynb I would like to perform the affine transformation on another image but we are using another library for that.
So I would need a full affine matrix for the transformation that describes the affine coregistration.
I noticed that the registration returns the transform parameters:
From other GitHub issues I gathered that the last 3 values of the 12 values in
transform_parametersis for the translation and the first 9 are for the rotation. Not sure if that is correct.Based on this I started playing around and got close to the correct affine transformation matrix (the resulting images are similar but not quite right).
The translation might be right but the rotation is slightly off. What am I missing / what is wrong? Also why do I need to flip and negate the translation? Do I need to do something similar with the rotation matrix?
Would really appreciate some insight. The ITK methods are a blackbox to me.
Not sure what example data I can share. Here some example values for the above variables:
with the resulting affine matrix: