Skip to content

Commit e5aa02a

Browse files
authored
Merge pull request #794 from ANTsX/DepLin
ENH: Subsume typeOfLinearTransform in initialTransforms.
2 parents 36b05c0 + 222fa35 commit e5aa02a

File tree

1 file changed

+71
-43
lines changed

1 file changed

+71
-43
lines changed

ants/registration/registration.py

Lines changed: 71 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import re
1212
import pandas as pd
1313
import itertools
14+
import os
1415

1516
import ants
1617
from ants.internal import get_lib_fn, get_pointer_string, process_arguments
@@ -1254,7 +1255,8 @@ def label_image_registration(fixed_label_images,
12541255
moving_intensity_images=None,
12551256
fixed_mask=None,
12561257
moving_mask=None,
1257-
type_of_linear_transform='affine',
1258+
initial_transforms='affine',
1259+
type_of_linear_transform=None,
12581260
type_of_deformable_transform='antsRegistrationSyNQuick[so]',
12591261
label_image_weighting=1.0,
12601262
output_prefix='',
@@ -1287,9 +1289,16 @@ def label_image_registration(fixed_label_images,
12871289
Defines region for similarity metric calculation in the space
12881290
of the moving image.
12891291
1292+
initial_transforms : string or list of files
1293+
If specified, there are two options: 2) Use label images with
1294+
the centers of mass to a calculate linear transform of type
1295+
'identity', 'rigid', 'similarity', or 'affine'. 2) Specify a
1296+
list of transform files, e.g., the output of ants.registration().
1297+
12901298
type_of_linear_transform : string
12911299
Use label images with the centers of mass to a calculate linear
12921300
transform of type 'identity', 'rigid', 'similarity', or 'affine'.
1301+
Deprecated-subsumed by initial_transforms.
12931302
12941303
type_of_deformable_transform : string
12951304
Only works with deformable-only transforms, specifically the family
@@ -1336,14 +1345,22 @@ def label_image_registration(fixed_label_images,
13361345
[r64_seg1, r64_seg2],
13371346
fixed_intensity_images=r16,
13381347
moving_intensity_images=r64,
1339-
type_of_linear_transform='affine',
1348+
initial_transforms='affine',
13401349
type_of_deformable_transform='antsRegistrationSyNQuick[bo]',
13411350
label_image_weighting=[1.0, 2.0],
13421351
verbose=True)
13431352
"""
13441353

13451354
# Perform validation check on the input
13461355

1356+
if type_of_linear_transform is not None:
1357+
print( "\n" )
1358+
print( "*****************************************************************************************" )
1359+
print( "Deprecation warning. typeOfLinearTransform is deprecated. Please use initialTransforms." )
1360+
print( "*****************************************************************************************" )
1361+
print( "\n" )
1362+
initial_transforms = type_of_linear_transform
1363+
13471364
if isinstance(fixed_label_images, ants.ANTsImage):
13481365
fixed_label_images = [ants.image_clone(fixed_label_images)]
13491366
if isinstance(moving_label_images, ants.ANTsImage):
@@ -1374,10 +1391,6 @@ def label_image_registration(fixed_label_images,
13741391
if output_prefix == "" or output_prefix is None or len(output_prefix) == 0:
13751392
output_prefix = mktemp()
13761393

1377-
allowable_linear_transforms = ['rigid', 'similarity', 'affine', 'identity']
1378-
if not type_of_linear_transform in allowable_linear_transforms:
1379-
raise ValueError("Unrecognized linear transform.")
1380-
13811394
do_deformable = True
13821395
if type_of_deformable_transform is None or len(type_of_deformable_transform) == 0:
13831396
do_deformable = False
@@ -1401,14 +1414,15 @@ def label_image_registration(fixed_label_images,
14011414
if verbose:
14021415
print("Total number of labels: " + str(total_number_of_labels))
14031416

1417+
initial_xfrm_files = list()
1418+
14041419
##############################
14051420
#
1406-
# Linear transform
1421+
# Initial linear transform
14071422
#
14081423
##############################
14091424

1410-
linear_xfrm = None
1411-
if type_of_linear_transform != 'identity':
1425+
if isinstance(initial_transforms, str) and initial_transforms in ['rigid', 'similarity', 'affine']:
14121426

14131427
if verbose:
14141428
print("\n\nComputing linear transform.\n")
@@ -1436,21 +1450,20 @@ def label_image_registration(fixed_label_images,
14361450

14371451
linear_xfrm = ants.fit_transform_to_paired_points(moving_centers_of_mass,
14381452
fixed_centers_of_mass,
1439-
transform_type=type_of_linear_transform,
1453+
transform_type=initial_transforms,
14401454
verbose=verbose)
1455+
1456+
if do_deformable:
1457+
linear_xfrm_file = output_prefix + "LandmarkBasedLinear" + initial_transforms + ".mat"
1458+
else:
1459+
linear_xfrm_file = output_prefix + "0GenericAffine.mat"
14411460

1442-
linear_xfrm_file = output_prefix + "0GenericAffine.mat"
14431461
ants.write_transform(linear_xfrm, linear_xfrm_file)
1462+
initial_xfrm_files.append(linear_xfrm_file)
14441463

1445-
##############################
1446-
#
1447-
# Deformable transform
1448-
#
1449-
##############################
1450-
1451-
if do_deformable:
1452-
1453-
if type_of_linear_transform == "identity":
1464+
elif initial_transforms is not None or initial_transforms == 'identity':
1465+
1466+
if do_deformable:
14541467
for i in range(len(common_label_ids)):
14551468
for j in range(len(common_label_ids[i])):
14561469
label = common_label_ids[i][j]
@@ -1460,6 +1473,23 @@ def label_image_registration(fixed_label_images,
14601473
moving_single_label_image,
14611474
label_image_weights[i], 0])
14621475

1476+
if initial_transforms != 'identity':
1477+
if not isinstance(initial_transforms, list):
1478+
initial_transforms = [initial_transforms]
1479+
for i in range(len(initial_transforms)):
1480+
if not os.path.exists(initial_transforms[i]):
1481+
raise ValueError(initial_transforms[i] + " does not exist.")
1482+
else:
1483+
initial_xfrm_files.append(initial_transforms[i])
1484+
1485+
##############################
1486+
#
1487+
# Deformable transform
1488+
#
1489+
##############################
1490+
1491+
if do_deformable:
1492+
14631493
if verbose:
14641494
print("\n\nComputing deformable transform using images.\n")
14651495

@@ -1561,14 +1591,14 @@ def label_image_registration(fixed_label_images,
15611591
syn_stage.insert(0, "BSplineSyN[" + str(gradient_step) + "," + str(spline_distance) + ",0,3]")
15621592
syn_stage.insert(0, "--transform")
15631593

1564-
args = None
1565-
if linear_xfrm is None:
1566-
args = ["--dimensionality", str(image_dimension),
1567-
"--output", output_prefix]
1568-
else:
1569-
args = ["--dimensionality", str(image_dimension),
1570-
"-r", linear_xfrm_file,
1571-
"--output", output_prefix]
1594+
args = ["--dimensionality", str(image_dimension),
1595+
"--output", output_prefix]
1596+
1597+
if len(initial_xfrm_files) > 0:
1598+
for i in range(len(initial_xfrm_files)):
1599+
initial_args = ["-r", initial_xfrm_files[i]]
1600+
args.append(initial_args)
1601+
15721602
args.append(syn_stage)
15731603

15741604
fixed_mask_string = 'NA'
@@ -1614,22 +1644,20 @@ def label_image_registration(fixed_label_images,
16141644

16151645
all_xfrms = sorted(set(glob.glob(output_prefix + "*" + "[0-9]*")))
16161646

1617-
find_inverse_warps = np.where([re.search("[0-9]InverseWarp.nii.gz", ff) for ff in all_xfrms])[0]
1618-
find_forward_warps = np.where([re.search("[0-9]Warp.nii.gz", ff) for ff in all_xfrms])[0]
1647+
find_inverse_warps_idx = np.where([re.search("[0-9]InverseWarp.nii.gz", ff) for ff in all_xfrms])[0]
1648+
find_forward_warps_idx = np.where([re.search("[0-9]Warp.nii.gz", ff) for ff in all_xfrms])[0]
1649+
find_affines_idx = np.where([re.search("[0-9]GenericAffine.mat", ff) for ff in all_xfrms])[0]
16191650

1620-
fwdtransforms = []
1621-
invtransforms = []
1622-
if linear_xfrm is not None:
1623-
if len(find_inverse_warps) > 0:
1624-
fwdtransforms = [all_xfrms[find_forward_warps[0]], linear_xfrm_file]
1625-
invtransforms = [linear_xfrm_file, all_xfrms[find_inverse_warps[0]]]
1626-
else:
1627-
fwdtransforms = [linear_xfrm_file]
1628-
invtransforms = [linear_xfrm_file]
1629-
else:
1630-
if len(find_inverse_warps) > 0:
1631-
fwdtransforms = [all_xfrms[find_forward_warps[0]]]
1632-
invtransforms = [all_xfrms[find_inverse_warps[0]]]
1651+
fwdtransforms = list()
1652+
invtransforms = list()
1653+
1654+
if len(find_forward_warps_idx) > 0:
1655+
fwdtransforms.append(all_xfrms[find_forward_warps_idx[0]])
1656+
if len(find_affines_idx) > 0:
1657+
fwdtransforms.append(all_xfrms[find_affines_idx[0]])
1658+
invtransforms.append(all_xfrms[find_affines_idx[0]])
1659+
if len(find_inverse_warps_idx) > 0:
1660+
invtransforms.append(all_xfrms[find_inverse_warps_idx[0]])
16331661

16341662
if verbose:
16351663
print("\n\nResulting transforms")

0 commit comments

Comments
 (0)