Move label to measure module (with deprecation). Warn that background parameter will default to 0 in v0.12.

This commit is contained in:
Stefan van der Walt
2014-05-27 21:15:35 -04:00
committed by Johannes Schönberger
parent e50d1b801f
commit e182931f15
6 changed files with 53 additions and 24 deletions
+9
View File
@@ -1,3 +1,12 @@
Remember to list any API changes below in `doc/source/api_changes.txt`.
Version 0.12
------------
- Change `label` to mark background as 0, not -1, which is consistent with
SciPy's labelling.
- Remove `skimage.morphology.label` from `skimage.morphology.__init__`--it now
lives in `skimage.measure.label`.
Version 0.11
------------
* Remove deprecated `reverse_map` parameter of `skimage.transform.warp`
-1
View File
@@ -24,4 +24,3 @@ Version 0.3
- Remove ``as_grey``, ``dtype`` keyword from ImageCollection
- Remove ``dtype`` from imread
- Generalise ImageCollection to accept a load_func
+3 -1
View File
@@ -8,6 +8,7 @@ from ._moments import moments, moments_central, moments_normalized, moments_hu
from .profile import profile_line
from .fit import LineModel, CircleModel, EllipseModel, ransac
from .block import block_reduce
from ..morphology.ccomp import label
__all__ = ['find_contours',
@@ -28,4 +29,5 @@ __all__ = ['find_contours',
'marching_cubes',
'mesh_surface_area',
'correct_mesh_orientation',
'profile_line']
'profile_line',
'label']
+1 -2
View File
@@ -4,14 +4,13 @@ from .grey import (erosion, dilation, opening, closing, white_tophat,
black_tophat)
from .selem import (square, rectangle, diamond, disk, cube, octahedron, ball,
octagon, star)
from .ccomp import label
from ._label import label
from .watershed import watershed
from ._skeletonize import skeletonize, medial_axis
from .convex_hull import convex_hull_image, convex_hull_object
from .greyreconstruct import reconstruction
from .misc import remove_small_objects
__all__ = ['binary_erosion',
'binary_dilation',
'binary_opening',
+20 -6
View File
@@ -4,6 +4,7 @@
#cython: wraparound=False
import numpy as np
import warnings
cimport numpy as cnp
@@ -82,7 +83,7 @@ cdef inline void link_bg(DTYPE_t *forest, DTYPE_t n, DTYPE_t *background_node):
# Connected components search as described in Fiorio et al.
def label(input, DTYPE_t neighbors=8, DTYPE_t background=-1, return_num=False):
def label(input, DTYPE_t neighbors=8, background=None, return_num=False):
"""Label connected regions of an integer array.
Two pixels are connected when they are neighbors and have the same value.
@@ -104,7 +105,10 @@ def label(input, DTYPE_t neighbors=8, DTYPE_t background=-1, return_num=False):
Whether to use 4- or 8-connectivity.
background : int
Consider all pixels with this value as background pixels, and label
them as -1.
them as -1. (Note: background pixels will be labeled as 0 starting with
version 0.12).
return_num : bool
Whether to return the number of assigned labels.
Returns
-------
@@ -157,17 +161,27 @@ def label(input, DTYPE_t neighbors=8, DTYPE_t background=-1, return_num=False):
cdef DTYPE_t i, j
cdef DTYPE_t background_val
if background is None:
background_val = -1
warnings.warn(DeprecationWarning(
'The default value for `background` will change to 0 in v0.12'
))
else:
background_val = background
cdef DTYPE_t background_node = -999
if neighbors != 4 and neighbors != 8:
raise ValueError('Neighbors must be either 4 or 8.')
# Initialize the first row
if data[0, 0] == background:
if data[0, 0] == background_val:
link_bg(forest_p, 0, &background_node)
for j in range(1, cols):
if data[0, j] == background:
if data[0, j] == background_val:
link_bg(forest_p, j, &background_node)
if data[0, j] == data[0, j-1]:
@@ -175,7 +189,7 @@ def label(input, DTYPE_t neighbors=8, DTYPE_t background=-1, return_num=False):
for i in range(1, rows):
# Handle the first column
if data[i, 0] == background:
if data[i, 0] == background_val:
link_bg(forest_p, i * cols, &background_node)
if data[i, 0] == data[i-1, 0]:
@@ -186,7 +200,7 @@ def label(input, DTYPE_t neighbors=8, DTYPE_t background=-1, return_num=False):
join_trees(forest_p, i*cols, (i-1)*cols + 1)
for j in range(1, cols):
if data[i, j] == background:
if data[i, j] == background_val:
link_bg(forest_p, i * cols + j, &background_node)
if neighbors == 8:
+20 -14
View File
@@ -2,7 +2,7 @@ import numpy as np
from numpy.testing import assert_array_equal, run_module_suite
from skimage.morphology import label
from warnings import catch_warnings
class TestConnectedComponents:
def setup(self):
@@ -25,7 +25,9 @@ class TestConnectedComponents:
def test_random(self):
x = (np.random.random((20, 30)) * 5).astype(np.int)
labels = label(x)
with catch_warnings(DeprecationWarning):
labels = label(x)
n = labels.max()
for i in range(n):
values = x[labels == i]
@@ -35,27 +37,29 @@ class TestConnectedComponents:
x = np.array([[0, 0, 1],
[0, 1, 0],
[1, 0, 0]])
assert_array_equal(label(x),
x)
with catch_warnings(DeprecationWarning):
assert_array_equal(label(x), x)
def test_4_vs_8(self):
x = np.array([[0, 1],
[1, 0]], dtype=int)
assert_array_equal(label(x, 4),
[[0, 1],
[2, 3]])
assert_array_equal(label(x, 8),
[[0, 1],
[1, 0]])
with catch_warnings(DeprecationWarning):
assert_array_equal(label(x, 4),
[[0, 1],
[2, 3]])
assert_array_equal(label(x, 8),
[[0, 1],
[1, 0]])
def test_background(self):
x = np.array([[1, 0, 0],
[1, 1, 5],
[0, 0, 0]])
assert_array_equal(label(x), [[0, 1, 1],
[0, 0, 2],
[3, 3, 3]])
with catch_warnings(DeprecationWarning):
assert_array_equal(label(x), [[0, 1, 1],
[0, 0, 2],
[3, 3, 3]])
assert_array_equal(label(x, background=0),
[[0, -1, -1],
@@ -87,7 +91,9 @@ class TestConnectedComponents:
[0, 0, 6],
[5, 5, 5]])
assert_array_equal(label(x, return_num=True)[1], 4)
with catch_warnings(DeprecationWarning):
assert_array_equal(label(x, return_num=True)[1], 4)
assert_array_equal(label(x, background=0, return_num=True)[1], 3)