From 6c9810c6e9fd5105b70271108f494448bd6e7da5 Mon Sep 17 00:00:00 2001 From: Tony S Yu Date: Mon, 3 Sep 2012 22:50:57 -0400 Subject: [PATCH] Refactor masking --- skimage/filter/edges.py | 50 ++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/skimage/filter/edges.py b/skimage/filter/edges.py index ac27802f..1568886c 100644 --- a/skimage/filter/edges.py +++ b/skimage/filter/edges.py @@ -13,6 +13,24 @@ from skimage import img_as_float from scipy.ndimage import convolve, binary_erosion, generate_binary_structure +EROSION_SELEM = generate_binary_structure(2, 2) + + +def _mask_filter_result(result, mask): + """Return result after masking. + + Input masks are eroded so that mask areas in the original image don't + affect values in the result. + """ + if mask is None: + mask = np.zeros(result.shape, bool) + mask[1:-1, 1:-1] = True + else: + mask = binary_erosion(mask, EROSION_SELEM, border_value=0) + result[mask == False] = 0 + return result + + def sobel(image, mask=None): """Calculate the absolute magnitude Sobel to find edges. @@ -70,17 +88,11 @@ def hsobel(image, mask=None): """ image = img_as_float(image) - if mask is None: - mask = np.ones(image.shape, bool) - big_mask = binary_erosion(mask, - generate_binary_structure(2, 2), - border_value=0) result = np.abs(convolve(image, np.array([[ 1, 2, 1], [ 0, 0, 0], [-1,-2,-1]]).astype(float) / 4.0)) - result[big_mask == False] = 0 - return result + return _mask_filter_result(result, mask) def vsobel(image, mask=None): @@ -111,17 +123,11 @@ def vsobel(image, mask=None): """ image = img_as_float(image) - if mask is None: - mask = np.ones(image.shape, bool) - big_mask = binary_erosion(mask, - generate_binary_structure(2, 2), - border_value=0) result = np.abs(convolve(image, np.array([[1, 0, -1], [2, 0, -2], [1, 0, -1]]).astype(float) / 4.0)) - result[big_mask == False] = 0 - return result + return _mask_filter_result(result, mask) def prewitt(image, mask=None): @@ -177,17 +183,11 @@ def hprewitt(image, mask=None): """ image = img_as_float(image) - if mask is None: - mask = np.ones(image.shape, bool) - big_mask = binary_erosion(mask, - generate_binary_structure(2, 2), - border_value=0) result = np.abs(convolve(image, np.array([[ 1, 1, 1], [ 0, 0, 0], [-1,-1,-1]]).astype(float) / 3.0)) - result[big_mask == False] = 0 - return result + return _mask_filter_result(result, mask) def vprewitt(image, mask=None): @@ -218,14 +218,8 @@ def vprewitt(image, mask=None): """ image = img_as_float(image) - if mask is None: - mask = np.ones(image.shape, bool) - big_mask = binary_erosion(mask, - generate_binary_structure(2, 2), - border_value=0) result = np.abs(convolve(image, np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]]).astype(float) / 3.0)) - result[big_mask == False] = 0 - return result + return _mask_filter_result(result, mask)