From 38f0ca3dbc7d30d7d1d0c1ab0f25ed0b51a1c4ce Mon Sep 17 00:00:00 2001 From: kuantkid Date: Sun, 9 Sep 2012 23:19:29 +0800 Subject: [PATCH 1/4] FIX convert to (unsigned) integer from bool type --- skimage/util/dtype.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/skimage/util/dtype.py b/skimage/util/dtype.py index 0ca3197b..ce5acfc1 100644 --- a/skimage/util/dtype.py +++ b/skimage/util/dtype.py @@ -150,8 +150,17 @@ def convert(image, dtype, force_copy=False, uniform=False): itemsize = dtypeobj.itemsize itemsize_in = dtypeobj_in.itemsize - if kind == 'b' or kind_in == 'b': + if kind == 'b': + # to binary image + prec_loss() return dtype(image) + + if kind_in == 'b': + # from binary image, to float and to integer + if kind == 'f': + return dtype(image) + elif kind in 'ui': + return dtype(image) * dtype_range[dtype][1] if kind in 'ui': imin = np.iinfo(dtype).min From 61be60cacec1c4fdee513d704e84d60251d743e1 Mon Sep 17 00:00:00 2001 From: kuantkid Date: Mon, 10 Sep 2012 12:51:50 +0800 Subject: [PATCH 2/4] FIX: early fix for dtype conversion from bool to other type PR #306, Issue #263 --- skimage/util/dtype.py | 5 +---- skimage/util/tests/test_dtype.py | 10 ++++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/skimage/util/dtype.py b/skimage/util/dtype.py index ce5acfc1..b44bebbc 100644 --- a/skimage/util/dtype.py +++ b/skimage/util/dtype.py @@ -157,10 +157,7 @@ def convert(image, dtype, force_copy=False, uniform=False): if kind_in == 'b': # from binary image, to float and to integer - if kind == 'f': - return dtype(image) - elif kind in 'ui': - return dtype(image) * dtype_range[dtype][1] + return dtype(image) * dtype_range[dtype][1] if kind in 'ui': imin = np.iinfo(dtype).min diff --git a/skimage/util/tests/test_dtype.py b/skimage/util/tests/test_dtype.py index 9803e0af..946a09eb 100644 --- a/skimage/util/tests/test_dtype.py +++ b/skimage/util/tests/test_dtype.py @@ -93,12 +93,14 @@ def test_bool(): img_[1, 1] = True img8[1, 1] = True funcs = (img_as_float, img_as_int, img_as_ubyte, img_as_uint, img_as_bool) - for func in funcs: + for (func, dt) in [(img_as_int, np.int16), + (img_as_float, np.float64), + (img_as_uint, np.uint16), + (img_as_ubyte, np.ubyte)]: converted_ = func(img_) - assert np.sum(converted_) == 1 + assert np.sum(converted_) == dtype_range[dt][1] converted8 = func(img8) - assert np.sum(converted8) == 1 - + assert np.sum(converted8) == dtype_range[dt][1] if __name__ == '__main__': np.testing.run_module_suite() From 07b258e2085d3397400ce305c2074b54bb232da0 Mon Sep 17 00:00:00 2001 From: kuantkid Date: Mon, 10 Sep 2012 13:11:27 +0800 Subject: [PATCH 3/4] FIX: multiply by the maximum value may change dtype --- skimage/util/dtype.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skimage/util/dtype.py b/skimage/util/dtype.py index b44bebbc..cc492035 100644 --- a/skimage/util/dtype.py +++ b/skimage/util/dtype.py @@ -152,12 +152,13 @@ def convert(image, dtype, force_copy=False, uniform=False): if kind == 'b': # to binary image + sign_loss() prec_loss() return dtype(image) if kind_in == 'b': # from binary image, to float and to integer - return dtype(image) * dtype_range[dtype][1] + return dtype(image) * dtype(dtype_range[dtype][1]) if kind in 'ui': imin = np.iinfo(dtype).min From 554487f9de4b96671daf1cc4bb281aa844db4ac6 Mon Sep 17 00:00:00 2001 From: kuantkid Date: Mon, 10 Sep 2012 13:22:38 +0800 Subject: [PATCH 4/4] FIX: issue sign loss warning only for signed type --- skimage/util/dtype.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skimage/util/dtype.py b/skimage/util/dtype.py index cc492035..518ebf18 100644 --- a/skimage/util/dtype.py +++ b/skimage/util/dtype.py @@ -152,7 +152,8 @@ def convert(image, dtype, force_copy=False, uniform=False): if kind == 'b': # to binary image - sign_loss() + if kind_in in "fi": + sign_loss() prec_loss() return dtype(image)