Skip to content

Commit efd4409

Browse files
committed
added interface for MeasureImageSimilarity
1 parent 2ee584b commit efd4409

File tree

2 files changed

+113
-1
lines changed

2 files changed

+113
-1
lines changed

nipype/interfaces/ants/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""Top-level namespace for ants."""
66

77
# Registraiton programs
8-
from .registration import ANTS, Registration
8+
from .registration import ANTS, Registration, MeasureImageSimilarity
99

1010
# Resampling Programs
1111
from .resampling import (ApplyTransforms, ApplyTransformsToPoints, WarpImageMultiTransform,

nipype/interfaces/ants/registration.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,3 +1034,115 @@ def _list_outputs(self):
10341034
if len(self.inputs.save_state):
10351035
outputs['save_state'] = os.path.abspath(self.inputs.save_state)
10361036
return outputs
1037+
1038+
1039+
class MeasureImageSimilarityInputSpec(ANTSCommandInputSpec):
1040+
dimension = traits.Enum(
1041+
2, 3, 4,
1042+
argstr='--dimensionality %d', usedefault=False,
1043+
position=1, desc='Dimensionality of the fixed/moving image pair',
1044+
)
1045+
fixed_image = File(
1046+
exists=True, mandatory=True,
1047+
desc=('image to which the moving image is warped'),
1048+
)
1049+
moving_image = File(
1050+
exists=True,mandatory=True,
1051+
desc=('image to apply transformation to (generally a coregistered functional)'),
1052+
)
1053+
metric = traits.Enum(
1054+
"CC", "MI", "Mattes", "MeanSquares", "Demons", "GC",
1055+
argstr="%s", mandatory=True,
1056+
)
1057+
metric_weight = traits.Float(requires=['metric'], desc='',mandatory=True,)
1058+
radius_or_number_of_bins = traits.Int(requires=['metric'], desc='',mandatory=True,)
1059+
sampling_strategy = traits.Enum(
1060+
"None", "Regular", "Random", None,
1061+
requires=['metric'],mandatory=True,
1062+
)
1063+
sampling_percentage = traits.Either(
1064+
traits.Range(low=0.0, high=1.0), None,
1065+
requires=['metric'], mandatory=True,
1066+
)
1067+
fixed_image_mask = File(
1068+
exists=True, argstr='%s',
1069+
desc='mask used to limit metric sampling region of the fixed image',
1070+
)
1071+
moving_image_mask = File(
1072+
exists=True, requires=['fixed_image_mask'],
1073+
desc='mask used to limit metric sampling region of the moving image',
1074+
)
1075+
1076+
1077+
class MeasureImageSimilarityOutputSpec(TraitedSpec):
1078+
similarity =traits.Float()
1079+
1080+
1081+
class MeasureImageSimilarity(ANTSCommand):
1082+
1083+
"""
1084+
1085+
1086+
Examples
1087+
--------
1088+
1089+
>>> from nipype.interfaces.ants import MeasureImageSimilarity
1090+
>>> sim = MeasureImageSimilarity()
1091+
>>> sim.inputs.dimension = 3
1092+
>>> sim.inputs.metric = 'MI'
1093+
>>> sim.inputs.fixed_image = 'T1.nii'
1094+
>>> sim.inputs.moving_image = 'resting.nii'
1095+
>>> sim.inputs.metric_weight = 1.0
1096+
>>> sim.inputs.radius_or_number_of_bins = 5
1097+
>>> sim.inputs.sampling_strategy = 'Regular'
1098+
>>> sim.inputs.sampling_percentage = 1.0
1099+
>>> sim.inputs.fixed_image_mask = 'mask.nii'
1100+
>>> sim.inputs.moving_image_mask = 'mask.nii.gz'
1101+
>>> sim.cmdline # doctest: +ALLOW_UNICODE
1102+
u'MeasureImageSimilarity --dimensionality 3 --masks ["mask.nii","mask.nii.gz"] \
1103+
--metric MI["T1.nii","resting.nii",1.0,5,Regular,1.0]'
1104+
"""
1105+
_cmd = 'MeasureImageSimilarity'
1106+
input_spec = MeasureImageSimilarityInputSpec
1107+
output_spec = MeasureImageSimilarityOutputSpec
1108+
1109+
def _metric_constructor(self):
1110+
retval = '--metric {metric}["{fixed_image}","{moving_image}",{metric_weight},'\
1111+
'{radius_or_number_of_bins},{sampling_strategy},{sampling_percentage}]'\
1112+
.format(
1113+
metric=self.inputs.metric,
1114+
fixed_image=self.inputs.fixed_image,
1115+
moving_image=self.inputs.moving_image,
1116+
metric_weight=self.inputs.metric_weight,
1117+
radius_or_number_of_bins=self.inputs.radius_or_number_of_bins,
1118+
sampling_strategy=self.inputs.sampling_strategy,
1119+
sampling_percentage=self.inputs.sampling_percentage,
1120+
)
1121+
return retval
1122+
1123+
def _mask_constructor(self):
1124+
if self.inputs.moving_image_mask:
1125+
retval = '--masks ["{fixed_image_mask}","{moving_image_mask}"]'\
1126+
.format(
1127+
fixed_image_mask=self.inputs.fixed_image_mask,
1128+
moving_image_mask=self.inputs.moving_image_mask,
1129+
)
1130+
else:
1131+
retval = '--masks "{fixed_image_mask}"'\
1132+
.format(
1133+
fixed_image_mask=self.inputs.fixed_image_mask,
1134+
)
1135+
return retval
1136+
1137+
def _format_arg(self, opt, spec, val):
1138+
if opt == 'metric':
1139+
return self._metric_constructor()
1140+
elif opt == 'fixed_image_mask':
1141+
return self._mask_constructor()
1142+
return super(MeasureImageSimilarity, self)._format_arg(opt, spec, val)
1143+
1144+
def _list_outputs(self):
1145+
outputs = self._outputs()
1146+
stdout = runtime.stdout.split('\n')
1147+
outputs['similarity'] = float(stdout)
1148+
return outputs

0 commit comments

Comments
 (0)