@@ -706,6 +706,41 @@ def test_itk_disp_load_intent():
706706
707707
708708# Added tests for displacements fields orientations (ANTs/ITK)
709+ def test_itk_densefield_read (testdata_path , tmp_path ):
710+ """Map points with DenseFieldTransform and compare to ANTs."""
711+ warpfile = (
712+ testdata_path
713+ / "regressions"
714+ / ("01_ants_t1_to_mniComposite_DisplacementFieldTransform.nii.gz" )
715+ )
716+ if not warpfile .exists ():
717+ pytest .skip ("Composite transform test data not available" )
718+
719+ nib_from_itk = nb .load (warpfile )
720+ nit_from_itk = itk .ITKDisplacementsField .from_filename (warpfile )
721+ itk_from_nit = itk .ITKDisplacementsField .to_image (nit_from_itk )
722+
723+ # Enable for debugging
724+ # nib_from_itk.to_filename(tmp_path / "nib_from_itk.nii.gz")
725+ # itk_from_nit.to_filename(tmp_path / "itk_from_nit.nii.gz")
726+ # nit_from_itk.to_filename(tmp_path / "nit_from_itk.nii.gz")
727+
728+ # import pdb; pdb.set_trace()
729+
730+ np .testing .assert_allclose (
731+ nib_from_itk .dataobj , itk_from_nit .dataobj , rtol = 1e-5 , atol = 1e-5
732+ )
733+ np .testing .assert_allclose (
734+ nit_from_itk .dataobj , np .squeeze (itk_from_nit .dataobj ), rtol = 1e-5 , atol = 1e-5
735+ )
736+ np .testing .assert_allclose (
737+ nib_from_itk .affine , itk_from_nit .affine , rtol = 1e-5 , atol = 1e-5
738+ )
739+ np .testing .assert_allclose (
740+ nit_from_itk .affine , itk_from_nit .affine , rtol = 1e-5 , atol = 1e-5
741+ )
742+
743+
709744@pytest .mark .parametrize ("image_orientation" , ["RAS" , "LAS" , "LPS" , "oblique" ])
710745@pytest .mark .parametrize ("field_is_random" , [False , True ])
711746def test_itk_displacements (tmp_path , get_testdata , image_orientation , field_is_random ):
@@ -745,6 +780,15 @@ def test_itk_displacements(tmp_path, get_testdata, image_orientation, field_is_r
745780 itk_nit_nii = itk .ITKDisplacementsField .from_filename (itk_file )
746781 itk_nii = nb .load (itk_file )
747782
783+ # Test round trip
784+ assert itk_nit_nii .shape == field .shape
785+ np .testing .assert_allclose (itk_nit_nii .dataobj , field )
786+ np .testing .assert_allclose (
787+ itk_nit_nii .dataobj .transpose (2 , 1 , 0 , 3 )[..., None , :], nit_nii .dataobj
788+ )
789+ np .testing .assert_allclose (itk_nit_nii .affine , ref_affine )
790+ np .testing .assert_allclose (LPS @ itk_nit_nii .affine , nit_nii .affine )
791+
748792 assert nit_nii .shape == itk_nii .shape , (
749793 "ITK-generated and nitransforms-generated field shapes are different"
750794 )
@@ -754,14 +798,9 @@ def test_itk_displacements(tmp_path, get_testdata, image_orientation, field_is_r
754798 # Check ITK-generated field has LPS-rotated affine
755799 np .testing .assert_allclose (itk_nii .affine , LPS @ ref_affine )
756800 # Test ITK-generated dataobject vs. original field
757- np .testing .assert_allclose (itk_nii .dataobj , field .transpose (2 , 1 , 0 , 3 )[..., None , :])
758-
759- # Test round trip
760- assert itk_nit_nii .shape == field .shape
761- np .testing .assert_allclose (itk_nit_nii .dataobj , field )
762- np .testing .assert_allclose (itk_nit_nii .dataobj .transpose (2 , 1 , 0 , 3 )[..., None , :], nit_nii .dataobj )
763- np .testing .assert_allclose (itk_nit_nii .affine , ref_affine )
764- np .testing .assert_allclose (LPS @ itk_nit_nii .affine , nit_nii .affine )
801+ np .testing .assert_allclose (
802+ itk_nii .dataobj , field .transpose (2 , 1 , 0 , 3 )[..., None , :]
803+ )
765804
766805
767806# Added tests for h5 orientation bug
0 commit comments