Subsections
16.4 Morphology
16.4.1 Binary morphology
- generate_binary_structure(rank, connectivity)
-
The generate_binary_structure functions generates a binary
structuring element for use in binary morphology operations. The rank
of the structure must be provided. The size of the structure that is returned
is equal to three in each direction. The value of each element is equal to
one if the square of the Euclidian distance from the element to the center is
less or equal to connectivity. For instance, two dimensional
4-connected and 8-connected structures are generated as follows:
>>> print generate_binary_structure(2, 1)
[[0 1 0]
[1 1 1]
[0 1 0]]
>>> print generate_binary_structure(2, 2)
[[1 1 1]
[1 1 1]
[1 1 1]]
Most binary morphology functions can be expressed in terms of the basic
operations erosion and dilation:
- binary_erosion(input, structure=None, iterations=1,
mask=None, output=None, border_value=0, origin=0)
- The
binary_erosion function implements binary erosion of arrays of
arbitrary rank with the given structuring element. The origin parameter
controls the placement of the structuring element as described in section
16.2. If no structuring element is provided, an
element with connectivity equal to one is generated using
generate_binary_structure. The border_value parameter gives
the value of the array outside boundaries. The erosion is repeated
iterations times. If iterations is less than one, the erosion is
repeated until the result does not change anymore. If a mask array is
given, only those elements with a true value at the corresponding mask
element are modified at each iteration.
- binary_dilation(input, structure=None, iterations=1,
mask=None, output=None, border_value=0, origin=0)
- The
binary_dilation function implements binary dilation of arrays of
arbritrary rank with the given structuring element. The origin parameter
controls the placement of the structuring element as described in section
16.2. If no structuring element is provided, an
element with connectivity equal to one is generated using
generate_binary_structure. The border_value parameter gives
the value of the array outside boundaries. The dilation is repeated
iterations times. If iterations is less than one, the dilation
is repeated until the result does not change anymore. If a mask array
is given, only those elements with a true value at the corresponding mask
element are modified at each iteration.
Here is an example of using binary_dilation to find all elements
that touch the border, by repeatedly dilating an empty array from the border
using the data array as the mask:
>>> struct = array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
>>> a = array([[1,0,0,0,0], [1,1,0,1,0], [0,0,1,1,0], [0,0,0,0,0]])
>>> print a
[[1 0 0 0 0]
[1 1 0 1 0]
[0 0 1 1 0]
[0 0 0 0 0]]
>>> print binary_dilation(zeros(a.shape), struct, -1, a, border_value=1)
[[1 0 0 0 0]
[1 1 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
The binary_erosion and binary_dilation functions both
have an iterations parameter which allows the erosion or dilation to be
repeated a number of times. Repeating an erosion of a dilation with a given
structure times is equivalent to an erosions or a dilation with a structure
that is times dilated with itself. For a low number of iterations this
is more efficient, and for this reason a function is provided that allows the
calculation of a structure that is dilated a number of times with itself:
- iterate_structure(structure, iterations, origin=None)
-
The iterate_structure function returns a structure by dilation of
the input structure iteration - 1 times with itself. For instance:
>>> struct = generate_binary_structure(2, 1)
>>> print struct
[[0 1 0]
[1 1 1]
[0 1 0]]
>>> print iterate_structure(struct, 2)
[[0 0 1 0 0]
[0 1 1 1 0]
[1 1 1 1 1]
[0 1 1 1 0]
[0 0 1 0 0]]
If the origin of the original structure is equal to 0, then it is also equal
to 0 for the iterated structure. If not, the origin must also be adapted if
the equivalent of the iterations erosions of dilations must be achieved
with the iterated structure. The adapted origin is simply obtained by
multiplying with the number of iterations. For convenience the
iterate_structure also returns the adapted origin if the
origin parameter is not None:
>>> print iterate_structure(struct, 2, -1)
(array([[0, 0, 1, 0, 0],
[0, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[0, 0, 1, 0, 0]], type=Bool), [-2, -2])
Other morphology operations can be defined in terms of erosion and dilation.
Following functions provide a few of these operations for convenience:
- binary_opening(input, structure=None, iterations=1,
output=None, origin=0)
- The binary_opening function implements
binary opening of arrays of arbitrary rank with the given structuring
element. Binary opening is equivalent to a binary erosion followed by a
binary dilation with the same structuring element. The origin parameter
controls the placement of the structuring element as described in section
16.2. If no structuring element is provided, an
element with connectivity equal to one is generated using
generate_binary_structure. The iterations parameter gives
the number of erosions that is performed followed by the same number of
dilations.
- binary_closing(input, structure=None, iterations=1,
output=None, origin=0)
- The binary_closing function implements
binary closing of arrays of arbitrary rank with the given structuring
element. Binary closing is equivalent to a binary dilation followed by a
binary erosion with the same structuring element. The origin parameter
controls the placement of the structuring element as described in section
16.2. If no structuring element is provided, an
element with connectivity equal to one is generated using
generate_binary_structure. The iterations parameter gives
the number of dilations that is performed followed by the same number of
erosions.
- binary_hit_or_miss(input, structure1=None, structure2=None,
output=None, origin1=0, origin2=None)
- The binary_hit_or_miss
function implements a binary hit-or-miss transform of arrays of arbitrary
rank with the given structuring elements. The hit-or-miss transform is
calculated by erosion of the input with the first structure, erosion of the
logical not of the input with the second structure, followed by the
logical and of these two erosions. The origin parameters control the
placement of the structuring elements as described in section
16.2. If origin2 equals None
it is set equal to the origin1 parameter. If the first structuring
element is not provided, a structuring element with connectivity equal to one
is generated using generate_binary_structure, if structure2
is not provided, it is set equal to the logical not of
structure1.
16.4.2 Grey-scale morphology
Grey-scale morphology operations are the equivalents of binary morphology
operations that operate on arrays with arbritrary values. Below we describe the
grey-scale equivalents of erosion, dilation, opening and closing. These
operations are implemented in a similar fashion as the filters described in
section 16.2, and we refer to this section for
the description of filter kernels and footprints, and the handling of array
borders. The grey-scale morphology operations optionally take a structure
parameter that gives the values of the structuring element. If this parameter
is not given the structuring element is assumed to be flat with a value equal
to zero. The shape of the structure can optionally be defined by the
footprint parameter. If this parameter is not given, the structure is
assumed to be rectangular, with sizes equal to the dimensions of the
structure array, or by the size parameter if structure is not
given. The size parameter is only used if both structure and
footprint are not given, in which case the structuring element is assumed
to be rectangular and flat with the dimensions given by size. The
size parameter, if provided, must be a sequence of sizes or a single
number in which case the size of the filter is assumed to be equal along each
axis. The footprint parameter, if provided, must be an array that defines
the shape of the kernel by its non-zero elements.
Similar to binary erosion and dilation there are operations for grey-scale
erosion and dilation:
- grey_erosion(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
grey_erosion function calculates a multi-dimensional grey-scale
erosion.
- grey_dilation(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
grey_dilation function calculates a multi-dimensional grey-scale
dilation.
Grey-scale opening and closing operations can be defined similar to their
binary counterparts:
- grey_opening(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
grey_opening function implements grey-scale opening of arrays of
arbitrary rank. Grey-scale opening is equivalent to a grey-scale erosion
followed by a grey-scale dilation.
- grey_closing(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
grey_closing function implements grey-scale closing of arrays of
arbitrary rank. Grey-scale opening is equivalent to a grey-scale dilation
followed by a grey-scale erosion.
- morphological_gradient(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
morphological_gradient function implements a grey-scale
morphological gradient of arrays of arbitrary rank. The grey-scale
morphological gradient is equal to the difference of a grey-scale dilation
and a grey-scale erosion.
- morphological_laplace(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
morphological_laplace function implements a grey-scale
morphological laplace of arrays of arbitrary rank. The grey-scale
morphological laplace is equal to the sum of a grey-scale dilation and a
grey-scale erosion minus twice the input.
- white_tophat(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
white_tophat function implements a white top-hat filter of arrays
of arbitrary rank. The white top-hat is equal to the difference of the input
and a grey-scale opening.
- black_tophat(input, size=None, footprint=None,
structure=None, output=None, mode='nearest', cval=0.0, origin=0)
- The
black_tophat function implements a black top-hat filter of arrays
of arbitrary rank. The black top-hat is equal to the difference of the a
grey-scale closing and the input.
Send comments to the NumArray community.