Skip to content

Commit 2bd51e6

Browse files
authored
[Feature] Add Rerange transform (open-mmlab#228)
* add rerange transform * restore * delete rerange config * delete rerange config hint * add min < max assert * restore
1 parent 7c68bca commit 2bd51e6

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

mmseg/datasets/pipelines/transforms.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,53 @@ def __repr__(self):
392392
return repr_str
393393

394394

395+
@PIPELINES.register_module()
396+
class Rerange(object):
397+
"""Rerange the image pixel value.
398+
399+
Args:
400+
min_value (float or int): Minimum value of the reranged image.
401+
Default: 0.
402+
max_value (float or int): Maximum value of the reranged image.
403+
Default: 255.
404+
"""
405+
406+
def __init__(self, min_value=0, max_value=255):
407+
assert isinstance(min_value, float) or isinstance(min_value, int)
408+
assert isinstance(max_value, float) or isinstance(max_value, int)
409+
assert min_value < max_value
410+
self.min_value = min_value
411+
self.max_value = max_value
412+
413+
def __call__(self, results):
414+
"""Call function to rerange images.
415+
416+
Args:
417+
results (dict): Result dict from loading pipeline.
418+
419+
Returns:
420+
dict: Reranged results.
421+
"""
422+
423+
img = results['img']
424+
img_min_value = np.min(img)
425+
img_max_value = np.max(img)
426+
427+
assert img_min_value < img_max_value
428+
# rerange to [0, 1]
429+
img = (img - img_min_value) / (img_max_value - img_min_value)
430+
# rerange to [min_value, max_value]
431+
img = img * (self.max_value - self.min_value) + self.min_value
432+
results['img'] = img
433+
434+
return results
435+
436+
def __repr__(self):
437+
repr_str = self.__class__.__name__
438+
repr_str += f'(min_value={self.min_value}, max_value={self.max_value})'
439+
return repr_str
440+
441+
395442
@PIPELINES.register_module()
396443
class RandomCrop(object):
397444
"""Random crop the image & seg.

tests/test_data/test_transform.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,49 @@ def test_rgb2gray():
330330
assert results['ori_shape'] == (h, w, c)
331331

332332

333+
def test_rerange():
334+
# test assertion if min_value or max_value is illegal
335+
with pytest.raises(AssertionError):
336+
transform = dict(type='Rerange', min_value=[0], max_value=[255])
337+
build_from_cfg(transform, PIPELINES)
338+
339+
# test assertion if min_value >= max_value
340+
with pytest.raises(AssertionError):
341+
transform = dict(type='Rerange', min_value=1, max_value=1)
342+
build_from_cfg(transform, PIPELINES)
343+
344+
# test assertion if img_min_value == img_max_value
345+
with pytest.raises(AssertionError):
346+
transform = dict(type='Rerange', min_value=0, max_value=1)
347+
transform = build_from_cfg(transform, PIPELINES)
348+
results = dict()
349+
results['img'] = np.array([[1, 1], [1, 1]])
350+
transform(results)
351+
352+
img_rerange_cfg = dict()
353+
transform = dict(type='Rerange', **img_rerange_cfg)
354+
transform = build_from_cfg(transform, PIPELINES)
355+
results = dict()
356+
img = mmcv.imread(
357+
osp.join(osp.dirname(__file__), '../data/color.jpg'), 'color')
358+
original_img = copy.deepcopy(img)
359+
results['img'] = img
360+
results['img_shape'] = img.shape
361+
results['ori_shape'] = img.shape
362+
# Set initial values for default meta_keys
363+
results['pad_shape'] = img.shape
364+
results['scale_factor'] = 1.0
365+
366+
results = transform(results)
367+
368+
min_value = np.min(original_img)
369+
max_value = np.max(original_img)
370+
converted_img = (original_img - min_value) / (max_value - min_value) * 255
371+
372+
assert np.allclose(results['img'], converted_img)
373+
assert str(transform) == f'Rerange(min_value={0}, max_value={255})'
374+
375+
333376
def test_seg_rescale():
334377
results = dict()
335378
seg = np.array(

0 commit comments

Comments
 (0)