diff --git a/python/cucim/src/cucim/skimage/_vendored/_ndimage_filters.py b/python/cucim/src/cucim/skimage/_vendored/_ndimage_filters.py index 633371887..2ddfc8777 100644 --- a/python/cucim/src/cucim/skimage/_vendored/_ndimage_filters.py +++ b/python/cucim/src/cucim/skimage/_vendored/_ndimage_filters.py @@ -1106,6 +1106,9 @@ def _rank_filter(input, get_rank, size=None, footprint=None, output=None, sizes = footprint.shape has_weights = False + if not has_weights: + footprint = None + rank = get_rank(filter_size) if rank < 0 or rank >= filter_size: raise RuntimeError('rank not within filter footprint size') @@ -1126,7 +1129,7 @@ def _rank_filter(input, get_rank, size=None, footprint=None, output=None, kernel = _get_rank_kernel(filter_size, rank, mode, footprint_shape, offsets, float(cval), int_type, has_weights=has_weights) - return _filters_core._call_kernel(kernel, input, None, output, + return _filters_core._call_kernel(kernel, input, footprint, output, weights_dtype=bool) diff --git a/python/cucim/src/cucim/skimage/filters/tests/test_median.py b/python/cucim/src/cucim/skimage/filters/tests/test_median.py index c510aba20..324ee27c5 100644 --- a/python/cucim/src/cucim/skimage/filters/tests/test_median.py +++ b/python/cucim/src/cucim/skimage/filters/tests/test_median.py @@ -4,6 +4,7 @@ from cupyx.scipy import ndimage from skimage import data +from cucim.skimage import morphology from cucim.skimage._shared.testing import expected_warnings from cucim.skimage.filters import median @@ -249,3 +250,17 @@ def test_median_preserve_dtype(image, dtype): ) def test_median(img, behavior): median(img, behavior=behavior) + + +def test_median_nonsquare(): + """Test non-uniform footprint. + + https://github.com/rapidsai/cucim/issues/520 + """ + rng = cp.random.default_rng() + img = rng.integers(0, 256, (128, 128), dtype=cp.uint8) + footprint = morphology.disk(5) + mode = 'nearest' + out = median(img, footprint, mode=mode, behavior='ndimage') + expected = ndimage.median_filter(img, footprint=footprint, mode=mode) + cp.testing.assert_array_equal(out, expected)