File: C:/Users/fred/anaconda3/Lib/site-packages/skimage/morphology/tests/test_util.py
"""Tests for `_util`."""
import numpy as np
import pytest
from numpy.testing import assert_array_equal
from skimage.morphology import _util
@pytest.mark.parametrize("image_shape", [(111,), (33, 44), (22, 55, 11), (6, 5, 4, 3)])
@pytest.mark.parametrize("order", ["C", "F"])
def test_offsets_to_raveled_neighbors_highest_connectivity(image_shape, order):
"""
Check scenarios where footprint is always of the highest connectivity
and all dimensions are > 2.
"""
footprint = np.ones((3,) * len(image_shape), dtype=bool)
center = (1,) * len(image_shape)
offsets = _util._offsets_to_raveled_neighbors(image_shape, footprint, center, order)
# Assert only neighbors are present, center was removed
assert len(offsets) == footprint.sum() - 1
assert 0 not in offsets
# Assert uniqueness
assert len(set(offsets)) == offsets.size
# offsets form pairs of with same value but different signs
# if footprint is symmetric around center
assert all(-x in offsets for x in offsets)
# Construct image whose values are the Manhattan distance to its center
image_center = tuple(s // 2 for s in image_shape)
coords = [
np.abs(np.arange(s, dtype=np.intp) - c)
for s, c in zip(image_shape, image_center)
]
grid = np.meshgrid(*coords, indexing="ij")
image = np.sum(grid, axis=0)
image_raveled = image.ravel(order)
image_center_raveled = np.ravel_multi_index(image_center, image_shape, order=order)
# Sample raveled image around its center
samples = []
for offset in offsets:
index = image_center_raveled + offset
samples.append(image_raveled[index])
# Assert that center with value 0 wasn't selected
assert np.min(samples) == 1
# Assert that only neighbors where selected
# (highest value == connectivity)
assert np.max(samples) == len(image_shape)
# Assert that nearest neighbors are selected first
assert list(sorted(samples)) == samples
@pytest.mark.parametrize(
"image_shape", [(2,), (2, 2), (2, 1, 2), (2, 2, 1, 2), (0, 2, 1, 2)]
)
@pytest.mark.parametrize("order", ["C", "F"])
def test_offsets_to_raveled_neighbors_footprint_smaller_image(image_shape, order):
"""
Test if a dimension indicated by `image_shape` is smaller than in
`footprint`.
"""
footprint = np.ones((3,) * len(image_shape), dtype=bool)
center = (1,) * len(image_shape)
offsets = _util._offsets_to_raveled_neighbors(image_shape, footprint, center, order)
# Assert only neighbors are present, center and duplicates (possible
# for this scenario) where removed
assert len(offsets) <= footprint.sum() - 1
assert 0 not in offsets
# Assert uniqueness
assert len(set(offsets)) == offsets.size
# offsets form pairs of with same value but different signs
# if footprint is symmetric around center
assert all(-x in offsets for x in offsets)
def test_offsets_to_raveled_neighbors_explicit_0():
"""Check reviewed example."""
image_shape = (100, 200, 3)
footprint = np.ones((3, 3, 3), dtype=bool)
center = (1, 1, 1)
offsets = _util._offsets_to_raveled_neighbors(image_shape, footprint, center)
desired = np.array(
[
-600,
-3,
-1,
1,
3,
600,
-603,
-601,
-599,
-597,
-4,
-2,
2,
4,
597,
599,
601,
603,
-604,
-602,
-598,
-596,
596,
598,
602,
604,
]
)
assert_array_equal(offsets, desired)
def test_offsets_to_raveled_neighbors_explicit_1():
"""Check reviewed example where footprint is larger in last dimension."""
image_shape = (10, 9, 8, 3)
footprint = np.ones((3, 3, 3, 4), dtype=bool)
center = (1, 1, 1, 1)
offsets = _util._offsets_to_raveled_neighbors(image_shape, footprint, center)
desired = np.array(
[
-216,
-24,
-3,
-1,
1,
3,
24,
216,
-240,
-219,
-217,
-215,
-213,
-192,
-27,
-25,
-23,
-21,
-4,
-2,
2,
4,
21,
23,
25,
27,
192,
213,
215,
217,
219,
240,
-243,
-241,
-239,
-237,
-220,
-218,
-214,
-212,
-195,
-193,
-191,
-189,
-28,
-26,
-22,
-20,
20,
22,
26,
28,
189,
191,
193,
195,
212,
214,
218,
220,
237,
239,
241,
243,
-244,
-242,
-238,
-236,
-196,
-194,
-190,
-188,
188,
190,
194,
196,
236,
238,
242,
244,
5,
-211,
-19,
29,
221,
-235,
-187,
197,
245,
]
)
assert_array_equal(offsets, desired)