Пример #1
0
 def test_watershed08(self):
     "The border pixels + an edge are all the same value"
     data = np.array([[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 204, 204, 204, 204, 204, 204, 255, 255, 255, 255, 255],
                      [255, 255, 255, 204, 204, 183, 153, 153, 153, 153, 183, 204, 204, 255, 255, 255],
                      [255, 255, 204, 183, 153, 141, 111, 103, 103, 111, 141, 153, 183, 204, 255, 255],
                      [255, 255, 204, 153, 111,  94,  72,  52,  52,  72,  94, 111, 153, 204, 255, 255],
                      [255, 255, 204, 153, 111,  72,  39,   1,   1,  39,  72, 111, 153, 204, 255, 255],
                      [255, 255, 204, 183, 141, 111,  72,  39,  39,  72, 111, 141, 183, 204, 255, 255],
                      [255, 255, 255, 204, 183, 141, 111,  72,  72, 111, 141, 183, 204, 255, 255, 255],
                      [255, 255, 255, 255, 204, 183, 141,  94,  94, 141, 183, 204, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 204, 153, 141, 141, 153, 204, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 204, 183, 141,  94,  94, 141, 183, 204, 255, 255, 255, 255],
                      [255, 255, 255, 204, 183, 141, 111,  72,  72, 111, 141, 183, 204, 255, 255, 255],
                      [255, 255, 204, 183, 141, 111,  72,  39,  39,  72, 111, 141, 183, 204, 255, 255],
                      [255, 255, 204, 153, 111,  72,  39,   1,   1,  39,  72, 111, 153, 204, 255, 255],
                      [255, 255, 204, 153, 111,  94,  72,  52,  52,  72,  94, 111, 153, 204, 255, 255],
                      [255, 255, 204, 183, 153, 141, 111, 103, 103, 111, 141, 153, 183, 204, 255, 255],
                      [255, 255, 255, 204, 204, 183, 153, 153, 153, 153, 183, 204, 204, 255, 255, 255],
                      [255, 255, 255, 255, 255, 204, 204, 204, 204, 204, 204, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]])
     mask = (data != 255)
     markers = np.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = np.sum(out == 1)
     size2 = np.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)
Пример #2
0
 def test_watershed08(self):
     "The border pixels + an edge are all the same value"
     data = np.array([[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],
                      [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],
                      [255,255,255,255,255,204,204,204,204,204,204,255,255,255,255,255],
                      [255,255,255,204,204,183,153,153,153,153,183,204,204,255,255,255],
                      [255,255,204,183,153,141,111,103,103,111,141,153,183,204,255,255],
                      [255,255,204,153,111, 94, 72, 52, 52, 72, 94,111,153,204,255,255],
                      [255,255,204,153,111, 72, 39,  1,  1, 39, 72,111,153,204,255,255],
                      [255,255,204,183,141,111, 72, 39, 39, 72,111,141,183,204,255,255],
                      [255,255,255,204,183,141,111, 72, 72,111,141,183,204,255,255,255],
                      [255,255,255,255,204,183,141, 94, 94,141,183,204,255,255,255,255],
                      [255,255,255,255,255,204,153,141,141,153,204,255,255,255,255,255],
                      [255,255,255,255,204,183,141, 94, 94,141,183,204,255,255,255,255],
                      [255,255,255,204,183,141,111, 72, 72,111,141,183,204,255,255,255],
                      [255,255,204,183,141,111, 72, 39, 39, 72,111,141,183,204,255,255],
                      [255,255,204,153,111, 72, 39,  1,  1, 39, 72,111,153,204,255,255],
                      [255,255,204,153,111, 94, 72, 52, 52, 72, 94,111,153,204,255,255],
                      [255,255,204,183,153,141,111,103,103,111,141,153,183,204,255,255],
                      [255,255,255,204,204,183,153,153,153,153,183,204,204,255,255,255],
                      [255,255,255,255,255,204,204,204,204,204,204,255,255,255,255,255],
                      [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],
                      [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]])
     mask = (data != 255)
     markers = np.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = np.sum(out == 1)
     size2 = np.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)
Пример #3
0
 def test_watershed05(self):
     "watershed 5"
     data = np.array([[0, 0, 0, 0, 0, 0, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 3, 0, 2, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, -1]], np.int8)
     out = watershed(data, markers, self.eight)
     error = diff([[-1, -1, -1, -1, -1, -1, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  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, -1]], out)
     self.failUnless(error < eps)
Пример #4
0
 def test_watershed06(self):
     "watershed 6"
     data = np.array([[0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 1, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [-1, 0, 0, 0, 0, 0, 0]], np.int8)
     out = watershed(data, markers, self.eight)
     error = diff([[-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, -1],
                   [-1, -1, -1, -1, -1, -1, -1]], out)
     self.assertTrue(error < eps)
Пример #5
0
 def test_watershed03(self):
     "watershed 3"
     data = np.array([[0, 0, 0, 0, 0, 0, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 2, 0, 3, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, -1]], np.int8)
     out = watershed(data, markers)
     error = diff([[-1, -1, -1, -1, -1, -1, -1],
                   [-1,  0,  2,  0,  3,  0, -1],
                   [-1,  2,  2,  0,  3,  3, -1],
                   [-1,  2,  2,  0,  3,  3, -1],
                   [-1,  2,  2,  0,  3,  3, -1],
                   [-1,  0,  2,  0,  3,  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]], out)
     self.assertTrue(error < eps)
Пример #6
0
 def test_watershed05(self):
     "watershed 5"
     data = np.array([[0, 0, 0, 0, 0, 0, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 3, 0, 2, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, -1]], np.int8)
     out = watershed(data, markers, self.eight)
     error = diff([[-1, -1, -1, -1, -1, -1, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  2, -1],
                   [-1,  3,  3,  0,  2,  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, -1]], out)
     self.assertTrue(error < eps)
Пример #7
0
def test_compact_watershed():
    image = np.zeros((5, 6))
    image[:, 3:] = 1
    seeds = np.zeros((5, 6), dtype=int)
    seeds[2, 0] = 1
    seeds[2, 3] = 2
    compact = watershed(image, seeds, compactness=0.01)
    expected = np.array(
        [[1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 2, 2],
         [1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 2, 2]],
        dtype=int)
    np.testing.assert_equal(compact, expected)
    normal = watershed(image, seeds)
    expected = np.ones(image.shape, dtype=int)
    expected[2, 3:] = 2
    np.testing.assert_equal(normal, expected)
Пример #8
0
 def test_watershed03(self):
     "watershed 3"
     data = np.array([[0, 0, 0, 0, 0, 0, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 0, 1, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 2, 0, 3, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, -1]], np.int8)
     out = watershed(data, markers)
     error = diff([[-1, -1, -1, -1, -1, -1, -1],
                   [-1,  0,  2,  0,  3,  0, -1],
                   [-1,  2,  2,  0,  3,  3, -1],
                   [-1,  2,  2,  0,  3,  3, -1],
                   [-1,  2,  2,  0,  3,  3, -1],
                   [-1,  0,  2,  0,  3,  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]], out)
     self.failUnless(error < eps)
Пример #9
0
 def test_watershed01(self):
     "watershed 1"
     data = np.array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0], [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]],
                     np.uint8)
     markers = np.array([[-1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]],
                        np.int8)
     out = watershed(data, markers, self.eight)
     expected = np.array([[-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, -1],
                          [-1, -1, -1, -1, -1, -1, -1],
                          [-1, -1, -1, -1, -1, -1, -1]])
     error = diff(expected, out)
     assert error < eps
     out = _slow_watershed(data, markers, 8)
     error = diff(expected, out)
     assert error < eps
Пример #10
0
 def test_watershed07(self):
     "A regression test of a competitive case that failed"
     data = np.array([[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],
                      [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],
                      [255,255,255,255,255,204,204,204,204,204,204,255,255,255,255,255],
                      [255,255,255,204,204,183,153,153,153,153,183,204,204,255,255,255],
                      [255,255,204,183,153,141,111,103,103,111,141,153,183,204,255,255],
                      [255,255,204,153,111, 94, 72, 52, 52, 72, 94,111,153,204,255,255],
                      [255,255,204,153,111, 72, 39,  1, 1, 39, 72,111,153,204,255,255],
                      [255,255,204,183,141,111, 72, 39, 39, 72,111,141,183,204,255,255],
                      [255,255,255,204,183,141,111, 72, 72,111,141,183,204,255,255,255],
                      [255,255,255,255,204,183,141, 94, 94,141,183,204,255,255,255,255],
                      [255,255,255,255,255,204,153,103,103,153,204,255,255,255,255,255],
                      [255,255,255,255,204,183,141, 94, 94,141,183,204,255,255,255,255],
                      [255,255,255,204,183,141,111, 72, 72,111,141,183,204,255,255,255],
                      [255,255,204,183,141,111, 72, 39, 39, 72,111,141,183,204,255,255],
                      [255,255,204,153,111, 72, 39,  1,  1, 39, 72,111,153,204,255,255],
                      [255,255,204,153,111, 94, 72, 52, 52, 72, 94,111,153,204,255,255],
                      [255,255,204,183,153,141,111,103,103,111,141,153,183,204,255,255],
                      [255,255,255,204,204,183,153,153,153,153,183,204,204,255,255,255],
                      [255,255,255,255,255,204,204,204,204,204,204,255,255,255,255,255],
                      [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],
                      [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]])
     mask = (data != 255)
     markers = np.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = np.sum(out == 1)
     size2 = np.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)
Пример #11
0
 def test_watershed07(self):
     "A regression test of a competitive case that failed"
     data = np.array([[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 204, 204, 204, 204, 204, 204, 255, 255, 255, 255, 255],
                      [255, 255, 255, 204, 204, 183, 153, 153, 153, 153, 183, 204, 204, 255, 255, 255],
                      [255, 255, 204, 183, 153, 141, 111, 103, 103, 111, 141, 153, 183, 204, 255, 255],
                      [255, 255, 204, 153, 111,  94,  72,  52,  52,  72,  94, 111, 153, 204, 255, 255],
                      [255, 255, 204, 153, 111,  72,  39,   1,   1,  39,  72, 111, 153, 204, 255, 255],
                      [255, 255, 204, 183, 141, 111,  72,  39,  39,  72, 111, 141, 183, 204, 255, 255],
                      [255, 255, 255, 204, 183, 141, 111,  72,  72, 111, 141, 183, 204, 255, 255, 255],
                      [255, 255, 255, 255, 204, 183, 141,  94,  94, 141, 183, 204, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 204, 153, 103, 103, 153, 204, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 204, 183, 141,  94,  94, 141, 183, 204, 255, 255, 255, 255],
                      [255, 255, 255, 204, 183, 141, 111,  72,  72, 111, 141, 183, 204, 255, 255, 255],
                      [255, 255, 204, 183, 141, 111,  72,  39,  39,  72, 111, 141, 183, 204, 255, 255],
                      [255, 255, 204, 153, 111,  72,  39,   1,   1,  39,  72, 111, 153, 204, 255, 255],
                      [255, 255, 204, 153, 111,  94,  72,  52,  52,  72,  94, 111, 153, 204, 255, 255],
                      [255, 255, 204, 183, 153, 141, 111, 103, 103, 111, 141, 153, 183, 204, 255, 255],
                      [255, 255, 255, 204, 204, 183, 153, 153, 153, 153, 183, 204, 204, 255, 255, 255],
                      [255, 255, 255, 255, 255, 204, 204, 204, 204, 204, 204, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],
                      [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]])
     mask = (data != 255)
     markers = np.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = np.sum(out == 1)
     size2 = np.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)
Пример #12
0
 def test_watershed06(self):
     "watershed 6"
     data = np.array([[0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 1, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [-1, 0, 0, 0, 0, 0, 0]], np.int8)
     out = watershed(data, markers, self.eight)
     error = diff([[-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, -1],
                   [-1, -1, -1, -1, -1, -1, -1]], out)
     self.failUnless(error < eps)
Пример #13
0
def test_compact_watershed():
    image = np.zeros((5, 6))
    image[:, 3:] = 1
    seeds = np.zeros((5, 6), dtype=int)
    seeds[2, 0] = 1
    seeds[2, 3] = 2
    compact = watershed(image, seeds, compactness=0.01)
    expected = np.array([[1, 1, 1, 2, 2, 2],
                         [1, 1, 1, 2, 2, 2],
                         [1, 1, 1, 2, 2, 2],
                         [1, 1, 1, 2, 2, 2],
                         [1, 1, 1, 2, 2, 2]], dtype=int)
    np.testing.assert_equal(compact, expected)
    normal = watershed(image, seeds)
    expected = np.ones(image.shape, dtype=int)
    expected[2, 3:] = 2
    np.testing.assert_equal(normal, expected)
Пример #14
0
    def test_watershed09(self):
        """Test on an image of reasonable size

        This is here both for timing (does it take forever?) and to
        ensure that the memory constraints are reasonable
        """
        image = np.zeros((1000, 1000))
        coords = np.random.uniform(0, 1000, (100, 2)).astype(int)
        markers = np.zeros((1000, 1000), int)
        idx = 1
        for x, y in coords:
            image[x, y] = 1
            markers[x, y] = idx
            idx += 1

        image = ndi.gaussian_filter(image, 4)
        watershed(image, markers, self.eight)
        ndi.watershed_ift(image.astype(np.uint16), markers, self.eight)
Пример #15
0
def test_numeric_seed_watershed():
    """Test that passing just the number of seeds to watershed works."""
    image = np.zeros((5, 6))
    image[:, 3:] = 1
    compact = watershed(image, 2, compactness=0.01)
    expected = np.array(
        [[1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 2, 2],
         [1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 2, 2]],
        dtype=np.int32)
    np.testing.assert_equal(compact, expected)
Пример #16
0
 def test_watershed10(self):
     "watershed 10"
     data = np.array(
         [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], np.uint8)
     markers = np.array(
         [[1, 0, 0, 2], [0, 0, 0, 0], [0, 0, 0, 0], [3, 0, 0, 4]], np.int8)
     out = watershed(data, markers, self.eight)
     error = diff([[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]],
                  out)
     self.assertTrue(error < eps)
Пример #17
0
def test_numeric_seed_watershed():
    """Test that passing just the number of seeds to watershed works."""
    image = np.zeros((5, 6))
    image[:, 3:] = 1
    compact = watershed(image, 2, compactness=0.01)
    expected = np.array([[1, 1, 1, 1, 2, 2],
                         [1, 1, 1, 1, 2, 2],
                         [1, 1, 1, 1, 2, 2],
                         [1, 1, 1, 1, 2, 2],
                         [1, 1, 1, 1, 2, 2]], dtype=np.int32)
    np.testing.assert_equal(compact, expected)
Пример #18
0
 def test_watershed02(self):
     "watershed 2"
     data = np.array(
         [
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 1, 1, 1, 1, 1, 0],
             [0, 1, 0, 0, 0, 1, 0],
             [0, 1, 0, 0, 0, 1, 0],
             [0, 1, 0, 0, 0, 1, 0],
             [0, 1, 1, 1, 1, 1, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
         ],
         np.uint8,
     )
     markers = np.array(
         [
             [-1, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 1, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
         ],
         np.int8,
     )
     out = watershed(data, markers)
     error = diff(
         [
             [-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, -1],
             [-1, -1, 1, 1, 1, -1, -1],
             [-1, -1, -1, -1, -1, -1, -1],
             [-1, -1, -1, -1, -1, -1, -1],
         ],
         out,
     )
     self.failUnless(error < eps)
Пример #19
0
 def test_watershed01(self):
     "watershed 1"
     data = np.array(
         [
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 1, 1, 1, 1, 1, 0],
             [0, 1, 0, 0, 0, 1, 0],
             [0, 1, 0, 0, 0, 1, 0],
             [0, 1, 0, 0, 0, 1, 0],
             [0, 1, 1, 1, 1, 1, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
         ],
         np.uint8,
     )
     markers = np.array(
         [
             [-1, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 1, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
         ],
         np.int8,
     )
     out = watershed(data, markers, self.eight)
     expected = np.array(
         [
             [-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, -1],
             [-1, -1, -1, -1, -1, -1, -1],
             [-1, -1, -1, -1, -1, -1, -1],
         ]
     )
     error = diff(expected, out)
     assert error < eps
     out = _slow_watershed(data, markers, 8)
     error = diff(expected, out)
     assert error < eps
Пример #20
0
 def test_watershed05(self):
     "watershed 5"
     data = np.array(
         [
             [0, 0, 0, 0, 0, 0, 0],
             [0, 1, 1, 1, 1, 1, 0],
             [0, 1, 0, 1, 0, 1, 0],
             [0, 1, 0, 1, 0, 1, 0],
             [0, 1, 0, 1, 0, 1, 0],
             [0, 1, 1, 1, 1, 1, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
         ],
         np.uint8,
     )
     markers = np.array(
         [
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 3, 0, 2, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, -1],
         ],
         np.int8,
     )
     out = watershed(data, markers, self.eight)
     error = diff(
         [
             [-1, -1, -1, -1, -1, -1, -1],
             [-1, 3, 3, 0, 2, 2, -1],
             [-1, 3, 3, 0, 2, 2, -1],
             [-1, 3, 3, 0, 2, 2, -1],
             [-1, 3, 3, 0, 2, 2, -1],
             [-1, 3, 3, 0, 2, 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, -1],
         ],
         out,
     )
     self.failUnless(error < eps)
Пример #21
0
 def test_watershed07(self):
     "A regression test of a competitive case that failed"
     data = blob
     mask = (data != 255)
     markers = np.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = np.sum(out == 1)
     size2 = np.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)
Пример #22
0
 def test_watershed10(self):
     "watershed 10"
     data = np.array([[1, 1, 1, 1],
                      [1, 1, 1, 1],
                      [1, 1, 1, 1],
                      [1, 1, 1, 1]], np.uint8)
     markers = np.array([[1, 0, 0, 2],
                         [0, 0, 0, 0],
                         [0, 0, 0, 0],
                         [3, 0, 0, 4]], np.int8)
     out = watershed(data, markers, self.eight)
     error = diff([[1, 1, 2, 2],
                   [1, 1, 2, 2],
                   [3, 3, 4, 4],
                   [3, 3, 4, 4]], out)
     self.assertTrue(error < eps)
Пример #23
0
 def test_watershed08(self):
     "The border pixels + an edge are all the same value"
     data = blob.copy()
     data[10, 7:9] = 141
     mask = (data != 255)
     markers = np.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = np.sum(out == 1)
     size2 = np.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)
Пример #24
0
 def test_watershed02(self):
     "watershed 2"
     data = np.array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                      [0, 1, 1, 1, 1, 1, 0], [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[-1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0]], np.int8)
     out = watershed(data, markers)
     error = diff(
         [[-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, -1],
          [-1, -1, 1, 1, 1, -1, -1], [-1, -1, -1, -1, -1, -1, -1],
          [-1, -1, -1, -1, -1, -1, -1]], out)
     self.failUnless(error < eps)
Пример #25
0
 def test_watershed12(self):
     "The watershed line"
     data = np.array([[203, 255, 203, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153],
                      [203, 255, 203, 153, 153, 153, 102, 102, 102, 102, 102, 102, 153, 153, 153, 153],
                      [203, 255, 203, 203, 153, 153, 102, 102,  77,   0, 102, 102, 153, 153, 203, 203],
                      [203, 255, 255, 203, 153, 153, 153, 102, 102, 102, 102, 153, 153, 203, 203, 255],
                      [203, 203, 255, 203, 203, 203, 153, 153, 153, 153, 153, 153, 203, 203, 255, 255],
                      [153, 203, 255, 255, 255, 203, 203, 203, 203, 203, 203, 203, 203, 255, 255, 203],
                      [153, 203, 203, 203, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 203, 203],
                      [153, 153, 153, 203, 203, 203, 203, 203, 255, 203, 203, 203, 203, 203, 203, 153],
                      [102, 102, 153, 153, 153, 153, 203, 203, 255, 203, 203, 255, 203, 153, 153, 153],
                      [102, 102, 102, 102, 102, 153, 203, 255, 255, 203, 203, 203, 203, 153, 102, 153],
                      [102,  51,  51, 102, 102, 153, 203, 255, 203, 203, 153, 153, 153, 153, 102, 153],
                      [ 77,  51,  51, 102, 153, 153, 203, 255, 203, 203, 203, 153, 102, 102, 102, 153],
                      [ 77,   0,  51, 102, 153, 203, 203, 255, 203, 255, 203, 153, 102,  51, 102, 153],
                      [ 77,   0,  51, 102, 153, 203, 255, 255, 203, 203, 203, 153, 102,   0, 102, 153],
                      [102,   0,  51, 102, 153, 203, 255, 203, 203, 153, 153, 153, 102, 102, 102, 153],
                      [102, 102, 102, 102, 153, 203, 255, 203, 153, 153, 153, 153, 153, 153, 153, 153]])
     markerbin = (data==0)
     marker = label(markerbin)
     ws = watershed(data, marker, connectivity=2, watershed_line=True)
     for lab, area in zip(range(4), [34,74,74,74]):
         self.assertTrue(np.sum(ws == lab) == area)
Пример #26
0
 def test_watershed02(self):
     "watershed 2"
     data = np.array([[0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 0, 0, 0, 1, 0],
                      [0, 1, 1, 1, 1, 1, 0],
                      [0, 0, 0, 0, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0, 0]], np.uint8)
     markers = np.array([[-1, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 1, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0]], np.int8)
     out = watershed(data, markers)
     error = diff([[-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, -1],
                   [-1, -1,  1,  1,  1, -1, -1],
                   [-1, -1, -1, -1, -1, -1, -1],
                   [-1, -1, -1, -1, -1, -1, -1]], out)
     self.assertTrue(error < eps)
Пример #27
0
    def test_watershed11(self):
        '''Make sure that all points on this plateau are assigned to closest seed'''
        # https://github.com/scikit-image/scikit-image/issues/803
        #
        # Make sure that no point in a level image is farther away
        # from its seed than any other
        #
        image = np.zeros((21, 21))
        markers = np.zeros((21, 21), int)
        markers[5, 5] = 1
        markers[5, 10] = 2
        markers[10, 5] = 3
        markers[10, 10] = 4

        structure = np.array([[False, True, False],
                              [True, True, True],
                              [False, True, False]])
        out = watershed(image, markers, structure)
        i, j = np.mgrid[0:21, 0:21]
        d = np.dstack(
            [np.sqrt((i.astype(float)-i0)**2, (j.astype(float)-j0)**2)
             for i0, j0 in ((5, 5), (5, 10), (10, 5), (10, 10))])
        dmin = np.min(d, 2)
        self.assertTrue(np.all(d[i, j, out[i, j]-1] == dmin))
Пример #28
0
def test_no_markers():
    data = blob
    mask = (data != 255)
    out = watershed(data, mask=mask)
    assert np.max(out) == 2
Пример #29
0
def test_markers_in_mask():
    data = blob
    mask = (data != 255)
    out = watershed(data, 25, connectivity=2, mask=mask)
    # There should be no markers where the mask is false
    assert np.all(out[~mask] == 0)
Пример #30
0
def test_incorrect_mask_shape():
    with pytest.raises(ValueError):
        image = np.ones((5, 6))
        mask = np.ones((5, 7))
        output = watershed(image, markers=4, mask=mask)