From bb51f62f93f347487edb71e0fcc518e80cf1a840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Sch=C3=B6nberger?= Date: Thu, 16 Aug 2012 22:35:04 +0200 Subject: [PATCH] Add function to clear border in binary images --- skimage/morphology/_clear_border.py | 36 +++++++++++++++++++ skimage/morphology/tests/test_clear_border.py | 32 +++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 skimage/morphology/_clear_border.py create mode 100644 skimage/morphology/tests/test_clear_border.py diff --git a/skimage/morphology/_clear_border.py b/skimage/morphology/_clear_border.py new file mode 100644 index 00000000..4185b0d9 --- /dev/null +++ b/skimage/morphology/_clear_border.py @@ -0,0 +1,36 @@ +import numpy as np +from skimage.measure import regionprops +from skimage.morphology import label + + +def clear_border(image, buffer_size=0, bgval=0): + """Clear objects connected to image border. + + The changes will be applied to the input image. + + Parameters + ---------- + image : (N, M) array + binary image + buffer_size : int, optional + define additional buffer around image border + bgval : float or int, optional + value for cleared objects + + Returns + ------- + image : (N, M) array + cleared binary image + """ + rows, cols = image.shape + for prop in regionprops(label(image), ['BoundingBox', 'Image']): + minr, minc, maxr, maxc = prop['BoundingBox'] + if ( + minr <= buffer_size + or minc <= buffer_size + or maxr >= rows - buffer_size + or maxc >= cols - buffer_size + ): + r, c = np.nonzero(prop['Image']) + image[minr + r, minc + c] = bgval + return image diff --git a/skimage/morphology/tests/test_clear_border.py b/skimage/morphology/tests/test_clear_border.py new file mode 100644 index 00000000..c4cdd4af --- /dev/null +++ b/skimage/morphology/tests/test_clear_border.py @@ -0,0 +1,32 @@ +import numpy as np +from numpy.testing import assert_array_equal, assert_equal +from skimage.morphology import clear_border + + +def test_possible_hull(): + image = np.array( + [[0, 0, 0, 0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 1, 0, 0, 0, 0], + [1, 0, 0, 1, 0, 1, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 1, 0, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0]]) + + # test default case + result = clear_border(image.copy()) + ref = image.copy() + ref[2, 0] = 0 + ref[0, -2] = 0 + assert_array_equal(result, ref) + + # test buffer + result = clear_border(image.copy(), 1) + assert_array_equal(result, np.zeros(result.shape)) + + # test background value + result = clear_border(image.copy(), 1, 2) + assert_array_equal(result, 2 * image) + + +if __name__ == "__main__": + np.testing.run_module_suite()