def test_eccentricity(self): # Eccentricity (elongation) is measured with good accuracy and # ~0.02 precision, as long as the mask is large enough to cover # the whole object. L = 101 dims = (L, L + 2) # avoid square images in tests pos = np.array([50, 55]) cols = ['x', 'y'] ECC = 0 image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], 4, ecc=ECC) actual = mr.locate(image, 21, 1, preprocess=False)['ecc'] expected = ECC assert_allclose(actual, expected, atol=0.02) ECC = 0.2 image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], 4, ecc=ECC) actual = mr.locate(image, 21, 1, preprocess=False)['ecc'] expected = ECC assert_allclose(actual, expected, atol=0.02) ECC = 0.5 image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], 4, ecc=ECC) actual = mr.locate(image, 21, 1, preprocess=False)['ecc'] expected = ECC assert_allclose(actual, expected, atol=0.02)
def compare(shape, count, radius, noise_level): pos = gen_random_locations(shape, count) image = draw_spots(shape, pos, radius, noise_level) f = mr.locate(image, 2*radius + 1, minmass=1800) actual = f[['x', 'y']].sort(['x', 'y']) expected = DataFrame(pos, columns=['y', 'x'])[['x', 'y']].sort(['x', 'y']) return actual, expected
def compare(shape, count, radius, noise_level): pos = gen_random_locations(shape, count) image = draw_spots(shape, pos, radius, noise_level) f = mr.locate(image, 2 * radius + 1, minmass=1800) actual = f[['x', 'y']].sort(['x', 'y']) expected = DataFrame(pos, columns=['y', 'x'])[['x', 'y']].sort(['x', 'y']) return actual, expected
def test_one_centered_gaussian(self): L = 21 dims = (L, L + 2) # avoid square images in tests pos = np.array([7, 13]) cols = ['x', 'y'] expected = DataFrame(pos.reshape(1, -1), columns=cols) image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], 4) actual = mr.locate(image, 9, 1, preprocess=False)[cols] assert_allclose(actual, expected, atol=0.1)
def test_rg(self): # For Gaussians with radii 2, 3, 5, and 7 px, with proportionately # chosen feature (mask) sizes, the 'size' comes out to be within 10% # of the true Gaussian width. # The IDL code has mistake in this area, documented here: # http://www.physics.emory.edu/~weeks/idl/radius.html L = 101 dims = (L, L + 2) # avoid square images in tests pos = np.array([50, 55]) cols = ['x', 'y'] SIZE = 2 image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], SIZE) actual = mr.locate(image, 7, 1, preprocess=False)['size'] expected = SIZE assert_allclose(actual, expected, rtol=0.1) SIZE = 3 image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], SIZE) actual = mr.locate(image, 11, 1, preprocess=False)['size'] expected = SIZE assert_allclose(actual, expected, rtol=0.1) SIZE = 5 image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], SIZE) actual = mr.locate(image, 17, 1, preprocess=False)['size'] expected = SIZE assert_allclose(actual, expected, rtol=0.1) SIZE = 7 image = np.ones(dims, dtype='uint8') draw_gaussian_spot(image, pos[::-1], SIZE) actual = mr.locate(image, 23, 1, preprocess=False)['size'] expected = SIZE assert_allclose(actual, expected, rtol=0.1)
def test_topn(self): L = 21 dims = (L, L + 2) # avoid square images in tests cols = ['x', 'y'] PRECISION = 0.1 # top 2 pos1 = np.array([7, 7]) pos2 = np.array([14, 14]) pos3 = np.array([7, 14]) image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 100 image[tuple(pos2[::-1])] = 80 image[tuple(pos3[::-1])] = 90 actual = mr.locate(image, 5, 1, topn=2, preprocess=False)[cols] actual = actual.sort(['x', 'y']) # sort for reliable comparison expected = DataFrame([[7, 7], [7, 14]], columns=cols).sort(['x', 'y']) assert_allclose(actual, expected, atol=PRECISION) # top 1 actual = mr.locate(image, 5, 1, topn=1, preprocess=False)[cols] actual = actual.sort(['x', 'y']) # sort for reliable comparison expected = DataFrame([[7, 7]], columns=cols).sort(['x', 'y']) assert_allclose(actual, expected, atol=PRECISION)
def test_subpx_precision(self): L = 21 dims = (L, L + 2) # avoid square images in tests cols = ['x', 'y'] PRECISION = 0.1 # one bright pixel pos = np.array([7, 13]) image = np.ones(dims, dtype='uint8') image[tuple(pos[::-1])] = 100 actual = mr.locate(image, 3, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=0.001) # especially precise # two neighboring pixels of equal brightness pos1 = np.array([7, 13]) pos2 = np.array([8, 13]) pos = np.array([7.5, 13]) # center is between pixels image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 100 image[tuple(pos2[::-1])] = 100 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) # two neighboring pixels of unequal brightness pos1 = np.array([7, 13]) pos2 = np.array([8, 13]) pos = np.array([7.25, 13]) # center is between pixels, biased left image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 100 image[tuple(pos2[::-1])] = 50 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) pos = np.array([7.75, 13]) # center is between pixels, biased right image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 50 image[tuple(pos2[::-1])] = 100 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) pos1 = np.array([7, 12]) pos2 = np.array([7, 13]) pos = np.array([7, 12.25]) # center is between pixels, biased down image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 100 image[tuple(pos2[::-1])] = 50 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) pos = np.array([7, 12.75]) # center is between pixels, biased up image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 50 image[tuple(pos2[::-1])] = 100 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) # four neighboring pixels of unequal brightness pos1 = np.array([7, 13]) pos2 = np.array([8, 13]) pos3 = np.array([7, 13]) pos4 = np.array([8, 13]) pos = np.array([7.25, 13]) # center is between pixels, biased left image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 100 image[tuple(pos2[::-1])] = 50 image[tuple(pos3[::-1])] = 100 image[tuple(pos4[::-1])] = 50 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) pos = np.array([7.75, 13]) # center is between pixels, biased right image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 50 image[tuple(pos2[::-1])] = 100 image[tuple(pos3[::-1])] = 50 image[tuple(pos4[::-1])] = 100 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) pos1 = np.array([7, 12]) pos2 = np.array([7, 13]) pos3 = np.array([7, 12]) pos4 = np.array([7, 13]) pos = np.array([7, 12.25]) # center is between pixels, biased down image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 100 image[tuple(pos2[::-1])] = 50 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION) pos = np.array([7, 12.75]) # center is between pixels, biased up image = np.ones(dims, dtype='uint8') image[tuple(pos1[::-1])] = 50 image[tuple(pos2[::-1])] = 100 actual = mr.locate(image, 5, 1, preprocess=False)[cols] expected = DataFrame(pos.reshape(1, -1), columns=cols) assert_allclose(actual, expected, atol=PRECISION)