From eda09124a3d262bb47405924f44cdf11853f2b1e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Mar 2016 10:46:46 -0500 Subject: [PATCH 1/2] Fix #6069. Handle image masks correctly Alternative to #6070 This works by converting the greyscale image to an RGBA image (with the alpha channel created correctly) prior to resizing in Agg. This also removes the hack (that caused problems with over/under) where we were using negative values to indicate transparency. --- lib/matplotlib/cm.py | 4 - lib/matplotlib/image.py | 30 +- .../baseline_images/test_image/mask_image.pdf | Bin 0 -> 5879 bytes .../baseline_images/test_image/mask_image.png | Bin 0 -> 4038 bytes .../baseline_images/test_image/mask_image.svg | 365 +++++++++++++++++++++ .../baseline_images/test_image/rotate_image.png | Bin 22564 -> 22559 bytes lib/matplotlib/tests/test_image.py | 19 ++ 7 files changed, 403 insertions(+), 15 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_image/mask_image.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_image/mask_image.png create mode 100644 lib/matplotlib/tests/baseline_images/test_image/mask_image.svg diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index f3a80f470d7..dcc0a1db6bd 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -269,10 +269,6 @@ def to_rgba(self, x, alpha=None, bytes=False, norm=True): if norm: x = self.norm(x) rgba = self.cmap(x, alpha=alpha, bytes=bytes) - # For floating-point greyscale images, we treat negative as - # transparent so we copy that over to the alpha channel - if x.ndim == 2 and x.dtype.kind == 'f': - rgba[:, :, 3][x < 0.0] = 0 return rgba def set_array(self, A): diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index ade8bd8a28f..a14fc25979d 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -354,20 +354,22 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, out_height = int(out_height_base) if not unsampled: + created_rgba_mask = False + if A.ndim == 2: A = self.norm(A) + # If the image is greyscale, convert to RGBA with the + # correct alpha channel for resizing + rgba = np.empty((A.shape[0], A.shape[1], 4), dtype=A.dtype) + rgba[..., 0:3] = np.expand_dims(A, 2) if A.dtype.kind == 'f': - # For floating-point greyscale images, we treat negative - # numbers as transparent. - - # TODO: Use np.full when we support Numpy 1.9 as a - # minimum - output = np.empty((out_height, out_width), dtype=A.dtype) - output[...] = -100.0 + rgba[..., 3] = ~A.mask else: - output = np.zeros((out_height, out_width), dtype=A.dtype) - + rgba[..., 3] = np.where(A.mask, 0, np.iinfo(np.dtype).max) + A = rgba + output = np.zeros((out_height, out_width, 4), dtype=A.dtype) alpha = 1.0 + created_rgba_mask = True elif A.ndim == 3: # Always convert to RGBA, even if only RGB input if A.shape[2] == 3: @@ -388,10 +390,16 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, self.get_resample(), alpha, self.get_filternorm() or 0.0, self.get_filterrad() or 0.0) + if created_rgba_mask: + # Convert back to a masked greyscale array so + # colormapping works correctly + output = np.ma.masked_array( + output[..., 0], output[..., 3] < 0.5) + output = self.to_rgba(output, bytes=True, norm=False) - # Apply alpha *after* if the input was greyscale - if A.ndim == 2: + # Apply alpha *after* if the input was greyscale without a mask + if A.ndim == 2 or created_rgba_mask: alpha = self.get_alpha() if alpha is not None and alpha != 1.0: alpha_channel = output[:, :, 3] diff --git a/lib/matplotlib/tests/baseline_images/test_image/mask_image.pdf b/lib/matplotlib/tests/baseline_images/test_image/mask_image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..695b149f03dd71ea9def5cd8e2c4617c418eaab0 GIT binary patch literal 5879 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_image/rotate_image.png b/lib/matplotlib/tests/baseline_images/test_image/rotate_image.png index fd72f2a9bff169b5038b8082fb443289aeb0f5bf..cb1853ed179aa1c65c8e7a927fa8ff3e0d2d0c3f 100644 GIT binary patch literal 22559 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 Dw^VU6 literal 22564 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 F{{^n^jG_Pl diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 252c5248a68..6af9a5ef5f1 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -610,6 +610,25 @@ def test_image_preserve_size2(): np.identity(n, bool)[::-1]) +@image_comparison(baseline_images=['mask_image'], + remove_text=True) +def test_mask_image(): + # Test mask image two ways: Using nans and using a masked array. + + fig, (ax1, ax2) = plt.subplots(1, 2) + + A = np.ones((5, 5)) + A[1:2, 1:2] = np.nan + + ax1.imshow(A, interpolation='nearest') + + A = np.zeros((5, 5), dtype=np.bool) + A[1:2, 1:2] = True + A = np.ma.masked_array(np.ones((5, 5), dtype=np.uint16), A) + + ax2.imshow(A, interpolation='nearest') + + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) From 12044367855f3b447ab66613d2bfc221c4ae91c1 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Mar 2016 14:17:15 -0500 Subject: [PATCH 2/2] Fix image_masked.py example --- lib/matplotlib/image.py | 2 +- src/_image_resample.h | 29 +++++++++++++++++++++++++++++ src/_image_wrapper.cpp | 17 +++++++++++++++-- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index a14fc25979d..a29e62cc78a 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -365,7 +365,7 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, if A.dtype.kind == 'f': rgba[..., 3] = ~A.mask else: - rgba[..., 3] = np.where(A.mask, 0, np.iinfo(np.dtype).max) + rgba[..., 3] = np.where(A.mask, 0, np.iinfo(A.dtype).max) A = rgba output = np.zeros((out_height, out_width, 4), dtype=A.dtype) alpha = 1.0 diff --git a/src/_image_resample.h b/src/_image_resample.h index 3bf7aa182fb..cee102244f2 100644 --- a/src/_image_resample.h +++ b/src/_image_resample.h @@ -533,6 +533,35 @@ template <> class type_mapping }; +template <> class type_mapping +{ + public: + typedef agg::rgba16 color_type; + typedef fixed_blender_rgba_plain blender_type; + typedef fixed_blender_rgba_pre pre_blender_type; + typedef agg::pixfmt_alpha_blend_rgba pixfmt_type; + typedef agg::pixfmt_alpha_blend_rgba pixfmt_pre_type; + + template + struct span_gen_affine_type + { + typedef agg::span_image_resample_rgba_affine type; + }; + + template + struct span_gen_filter_type + { + typedef agg::span_image_filter_rgba type; + }; + + template + struct span_gen_nn_type + { + typedef agg::span_image_filter_rgba_nn type; + }; +}; + + template <> class type_mapping { public: diff --git a/src/_image_wrapper.cpp b/src/_image_wrapper.cpp index dac7c44e2ad..aac86bf9367 100644 --- a/src/_image_wrapper.cpp +++ b/src/_image_wrapper.cpp @@ -226,6 +226,19 @@ image_resample(PyObject *self, PyObject* args, PyObject *kwargs) params); Py_END_ALLOW_THREADS break; + case NPY_UINT16: + case NPY_INT16: + Py_BEGIN_ALLOW_THREADS + resample( + (agg::rgba16 *)PyArray_DATA(input_array), + PyArray_DIM(input_array, 1), + PyArray_DIM(input_array, 0), + (agg::rgba16 *)PyArray_DATA(output_array), + PyArray_DIM(output_array, 1), + PyArray_DIM(output_array, 0), + params); + Py_END_ALLOW_THREADS + break; case NPY_FLOAT32: Py_BEGIN_ALLOW_THREADS resample( @@ -254,13 +267,13 @@ image_resample(PyObject *self, PyObject* args, PyObject *kwargs) PyErr_SetString( PyExc_ValueError, "3-dimensional arrays must be of dtype unsigned byte, " - "float32 or float64"); + "unsigned short, float32 or float64"); goto error; } } else { PyErr_Format( PyExc_ValueError, - "If 3-dimensional, array must be RGBA. Got %d.", + "If 3-dimensional, array must be RGBA. Got %d planes.", PyArray_DIM(input_array, 2)); goto error; }