From 500b1c507ceabe21bbc4bb1e7e82ea7e48075755 Mon Sep 17 00:00:00 2001 From: Tony S Yu Date: Sun, 7 Oct 2012 15:33:03 -0400 Subject: [PATCH 1/3] ENH: Add grayscale support and color adjustment to visualize_boundaries --- skimage/segmentation/boundaries.py | 32 ++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/skimage/segmentation/boundaries.py b/skimage/segmentation/boundaries.py index b40ecb01..0d8be0f3 100644 --- a/skimage/segmentation/boundaries.py +++ b/skimage/segmentation/boundaries.py @@ -1,19 +1,39 @@ import numpy as np from ..morphology import dilation, square from ..util import img_as_float +from ..color import gray2rgb def find_boundaries(label_img): + """Return bool array where boundaries between labeled regions are True.""" boundaries = np.zeros(label_img.shape, dtype=np.bool) boundaries[1:, :] += label_img[1:, :] != label_img[:-1, :] boundaries[:, 1:] += label_img[:, 1:] != label_img[:, :-1] return boundaries -def visualize_boundaries(img, label_img): - img = img_as_float(img, force_copy=True) +def visualize_boundaries(image, label_img, color=(1, 1, 0), outline_color=None): + """Return image with boundaries between labeled regions highlighted. + + Parameters + ---------- + image : (M, N[, 3]) array + Grayscale or RGB image. + label_img : (M, N) array + Label array where regions are marked by different integer values. + color : length-3 sequence + RGB color of boundaries in the output image. + outline_color : length-3 sequence + RGB color surrounding boundaries in the output image. If None, no + outline is drawn. + """ + if image.ndim == 2: + image = gray2rgb(image) + image = img_as_float(image, force_copy=True) + boundaries = find_boundaries(label_img) - outer_boundaries = dilation(boundaries.astype(np.uint8), square(2)) - img[outer_boundaries != 0, :] = np.array([0, 0, 0]) # black - img[boundaries, :] = np.array([1, 1, 0]) # yellow - return img + if outline_color is not None: + outer_boundaries = dilation(boundaries.astype(np.uint8), square(2)) + image[outer_boundaries != 0, :] = np.array(outline_color) + image[boundaries, :] = np.array(color) + return image From 694ac11f930639e948080790626172a762d4a434 Mon Sep 17 00:00:00 2001 From: Tony S Yu Date: Sun, 7 Oct 2012 15:43:28 -0400 Subject: [PATCH 2/3] STY: Rename visualize_boundaries to highlight_boundaries Add @deprecated decorator to ease the transition. --- doc/examples/plot_segmentations.py | 10 +++---- skimage/_shared/utils.py | 43 ++++++++++++++++++++++++++++++ skimage/segmentation/__init__.py | 3 ++- skimage/segmentation/boundaries.py | 8 +++++- 4 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 skimage/_shared/utils.py diff --git a/doc/examples/plot_segmentations.py b/doc/examples/plot_segmentations.py index 99bfefcc..31dc38e7 100644 --- a/doc/examples/plot_segmentations.py +++ b/doc/examples/plot_segmentations.py @@ -63,8 +63,8 @@ import matplotlib.pyplot as plt import numpy as np from skimage.data import lena -from skimage.segmentation import felzenszwalb, \ - visualize_boundaries, slic, quickshift +from skimage.segmentation import felzenszwalb, slic, quickshift +from skimage.segmentation import highlight_boundaries from skimage.util import img_as_float img = img_as_float(lena()[::2, ::2]) @@ -80,11 +80,11 @@ fig, ax = plt.subplots(1, 3) fig.set_size_inches(8, 3, forward=True) plt.subplots_adjust(0.05, 0.05, 0.95, 0.95, 0.05, 0.05) -ax[0].imshow(visualize_boundaries(img, segments_fz)) +ax[0].imshow(highlight_boundaries(img, segments_fz)) ax[0].set_title("Felzenszwalbs's method") -ax[1].imshow(visualize_boundaries(img, segments_slic)) +ax[1].imshow(highlight_boundaries(img, segments_slic)) ax[1].set_title("SLIC") -ax[2].imshow(visualize_boundaries(img, segments_quick)) +ax[2].imshow(highlight_boundaries(img, segments_quick)) ax[2].set_title("Quickshift") for a in ax: a.set_xticks(()) diff --git a/skimage/_shared/utils.py b/skimage/_shared/utils.py new file mode 100644 index 00000000..4075ddb4 --- /dev/null +++ b/skimage/_shared/utils.py @@ -0,0 +1,43 @@ +import warnings +import functools + + +__all__ = ['deprecated'] + + +class deprecated(object): + """Decorator to mark deprecated functions with warning. + + Adapted from . + + Parameters + ---------- + alt_func : str + If given, tell user what function to use instead. + behavior : {'warn', 'raise'} + Behavior during call to deprecated function: 'warn' = warn user that + function is deprecated; 'raise' = raise error. + """ + + def __init__(self, alt_func=None, behavior='warn'): + self.alt_func = alt_func + self.behavior = behavior + + def __call__(self, func): + + msg = "Call to deprecated function `%s`." % func.__name__ + if self.alt_func is not None: + msg = msg + " Use `%s` instead." % self.alt_func + + @functools.wraps(func) + def wrapped(*args, **kwargs): + if self.behavior == 'warn': + warnings.warn_explicit(msg, + category=DeprecationWarning, + filename=func.func_code.co_filename, + lineno=func.func_code.co_firstlineno + 1) + elif self.behavior == 'raise': + raise DeprecationWarning(msg) + return func(*args, **kwargs) + + return wrapped diff --git a/skimage/segmentation/__init__.py b/skimage/segmentation/__init__.py index 9dca2bc3..ce0bfd84 100644 --- a/skimage/segmentation/__init__.py +++ b/skimage/segmentation/__init__.py @@ -2,5 +2,6 @@ from .random_walker_segmentation import random_walker from ._felzenszwalb import felzenszwalb from ._slic import slic from ._quickshift import quickshift -from .boundaries import find_boundaries, visualize_boundaries +from .boundaries import (find_boundaries, visualize_boundaries, + highlight_boundaries) from ._clear_border import clear_border diff --git a/skimage/segmentation/boundaries.py b/skimage/segmentation/boundaries.py index 0d8be0f3..d30a8627 100644 --- a/skimage/segmentation/boundaries.py +++ b/skimage/segmentation/boundaries.py @@ -2,6 +2,7 @@ import numpy as np from ..morphology import dilation, square from ..util import img_as_float from ..color import gray2rgb +from .._shared.utils import deprecated def find_boundaries(label_img): @@ -12,7 +13,7 @@ def find_boundaries(label_img): return boundaries -def visualize_boundaries(image, label_img, color=(1, 1, 0), outline_color=None): +def highlight_boundaries(image, label_img, color=(1, 1, 0), outline_color=None): """Return image with boundaries between labeled regions highlighted. Parameters @@ -37,3 +38,8 @@ def visualize_boundaries(image, label_img, color=(1, 1, 0), outline_color=None): image[outer_boundaries != 0, :] = np.array(outline_color) image[boundaries, :] = np.array(color) return image + + +@deprecated('highlight_boundaries') +def visualize_boundaries(*args, **kwargs): + return highlight_boundaries(*args, **kwargs) From ad53159d60ed05ebccb3e9d895ead21c9f3de7ad Mon Sep 17 00:00:00 2001 From: Tony S Yu Date: Sun, 7 Oct 2012 19:23:38 -0400 Subject: [PATCH 3/3] STY: Rename highlight_boundaries to mark_boundaries --- doc/examples/plot_segmentations.py | 8 ++++---- skimage/segmentation/__init__.py | 3 +-- skimage/segmentation/boundaries.py | 6 +++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/doc/examples/plot_segmentations.py b/doc/examples/plot_segmentations.py index 31dc38e7..418a0903 100644 --- a/doc/examples/plot_segmentations.py +++ b/doc/examples/plot_segmentations.py @@ -64,7 +64,7 @@ import numpy as np from skimage.data import lena from skimage.segmentation import felzenszwalb, slic, quickshift -from skimage.segmentation import highlight_boundaries +from skimage.segmentation import mark_boundaries from skimage.util import img_as_float img = img_as_float(lena()[::2, ::2]) @@ -80,11 +80,11 @@ fig, ax = plt.subplots(1, 3) fig.set_size_inches(8, 3, forward=True) plt.subplots_adjust(0.05, 0.05, 0.95, 0.95, 0.05, 0.05) -ax[0].imshow(highlight_boundaries(img, segments_fz)) +ax[0].imshow(mark_boundaries(img, segments_fz)) ax[0].set_title("Felzenszwalbs's method") -ax[1].imshow(highlight_boundaries(img, segments_slic)) +ax[1].imshow(mark_boundaries(img, segments_slic)) ax[1].set_title("SLIC") -ax[2].imshow(highlight_boundaries(img, segments_quick)) +ax[2].imshow(mark_boundaries(img, segments_quick)) ax[2].set_title("Quickshift") for a in ax: a.set_xticks(()) diff --git a/skimage/segmentation/__init__.py b/skimage/segmentation/__init__.py index ce0bfd84..7bd37026 100644 --- a/skimage/segmentation/__init__.py +++ b/skimage/segmentation/__init__.py @@ -2,6 +2,5 @@ from .random_walker_segmentation import random_walker from ._felzenszwalb import felzenszwalb from ._slic import slic from ._quickshift import quickshift -from .boundaries import (find_boundaries, visualize_boundaries, - highlight_boundaries) +from .boundaries import find_boundaries, visualize_boundaries, mark_boundaries from ._clear_border import clear_border diff --git a/skimage/segmentation/boundaries.py b/skimage/segmentation/boundaries.py index d30a8627..25656a9b 100644 --- a/skimage/segmentation/boundaries.py +++ b/skimage/segmentation/boundaries.py @@ -13,7 +13,7 @@ def find_boundaries(label_img): return boundaries -def highlight_boundaries(image, label_img, color=(1, 1, 0), outline_color=None): +def mark_boundaries(image, label_img, color=(1, 1, 0), outline_color=None): """Return image with boundaries between labeled regions highlighted. Parameters @@ -40,6 +40,6 @@ def highlight_boundaries(image, label_img, color=(1, 1, 0), outline_color=None): return image -@deprecated('highlight_boundaries') +@deprecated('mark_boundaries') def visualize_boundaries(*args, **kwargs): - return highlight_boundaries(*args, **kwargs) + return mark_boundaries(*args, **kwargs)