Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions monai/transforms/intensity/array.py
Original file line number Diff line number Diff line change
Expand Up @@ -379,18 +379,24 @@ class ScaleIntensity(Transform):
backend = [TransformBackends.TORCH, TransformBackends.NUMPY]

def __init__(
self, minv: Optional[float] = 0.0, maxv: Optional[float] = 1.0, factor: Optional[float] = None
self,
minv: Optional[float] = 0.0,
maxv: Optional[float] = 1.0,
factor: Optional[float] = None,
dtype: DtypeLike = np.float32,
) -> None:
"""
Args:
minv: minimum value of output data.
maxv: maximum value of output data.
factor: factor scale by ``v = v * (1 + factor)``. In order to use
this parameter, please set `minv` and `maxv` into None.
dtype: output data type, defaults to float32.
"""
self.minv = minv
self.maxv = maxv
self.factor = factor
self.dtype = dtype

def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor:
"""
Expand All @@ -401,10 +407,10 @@ def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor:

"""
if self.minv is not None and self.maxv is not None:
return rescale_array(img, self.minv, self.maxv, img.dtype)
return rescale_array(img, self.minv, self.maxv, dtype=self.dtype)
if self.factor is not None:
out = img * (1 + self.factor)
out, *_ = convert_data_type(out, dtype=img.dtype)
out, *_ = convert_data_type(out, dtype=self.dtype)
return out
raise ValueError("Incompatible values: minv=None or maxv=None and factor=None.")

Expand All @@ -417,12 +423,18 @@ class RandScaleIntensity(RandomizableTransform):

backend = ScaleIntensity.backend

def __init__(self, factors: Union[Tuple[float, float], float], prob: float = 0.1) -> None:
def __init__(
self,
factors: Union[Tuple[float, float], float],
prob: float = 0.1,
dtype: DtypeLike = np.float32,
) -> None:
"""
Args:
factors: factor range to randomly scale by ``v = v * (1 + factor)``.
if single number, factor value is picked from (-factors, factors).
prob: probability of scale.
dtype: output data type, defaults to float32.

"""
RandomizableTransform.__init__(self, prob)
Expand All @@ -433,6 +445,7 @@ def __init__(self, factors: Union[Tuple[float, float], float], prob: float = 0.1
else:
self.factors = (min(factors), max(factors))
self.factor = self.factors[0]
self.dtype = dtype

def randomize(self, data: Optional[Any] = None) -> None:
self.factor = self.R.uniform(low=self.factors[0], high=self.factors[1])
Expand All @@ -445,7 +458,7 @@ def __call__(self, img: NdarrayOrTensor) -> NdarrayOrTensor:
self.randomize()
if not self._do_transform:
return img
scaler = ScaleIntensity(minv=None, maxv=None, factor=self.factor)
scaler = ScaleIntensity(minv=None, maxv=None, factor=self.factor, dtype=self.dtype)
return scaler(img)


Expand Down
9 changes: 7 additions & 2 deletions monai/transforms/intensity/dictionary.py
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,7 @@ def __init__(
minv: Optional[float] = 0.0,
maxv: Optional[float] = 1.0,
factor: Optional[float] = None,
dtype: DtypeLike = np.float32,
allow_missing_keys: bool = False,
) -> None:
"""
Expand All @@ -498,11 +499,12 @@ def __init__(
maxv: maximum value of output data.
factor: factor scale by ``v = v * (1 + factor)``. In order to use
this parameter, please set `minv` and `maxv` into None.
dtype: output data type, defaults to float32.
allow_missing_keys: don't raise exception if key is missing.

"""
super().__init__(keys, allow_missing_keys)
self.scaler = ScaleIntensity(minv, maxv, factor)
self.scaler = ScaleIntensity(minv, maxv, factor, dtype)

def __call__(self, data: Mapping[Hashable, NdarrayOrTensor]) -> Dict[Hashable, NdarrayOrTensor]:
d = dict(data)
Expand All @@ -523,6 +525,7 @@ def __init__(
keys: KeysCollection,
factors: Union[Tuple[float, float], float],
prob: float = 0.1,
dtype: DtypeLike = np.float32,
allow_missing_keys: bool = False,
) -> None:
"""
Expand All @@ -533,6 +536,7 @@ def __init__(
if single number, factor value is picked from (-factors, factors).
prob: probability of rotating.
(Default 0.1, with 10% probability it returns a rotated array.)
dtype: output data type, defaults to float32.
allow_missing_keys: don't raise exception if key is missing.

"""
Expand All @@ -546,6 +550,7 @@ def __init__(
else:
self.factors = (min(factors), max(factors))
self.factor = self.factors[0]
self.dtype = dtype

def randomize(self, data: Optional[Any] = None) -> None:
self.factor = self.R.uniform(low=self.factors[0], high=self.factors[1])
Expand All @@ -556,7 +561,7 @@ def __call__(self, data: Mapping[Hashable, NdarrayOrTensor]) -> Dict[Hashable, N
self.randomize()
if not self._do_transform:
return d
scaler = ScaleIntensity(minv=None, maxv=None, factor=self.factor)
scaler = ScaleIntensity(minv=None, maxv=None, factor=self.factor, dtype=self.dtype)
for key in self.key_iterator(d):
d[key] = scaler(d[key])
return d
Expand Down