Visualize 2D transform

Hi all,
I am using SimpleITK to perform non rigid registration (bsplines). I am also using 3d Slicer to visualize the produced transform. Now the transform .tfm file is only read by slicer if it’s a 3d transform and not 2d. What I am currently doing is to compute the dense displacement field and then saving it as an image which slicers accepts. However I am wondering if there is a better way by using only the .tfm file? something like converting the 2d bspline transform to a 3d version of it so that slicer is able to read it?

1 Like

Hello @rogertrullo ,

Please see code below (haven’t tested it beyond seeing that it doesn’t crash). Basically, the idea is to convert the transformation to a 3D one, where the displacements for the BSpline control points in the z direction are all zeros.

import SimpleITK as sitk

bspline_2d_file_name = 'bspline_example.tfm'
tx = sitk.BSplineTransform(sitk.ReadTransform(bspline_2d_file_name))
coefficient_images = tx.GetCoefficientImages()

new_coeffs = []
for img in coefficient_images:
    new_image = sitk.Image(img.GetSize() + (1,), img.GetPixelID())
    new_image.SetOrigin(img.GetOrigin() + (0,))
    new_image.SetSpacing(img.GetSpacing() + (1,))
    new_image[:,:,0] = img

# Add zero displacements in z direction.
bspline3d = sitk.BSplineTransform(new_coeffs, tx.GetOrder())
sitk.WriteTransform(bspline3d, '3d_'+bspline_2d_file_name)

Thank you very much @zivy vy
I am having an issue in this line:

new_image[:,:,0] = img

SimpleITK/ in setitem(self, idx, value)
#the index parameter was an invalid set of objects
raise IndexError(“invalid index”)

The shapes seem to correspond well:

(63, 51, 1)
(63, 51)    

Do you have any idea what can be the issue?
Thanks again!

Hello @rogertrullo,

I am working with the latest version of SimpleITK, 2.0.2. Support for this assignment style was added in the 2.x releases.

1 Like

I have this version:
I will update and try again

1 Like

it works now! thank you so much!

1 Like