From b0437045ed539826757cbb6b5c4daf963b0018d2 Mon Sep 17 00:00:00 2001 From: emmanuelle Date: Wed, 15 Jun 2016 09:23:12 +0200 Subject: [PATCH 1/5] Added default value to gaussian filter (sigma parameter) --- skimage/filters/_gaussian.py | 4 ++-- skimage/filters/tests/test_gaussian.py | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/skimage/filters/_gaussian.py b/skimage/filters/_gaussian.py index 2a455fe9..d94c8942 100644 --- a/skimage/filters/_gaussian.py +++ b/skimage/filters/_gaussian.py @@ -9,7 +9,7 @@ from .._shared.utils import warn __all__ = ['gaussian'] -def gaussian(image, sigma, output=None, mode='nearest', cval=0, +def gaussian(image, sigma=1, output=None, mode='nearest', cval=0, multichannel=None): """Multi-dimensional Gaussian filter @@ -17,7 +17,7 @@ def gaussian(image, sigma, output=None, mode='nearest', cval=0, ---------- image : array-like input image (grayscale or color) to filter. - sigma : scalar or sequence of scalars + sigma : scalar or sequence of scalars, optional standard deviation for Gaussian kernel. The standard deviations of the Gaussian filter are given for each axis as a sequence, or as a single number, in which case it is equal for diff --git a/skimage/filters/tests/test_gaussian.py b/skimage/filters/tests/test_gaussian.py index 2d78ce6c..da69fab0 100644 --- a/skimage/filters/tests/test_gaussian.py +++ b/skimage/filters/tests/test_gaussian.py @@ -19,6 +19,12 @@ def test_null_sigma(): assert np.all(gaussian(a, 0) == a) +def test_default_sigma(): + a = np.zeros((3, 3)) + a[1, 1] = 1. + assert np.all(gaussian(a) == gaussian(a, sigma=1)) + + def test_energy_decrease(): a = np.zeros((3, 3)) a[1, 1] = 1. From c8b13f4825871cc46c33c60380f293d501bdd25f Mon Sep 17 00:00:00 2001 From: emmanuelle Date: Wed, 15 Jun 2016 12:13:25 +0200 Subject: [PATCH 2/5] Added default value for the structuring element of median filter --- skimage/filters/rank/generic.py | 39 ++++++++++++++++++++++--- skimage/filters/rank/tests/test_rank.py | 9 ++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/skimage/filters/rank/generic.py b/skimage/filters/rank/generic.py index 998796c6..f2bc0405 100644 --- a/skimage/filters/rank/generic.py +++ b/skimage/filters/rank/generic.py @@ -48,7 +48,9 @@ References """ +import functools import numpy as np +from scipy import ndimage as ndi from ... import img_as_ubyte from ..._shared.utils import assert_nD, warn @@ -127,6 +129,30 @@ def _apply_vector_per_pixel(func, image, selem, out, mask, shift_x, shift_y, return out +def default_selem(func): + """Decorator to add a default structuring element to morphology functions. + + Parameters + ---------- + func : function + A morphology function such as erosion, dilation, opening, closing, + white_tophat, or black_tophat. + + Returns + ------- + func_out : function + The function, using a default structuring element of same dimension + as the input image with connectivity 1. + """ + @functools.wraps(func) + def func_out(image, selem=None, *args, **kwargs): + if selem is None: + selem = ndi.generate_binary_structure(image.ndim, image.ndim) + return func(image, selem=selem, *args, **kwargs) + + return func_out + + def autolevel(image, selem, out=None, mask=None, shift_x=False, shift_y=False): """Auto-level image using local histogram. @@ -374,7 +400,9 @@ def mean(image, selem, out=None, mask=None, shift_x=False, shift_y=False): return _apply_scalar_per_pixel(generic_cy._mean, image, selem, out=out, mask=mask, shift_x=shift_x, shift_y=shift_y) -def geometric_mean(image, selem, out=None, mask=None, shift_x=False, shift_y=False): + +def geometric_mean(image, selem, out=None, mask=None, + shift_x=False, shift_y=False): """Return local geometric mean of an image. Parameters @@ -457,15 +485,18 @@ def subtract_mean(image, selem, out=None, mask=None, shift_x=False, shift_x=shift_x, shift_y=shift_y) -def median(image, selem, out=None, mask=None, shift_x=False, shift_y=False): +@default_selem +def median(image, selem=None, out=None, mask=None, + shift_x=False, shift_y=False): """Return local median of an image. Parameters ---------- image : 2-D array (uint8, uint16) Input image. - selem : 2-D array - The neighborhood expressed as a 2-D array of 1's and 0's. + selem : 2-D array, optional + The neighborhood expressed as a 2-D array of 1's and 0's. If None, a + square (or cube in 3-D) of size 3 is used. out : 2-D array (same dtype as input) If None, a new array is allocated. mask : ndarray diff --git a/skimage/filters/rank/tests/test_rank.py b/skimage/filters/rank/tests/test_rank.py index 3fcc79ac..200e20e3 100644 --- a/skimage/filters/rank/tests/test_rank.py +++ b/skimage/filters/rank/tests/test_rank.py @@ -713,5 +713,14 @@ def test_windowed_histogram(): assert larger_output.shape[2] == 5 +def test_median_default_value(): + a = np.zeros((3, 3), dtype=np.uint8) + a[1] = 1 + full_selem = np.ones((3, 3), dtype=np.uint8) + assert_equal(rank.median(a), rank.median(a, full_selem)) + assert rank.median(a)[1, 1] == 0 + assert rank.median(a, disk(1))[1, 1] == 1 + + if __name__ == "__main__": run_module_suite() From cc40e0c37a82ddf5fd58693d3462334e282ebee4 Mon Sep 17 00:00:00 2001 From: emmanuelle Date: Wed, 15 Jun 2016 12:21:52 +0200 Subject: [PATCH 3/5] Documented the API change of gaussian and median. --- doc/source/api_changes.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/source/api_changes.rst b/doc/source/api_changes.rst index 50fed4f8..824762e0 100644 --- a/doc/source/api_changes.rst +++ b/doc/source/api_changes.rst @@ -6,6 +6,9 @@ Version 0.13 - Deprecated filters `hsobel`, `vsobel`, `hscharr`, `vscharr`, `hprewitt`, `vprewitt`, `roberts_positive_diagonal`, `roberts_negative_diagonal` have been removed from `skimage.filters.edges`. +- The `sigma` parameter of `skimage.filters.gaussian` and the `selem` parameter + of `skimage.filters.median` have been made optional, with default + values. Version 0.12 ------------ From a6f3bfef6f472c83345084678b930b9b44e16a31 Mon Sep 17 00:00:00 2001 From: emmanuelle Date: Sat, 18 Jun 2016 12:24:36 +0200 Subject: [PATCH 4/5] Corrected docstring of default structuring element for median filter. --- skimage/filters/rank/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skimage/filters/rank/generic.py b/skimage/filters/rank/generic.py index f2bc0405..75ccc524 100644 --- a/skimage/filters/rank/generic.py +++ b/skimage/filters/rank/generic.py @@ -496,7 +496,7 @@ def median(image, selem=None, out=None, mask=None, Input image. selem : 2-D array, optional The neighborhood expressed as a 2-D array of 1's and 0's. If None, a - square (or cube in 3-D) of size 3 is used. + full square of size 3 is used. out : 2-D array (same dtype as input) If None, a new array is allocated. mask : ndarray From 2319119b31870db8d7e64f010b4cd9f9c636a07f Mon Sep 17 00:00:00 2001 From: emmanuelle Date: Sat, 18 Jun 2016 15:03:55 +0200 Subject: [PATCH 5/5] Minor improvements --- skimage/filters/_gaussian.py | 4 ++-- skimage/filters/rank/generic.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/skimage/filters/_gaussian.py b/skimage/filters/_gaussian.py index d94c8942..9eb3fcf5 100644 --- a/skimage/filters/_gaussian.py +++ b/skimage/filters/_gaussian.py @@ -16,9 +16,9 @@ def gaussian(image, sigma=1, output=None, mode='nearest', cval=0, Parameters ---------- image : array-like - input image (grayscale or color) to filter. + Input image (grayscale or color) to filter. sigma : scalar or sequence of scalars, optional - standard deviation for Gaussian kernel. The standard + Standard deviation for Gaussian kernel. The standard deviations of the Gaussian filter are given for each axis as a sequence, or as a single number, in which case it is equal for all axes. diff --git a/skimage/filters/rank/generic.py b/skimage/filters/rank/generic.py index 75ccc524..83b8fbc2 100644 --- a/skimage/filters/rank/generic.py +++ b/skimage/filters/rank/generic.py @@ -129,7 +129,7 @@ def _apply_vector_per_pixel(func, image, selem, out, mask, shift_x, shift_y, return out -def default_selem(func): +def _default_selem(func): """Decorator to add a default structuring element to morphology functions. Parameters @@ -485,7 +485,7 @@ def subtract_mean(image, selem, out=None, mask=None, shift_x=False, shift_x=shift_x, shift_y=shift_y) -@default_selem +@_default_selem def median(image, selem=None, out=None, mask=None, shift_x=False, shift_y=False): """Return local median of an image.