Bases: Transform
Reassign label values in label maps.
Each key in the remapping dict is replaced by its value.
Labels not mentioned in the dict are left unchanged.
Only LabelMap images are affected.
Parameters:
| Name |
Type |
Description |
Default |
remapping
|
dict[int, int]
|
Dictionary mapping old labels to new labels.
|
required
|
**kwargs
|
Any
|
|
{}
|
Examples:
>>> import torchio as tio
>>> # Merge labels 2 and 3 into label 1
>>> transform = tio.RemapLabels({2: 1, 3: 1})
>>> # Swap labels 1 and 2
>>> transform = tio.RemapLabels({1: 2, 2: 1})
Source code in src/torchio/transforms/label/remap_labels.py
| class RemapLabels(Transform):
r"""Reassign label values in label maps.
Each key in the *remapping* dict is replaced by its value.
Labels not mentioned in the dict are left unchanged.
Only [`LabelMap`][torchio.LabelMap] images are affected.
Args:
remapping: Dictionary mapping old labels to new labels.
**kwargs: See [`Transform`][torchio.Transform].
Examples:
>>> import torchio as tio
>>> # Merge labels 2 and 3 into label 1
>>> transform = tio.RemapLabels({2: 1, 3: 1})
>>> # Swap labels 1 and 2
>>> transform = tio.RemapLabels({1: 2, 2: 1})
"""
def __init__(
self,
remapping: dict[int, int],
**kwargs: Any,
) -> None:
super().__init__(**kwargs)
self.remapping = remapping
def make_params(self, batch: SubjectsBatch) -> dict[str, Any]:
"""No random parameters."""
return {"remapping": self.remapping}
def apply_transform(
self,
batch: SubjectsBatch,
params: dict[str, Any],
) -> SubjectsBatch:
"""Remap labels in each label map."""
remapping = params["remapping"]
for _name, img_batch in batch.images.items():
if not issubclass(img_batch._image_class, LabelMap):
continue
data = img_batch.data.clone()
for old, new in remapping.items():
data[img_batch.data == old] = new
img_batch.data = data
return batch
@property
def invertible(self) -> bool:
"""Whether this transform can be inverted."""
return True
def inverse(self, params: dict[str, Any]) -> RemapLabels:
"""Invert by swapping keys and values."""
remapping = params["remapping"]
inverse_remapping = {v: k for k, v in remapping.items()}
return RemapLabels(remapping=inverse_remapping, copy=False)
|
invertible
property
Whether this transform can be inverted.
forward(data)
forward(data: Subject) -> Subject
forward(data: Image) -> Image
forward(data: Tensor) -> Tensor
forward(data: np.ndarray) -> np.ndarray
forward(data: sitk.Image) -> sitk.Image
forward(data: nib.Nifti1Image) -> nib.Nifti1Image
forward(data: dict) -> dict
forward(data: ImagesBatch) -> ImagesBatch
forward(data: SubjectsBatch) -> SubjectsBatch
Apply the transform.
The output type always matches the input type.
Parameters:
| Name |
Type |
Description |
Default |
data
|
Any
|
|
required
|
Source code in src/torchio/transforms/transform.py
| def forward(self, data: Any) -> Any:
"""Apply the transform.
The output type always matches the input type.
Args:
data: Input data to transform.
"""
if self.copy:
data = _copy.deepcopy(data)
batch, unwrap = self._wrap(data)
if torch.rand(1).item() > self.p:
return unwrap(batch)
params = self.make_params(batch)
batch = self.apply_transform(batch, params)
# Record history on the batch
trace = AppliedTransform(name=type(self).__name__, params=params)
if not hasattr(batch, "applied_transforms"):
batch.applied_transforms = []
batch.applied_transforms.append(trace)
result = unwrap(batch)
# Propagate history to outputs that can carry it
if (
hasattr(batch, "applied_transforms")
and not isinstance(result, (SubjectsBatch, Tensor, np.ndarray))
and not isinstance(result, dict)
):
with contextlib.suppress(AttributeError):
result.applied_transforms = list(batch.applied_transforms)
return result
|
to_hydra()
Export as a Hydra-compatible config dict.
Returns a dict with _target_ set to the fully qualified
class name and only non-default field values included.
Returns:
| Type |
Description |
dict[str, Any]
|
Dict suitable for hydra.utils.instantiate().
|
Source code in src/torchio/transforms/transform.py
| def to_hydra(self) -> dict[str, Any]:
"""Export as a Hydra-compatible config dict.
Returns a dict with `_target_` set to the fully qualified
class name and only non-default field values included.
Returns:
Dict suitable for `hydra.utils.instantiate()`.
"""
from .parameter_range import _ParameterRange
cls = type(self)
target = f"torchio.{cls.__qualname__}"
cfg: dict[str, Any] = {"_target_": target}
for name, default in _collect_init_params(cls).items():
value = getattr(self, name, default)
if isinstance(value, _ParameterRange):
if value._original == default:
continue
value = _hydra_value(value._original)
elif value == default:
continue
else:
value = _hydra_value(value)
cfg[name] = value
return cfg
|
make_params(batch)
No random parameters.
Source code in src/torchio/transforms/label/remap_labels.py
| def make_params(self, batch: SubjectsBatch) -> dict[str, Any]:
"""No random parameters."""
return {"remapping": self.remapping}
|
Remap labels in each label map.
Source code in src/torchio/transforms/label/remap_labels.py
| def apply_transform(
self,
batch: SubjectsBatch,
params: dict[str, Any],
) -> SubjectsBatch:
"""Remap labels in each label map."""
remapping = params["remapping"]
for _name, img_batch in batch.images.items():
if not issubclass(img_batch._image_class, LabelMap):
continue
data = img_batch.data.clone()
for old, new in remapping.items():
data[img_batch.data == old] = new
img_batch.data = data
return batch
|
inverse(params)
Invert by swapping keys and values.
Source code in src/torchio/transforms/label/remap_labels.py
| def inverse(self, params: dict[str, Any]) -> RemapLabels:
"""Invert by swapping keys and values."""
remapping = params["remapping"]
inverse_remapping = {v: k for k, v in remapping.items()}
return RemapLabels(remapping=inverse_remapping, copy=False)
|