Hello everyone:
I am using SimpleITK to align a set of images, let’s say A is a fixed image and B is a moving image, I have done various alignments including Translation, Euler, Affine and got a series of TransformParameters.txt, I want to get a total transformation matrix X, directly from AX->B ,X for the rest of my subsequent research, how can I get X please? I have interpreted the TransformParameters but I found that it seems that it is not simply a matter of multiplying the matrices of the three sets of transformations, does anyone know how this is to be calculated?
Hello,
Have you stored the series of transforms into a CompositeTransform
? This should be the first step to compose the series into a single working ITK transform.
Next work be to reduce the series into a affine matrix and a translations. For this to be possible IsLinear
must be true on the composite transform ( which implies its true for all transforms in the compost ). The computation the composite translation composite_transform->TransformPoint([0,0,0])
can be used. And to get the affine matrix, it can be assembled from the series to transforming the identity basis vectors e.g. composite_transform->TransformVector([1,0,0]) ...
Hope this helps.
I’m sorry I didn’t understand what you meant, I’m not sure about how the composite transform should be stored, can you give further hints, here is part of my code.
parameterMap = sitk.GetDefaultParameterMap('translation')
parameterMap2 = sitk.GetDefaultParameterMap('rigid')
parameterMap3 = sitk.GetDefaultParameterMap('affine')
sitk.PrintParameterMap(parameterMap)
elastixImageFilter = sitk.ElastixImageFilter()
elastixImageFilter.SetFixedImage(fixed_image)
elastixImageFilter.SetMovingImage(moving_image)
elastixImageFilter.SetParameterMap(parameterMap)
elastixImageFilter.AddParameterMap(parameterMap2)
elastixImageFilter.AddParameterMap(parameterMap3)
elastixImageFilter.SetParameter("WriteIterationInfo", ["true"])
elastixImageFilter.SetOutputDirectory('../log')
elastixImageFilter.PrintParameterMap()
elastixImageFilter.Execute()
transformixImageFilter = sitk.TransformixImageFilter()
transformixImageFilter.SetMovingImage(moving_image)
transformixImageFilter.SetTransformParameterMap(elastixImageFilter.GetTransformParameterMap())
transformixImageFilter.ComputeDeformationFieldOn()
transformixImageFilter.LogToConsoleOn()
transformixImageFilter.SetOutputDirectory('../log2')
transformixImageFilter.Execute()
sitk.WriteImage(transformixImageFilter.GetDeformationField(), "../output/deformation.nii.gz")
I have compiled my detailed verification steps, not sure if they are accurate, hope you can correct them.
-1、Align the file to get TransformParameters.
-2、Read the matrix parameters in TransformParameters to build the transformation matrix.
-3、Read the image position, image orientation, image resolution in the Dicom file, and get the spatial coordinates of each pixel by mapping.
-4、Transform the spatial coordinates of each plane pixel (multiply the transform matrix) to get the transformed spatial coordinates.
-5. Multiply the transformed spatial coordinates by the inverse matrix of the mapping matrix (the inverse matrix of the mapping matrix cannot be found here, so a pseudo-inverse matrix is used) to get the new plane coordinates.
-6, assign the values under the original coordinates to the values of the new coordinates.
-7. Since the size of each slice is 512*512, the new plane coordinates are filtered to remove the pixels whose coordinates are not within [512,512].
-8、Fuse the original slice map with the new slice map to display and view the alignment result.