149 lines
6.5 KiB
Python
149 lines
6.5 KiB
Python
|
"""
|
||
|
Tests for Morphological structuring elements
|
||
|
(skimage.morphology.selem)
|
||
|
|
||
|
Author: Damian Eads
|
||
|
"""
|
||
|
import numpy as np
|
||
|
|
||
|
from skimage import data
|
||
|
from skimage.morphology import selem
|
||
|
|
||
|
from skimage._shared.testing import assert_equal, fetch
|
||
|
from skimage._shared import testing
|
||
|
|
||
|
|
||
|
class TestSElem():
|
||
|
|
||
|
def test_square_selem(self):
|
||
|
"""Test square structuring elements"""
|
||
|
for k in range(0, 5):
|
||
|
actual_mask = selem.square(k)
|
||
|
expected_mask = np.ones((k, k), dtype='uint8')
|
||
|
assert_equal(expected_mask, actual_mask)
|
||
|
|
||
|
def test_rectangle_selem(self):
|
||
|
"""Test rectangle structuring elements"""
|
||
|
for i in range(0, 5):
|
||
|
for j in range(0, 5):
|
||
|
actual_mask = selem.rectangle(i, j)
|
||
|
expected_mask = np.ones((i, j), dtype='uint8')
|
||
|
assert_equal(expected_mask, actual_mask)
|
||
|
|
||
|
def test_cube_selem(self):
|
||
|
"""Test cube structuring elements"""
|
||
|
for k in range(0, 5):
|
||
|
actual_mask = selem.cube(k)
|
||
|
expected_mask = np.ones((k, k, k), dtype='uint8')
|
||
|
assert_equal(expected_mask, actual_mask)
|
||
|
|
||
|
def strel_worker(self, fn, func):
|
||
|
matlab_masks = np.load(fetch(fn))
|
||
|
k = 0
|
||
|
for arrname in sorted(matlab_masks):
|
||
|
expected_mask = matlab_masks[arrname]
|
||
|
actual_mask = func(k)
|
||
|
if expected_mask.shape == (1,):
|
||
|
expected_mask = expected_mask[:, np.newaxis]
|
||
|
assert_equal(expected_mask, actual_mask)
|
||
|
k = k + 1
|
||
|
|
||
|
def strel_worker_3d(self, fn, func):
|
||
|
matlab_masks = np.load(fetch(fn))
|
||
|
k = 0
|
||
|
for arrname in sorted(matlab_masks):
|
||
|
expected_mask = matlab_masks[arrname]
|
||
|
actual_mask = func(k)
|
||
|
if expected_mask.shape == (1,):
|
||
|
expected_mask = expected_mask[:, np.newaxis]
|
||
|
# Test center slice for each dimension. This gives a good
|
||
|
# indication of validity without the need for a 3D reference
|
||
|
# mask.
|
||
|
c = int(expected_mask.shape[0]/2)
|
||
|
assert_equal(expected_mask, actual_mask[c, :, :])
|
||
|
assert_equal(expected_mask, actual_mask[:, c, :])
|
||
|
assert_equal(expected_mask, actual_mask[:, :, c])
|
||
|
k = k + 1
|
||
|
|
||
|
def test_selem_disk(self):
|
||
|
"""Test disk structuring elements"""
|
||
|
self.strel_worker("data/disk-matlab-output.npz", selem.disk)
|
||
|
|
||
|
def test_selem_diamond(self):
|
||
|
"""Test diamond structuring elements"""
|
||
|
self.strel_worker("data/diamond-matlab-output.npz", selem.diamond)
|
||
|
|
||
|
def test_selem_ball(self):
|
||
|
"""Test ball structuring elements"""
|
||
|
self.strel_worker_3d("data/disk-matlab-output.npz", selem.ball)
|
||
|
|
||
|
def test_selem_octahedron(self):
|
||
|
"""Test octahedron structuring elements"""
|
||
|
self.strel_worker_3d("data/diamond-matlab-output.npz",
|
||
|
selem.octahedron)
|
||
|
|
||
|
def test_selem_octagon(self):
|
||
|
"""Test octagon structuring elements"""
|
||
|
expected_mask1 = np.array([[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0]],
|
||
|
dtype=np.uint8)
|
||
|
actual_mask1 = selem.octagon(5, 3)
|
||
|
expected_mask2 = np.array([[0, 1, 0],
|
||
|
[1, 1, 1],
|
||
|
[0, 1, 0]], dtype=np.uint8)
|
||
|
actual_mask2 = selem.octagon(1, 1)
|
||
|
assert_equal(expected_mask1, actual_mask1)
|
||
|
assert_equal(expected_mask2, actual_mask2)
|
||
|
|
||
|
def test_selem_ellipse(self):
|
||
|
"""Test ellipse structuring elements"""
|
||
|
expected_mask1 = np.array([[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0]], dtype=np.uint8)
|
||
|
actual_mask1 = selem.ellipse(5, 3)
|
||
|
expected_mask2 = np.array([[1, 1, 1],
|
||
|
[1, 1, 1],
|
||
|
[1, 1, 1]], dtype=np.uint8)
|
||
|
actual_mask2 = selem.ellipse(1, 1)
|
||
|
assert_equal(expected_mask1, actual_mask1)
|
||
|
assert_equal(expected_mask2, actual_mask2)
|
||
|
assert_equal(expected_mask1, selem.ellipse(3, 5).T)
|
||
|
assert_equal(expected_mask2, selem.ellipse(1, 1).T)
|
||
|
|
||
|
def test_selem_star(self):
|
||
|
"""Test star structuring elements"""
|
||
|
expected_mask1 = np.array([[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
|
||
|
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
|
||
|
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]],
|
||
|
dtype=np.uint8)
|
||
|
actual_mask1 = selem.star(4)
|
||
|
expected_mask2 = np.array([[1, 1, 1],
|
||
|
[1, 1, 1],
|
||
|
[1, 1, 1]], dtype=np.uint8)
|
||
|
actual_mask2 = selem.star(1)
|
||
|
assert_equal(expected_mask1, actual_mask1)
|
||
|
assert_equal(expected_mask2, actual_mask2)
|