""" These tests are originally part of CellProfiler, code licensed under both GPL and BSD licenses. Website: http://www.cellprofiler.org Copyright (c) 2003-2009 Massachusetts Institute of Technology Copyright (c) 2009-2011 Broad Institute All rights reserved. Original author: Lee Kamentsky """ import numpy as np from skimage.morphology.greyreconstruct import reconstruction from skimage._shared import testing from skimage._shared.testing import assert_array_almost_equal def test_zeros(): """Test reconstruction with image and mask of zeros""" assert_array_almost_equal( reconstruction(np.zeros((5, 7)), np.zeros((5, 7))), 0) def test_image_equals_mask(): """Test reconstruction where the image and mask are the same""" assert_array_almost_equal( reconstruction(np.ones((7, 5)), np.ones((7, 5))), 1) def test_image_less_than_mask(): """Test reconstruction where the image is uniform and less than mask""" image = np.ones((5, 5)) mask = np.ones((5, 5)) * 2 assert_array_almost_equal(reconstruction(image, mask), 1) def test_one_image_peak(): """Test reconstruction with one peak pixel""" image = np.ones((5, 5)) image[2, 2] = 2 mask = np.ones((5, 5)) * 3 assert_array_almost_equal(reconstruction(image, mask), 2) def test_two_image_peaks(): """Test reconstruction with two peak pixels isolated by the mask""" image = np.array([[1, 1, 1, 1, 1, 1, 1, 1], [1, 2, 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, 3, 1], [1, 1, 1, 1, 1, 1, 1, 1]]) mask = np.array([[4, 4, 4, 1, 1, 1, 1, 1], [4, 4, 4, 1, 1, 1, 1, 1], [4, 4, 4, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 4, 4, 4], [1, 1, 1, 1, 1, 4, 4, 4], [1, 1, 1, 1, 1, 4, 4, 4]]) expected = np.array([[2, 2, 2, 1, 1, 1, 1, 1], [2, 2, 2, 1, 1, 1, 1, 1], [2, 2, 2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 3, 3, 3], [1, 1, 1, 1, 1, 3, 3, 3], [1, 1, 1, 1, 1, 3, 3, 3]]) assert_array_almost_equal(reconstruction(image, mask), expected) def test_zero_image_one_mask(): """Test reconstruction with an image of all zeros and a mask that's not""" result = reconstruction(np.zeros((10, 10)), np.ones((10, 10))) assert_array_almost_equal(result, 0) def test_fill_hole(): """Test reconstruction by erosion, which should fill holes in mask.""" seed = np.array([0, 8, 8, 8, 8, 8, 8, 8, 8, 0]) mask = np.array([0, 3, 6, 2, 1, 1, 1, 4, 2, 0]) result = reconstruction(seed, mask, method='erosion') assert_array_almost_equal(result, np.array([0, 3, 6, 4, 4, 4, 4, 4, 2, 0])) def test_invalid_seed(): seed = np.ones((5, 5)) mask = np.ones((5, 5)) with testing.raises(ValueError): reconstruction(seed * 2, mask, method='dilation') with testing.raises(ValueError): reconstruction(seed * 0.5, mask, method='erosion') def test_invalid_selem(): seed = np.ones((5, 5)) mask = np.ones((5, 5)) with testing.raises(ValueError): reconstruction(seed, mask, selem=np.ones((4, 4))) with testing.raises(ValueError): reconstruction(seed, mask, selem=np.ones((3, 4))) reconstruction(seed, mask, selem=np.ones((3, 3))) def test_invalid_method(): seed = np.array([0, 8, 8, 8, 8, 8, 8, 8, 8, 0]) mask = np.array([0, 3, 6, 2, 1, 1, 1, 4, 2, 0]) with testing.raises(ValueError): reconstruction(seed, mask, method='foo') def test_invalid_offset_not_none(): """Test reconstruction with invalid not None offset parameter""" image = np.array([[1, 1, 1, 1, 1, 1, 1, 1], [1, 2, 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, 3, 1], [1, 1, 1, 1, 1, 1, 1, 1]]) mask = np.array([[4, 4, 4, 1, 1, 1, 1, 1], [4, 4, 4, 1, 1, 1, 1, 1], [4, 4, 4, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 4, 4, 4], [1, 1, 1, 1, 1, 4, 4, 4], [1, 1, 1, 1, 1, 4, 4, 4]]) with testing.raises(ValueError): reconstruction(image, mask, method='dilation', selem=np.ones((3, 3)), offset=np.array([3, 0])) def test_offset_not_none(): """Test reconstruction with valid offset parameter""" seed = np.array([0, 3, 6, 2, 1, 1, 1, 4, 2, 0]) mask = np.array([0, 8, 6, 8, 8, 8, 8, 4, 4, 0]) expected = np.array([0, 3, 6, 6, 6, 6, 6, 4, 4, 0]) assert_array_almost_equal( reconstruction(seed, mask, method='dilation', selem=np.ones(3), offset=np.array([0])), expected)