Skip to content

Commit f2fc96f

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

File tree

2 files changed

+112
-1
lines changed

2 files changed

+112
-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: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,3 +1034,114 @@ 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', position=1,
1043+
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",
1061+
requires=['metric'],mandatory=True,
1062+
)
1063+
sampling_percentage = traits.Either(
1064+
traits.Range(low=0.0, high=1.0),
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+
Examples
1086+
--------
1087+
1088+
>>> from nipype.interfaces.ants import MeasureImageSimilarity
1089+
>>> sim = MeasureImageSimilarity()
1090+
>>> sim.inputs.dimension = 3
1091+
>>> sim.inputs.metric = 'MI'
1092+
>>> sim.inputs.fixed_image = 'T1.nii'
1093+
>>> sim.inputs.moving_image = 'resting.nii'
1094+
>>> sim.inputs.metric_weight = 1.0
1095+
>>> sim.inputs.radius_or_number_of_bins = 5
1096+
>>> sim.inputs.sampling_strategy = 'Regular'
1097+
>>> sim.inputs.sampling_percentage = 1.0
1098+
>>> sim.inputs.fixed_image_mask = 'mask.nii'
1099+
>>> sim.inputs.moving_image_mask = 'mask.nii.gz'
1100+
>>> sim.cmdline # doctest: +ALLOW_UNICODE
1101+
u'MeasureImageSimilarity --dimensionality 3 --masks ["mask.nii","mask.nii.gz"] \
1102+
--metric MI["T1.nii","resting.nii",1.0,5,Regular,1.0]'
1103+
"""
1104+
_cmd = 'MeasureImageSimilarity'
1105+
input_spec = MeasureImageSimilarityInputSpec
1106+
output_spec = MeasureImageSimilarityOutputSpec
1107+
1108+
def _metric_constructor(self):
1109+
retval = '--metric {metric}["{fixed_image}","{moving_image}",{metric_weight},'\
1110+
'{radius_or_number_of_bins},{sampling_strategy},{sampling_percentage}]'\
1111+
.format(
1112+
metric=self.inputs.metric,
1113+
fixed_image=self.inputs.fixed_image,
1114+
moving_image=self.inputs.moving_image,
1115+
metric_weight=self.inputs.metric_weight,
1116+
radius_or_number_of_bins=self.inputs.radius_or_number_of_bins,
1117+
sampling_strategy=self.inputs.sampling_strategy,
1118+
sampling_percentage=self.inputs.sampling_percentage,
1119+
)
1120+
return retval
1121+
1122+
def _mask_constructor(self):
1123+
if self.inputs.moving_image_mask:
1124+
retval = '--masks ["{fixed_image_mask}","{moving_image_mask}"]'\
1125+
.format(
1126+
fixed_image_mask=self.inputs.fixed_image_mask,
1127+
moving_image_mask=self.inputs.moving_image_mask,
1128+
)
1129+
else:
1130+
retval = '--masks "{fixed_image_mask}"'\
1131+
.format(
1132+
fixed_image_mask=self.inputs.fixed_image_mask,
1133+
)
1134+
return retval
1135+
1136+
def _format_arg(self, opt, spec, val):
1137+
if opt == 'metric':
1138+
return self._metric_constructor()
1139+
elif opt == 'fixed_image_mask':
1140+
return self._mask_constructor()
1141+
return super(MeasureImageSimilarity, self)._format_arg(opt, spec, val)
1142+
1143+
def aggregate_outputs(self, runtime=None, needed_outputs=None):
1144+
outputs = self._outputs()
1145+
stdout = runtime.stdout.split('\n')
1146+
outputs.similarity = float(stdout[0])
1147+
return outputs

0 commit comments

Comments
 (0)