diff --git a/skimage/transform/_geometric.py b/skimage/transform/_geometric.py index 334b2164..2133c735 100644 --- a/skimage/transform/_geometric.py +++ b/skimage/transform/_geometric.py @@ -1012,14 +1012,16 @@ def _clip_warp_output(input_image, output_image, clip, mode, order, cval): min_val = input_image.min() max_val = input_image.max() - clipped = np.clip(output_image, min_val, max_val) + preserve_cval = mode == 'constant' and not \ + (min_val <= cval <= max_val) - if mode == 'constant' and not (min_val <= cval <= max_val): - clipped[output_image == cval] = cval + if preserve_cval: + cval_mask = output_image == cval - return clipped + np.clip(output_image, min_val, max_val, out=output_image) - return output_image + if preserve_cval: + output_image[cval_mask] = cval def warp(image, inverse_map=None, map_args={}, output_shape=None, order=1, @@ -1252,6 +1254,6 @@ def warp(image, inverse_map=None, map_args={}, output_shape=None, order=1, mode=mode, order=order, cval=cval) - out = _clip_warp_output(image, out, clip, mode, order, cval) + _clip_warp_output(image, out, clip, mode, order, cval) return out diff --git a/skimage/transform/_warps.py b/skimage/transform/_warps.py index 2153dd58..402f73ef 100644 --- a/skimage/transform/_warps.py +++ b/skimage/transform/_warps.py @@ -84,7 +84,7 @@ def resize(image, output_shape, order=1, mode='constant', cval=0, clip=True, out = ndimage.map_coordinates(image, coord_map, order=order, mode=mode, cval=cval) - out = _clip_warp_output(image, out, clip, mode, order, cval) + _clip_warp_output(image, out, clip, mode, order, cval) else: # 2-dimensional interpolation