def test_ellipse_model_residuals(): model = EllipseModel() # vertical line through origin model.params = (0, 0, 10, 5, 0) assert_almost_equal(abs(model.residuals(np.array([[10, 0]]))), 0) assert_almost_equal(abs(model.residuals(np.array([[0, 5]]))), 0) assert_almost_equal(abs(model.residuals(np.array([[0, 10]]))), 5)
def test_ellipse_model_predict(): model = EllipseModel() model.params = (0, 0, 5, 10, 0) t = np.arange(0, 2 * np.pi, np.pi / 2) xy = np.array(((5, 0), (0, 10), (-5, 0), (0, -10))) assert_almost_equal(xy, model.predict_xy(t))
def bounding_ellipses(ellipses_nuclei, n_neighbour_nuclei=1, radial_slack=0.0): '''Bla bla ''' ellipses_bounding = {} for k_label, ellipse_n in ellipses_nuclei.items(): x0, y0, a0, b0, theta0 = ellipse_n.params dists = [] for l_label, ellipse_n_test in ellipses_nuclei.items(): xt, yt, at, bt, thetat = ellipse_n_test.params dist = (((xt - x0) * np.cos(theta0) + (yt - y0) * np.sin(theta0)) / a0) ** 2 + \ (((xt - x0) * np.sin(theta0) - (yt - y0) * np.cos(theta0)) / b0) ** 2 dists.append((l_label, dist)) sort_dist = sorted(dists, key=lambda x: x[1]) scale = np.sqrt( sort_dist[n_neighbour_nuclei][1]) * (1.0 + radial_slack) ellipse_bounder = EllipseModel() ellipse_bounder.params = (round(x0), round(y0), round(a0 * scale), round(b0 * scale), -theta0) ellipses_bounding[k_label] = ellipse_bounder return ellipses_bounding
def test_ellipse_model_estimate(): # generate original data without noise model0 = EllipseModel() model0.params = (10, 20, 15, 25, 0) t = np.linspace(0, 2 * np.pi, 100) data0 = model0.predict_xy(t) # add gaussian noise to data np.random.seed(1234) data = data0 + np.random.normal(size=data0.shape) # estimate parameters of noisy data model_est = EllipseModel() model_est.estimate(data) # test whether estimated parameters almost equal original parameters assert_almost_equal(model0.params, model_est.params, 0)
def test_ellipse_model_estimate(): for angle in range(0, 180, 15): rad = np.deg2rad(angle) # generate original data without noise model0 = EllipseModel() model0.params = (10, 20, 15, 25, rad) t = np.linspace(0, 2 * np.pi, 100) data0 = model0.predict_xy(t) # add gaussian noise to data random_state = np.random.RandomState(1234) data = data0 + random_state.normal(size=data0.shape) # estimate parameters of noisy data model_est = EllipseModel() model_est.estimate(data) # test whether estimated parameters almost equal original parameters assert_almost_equal(model0.params[:2], model_est.params[:2], 0) res = model_est.residuals(data0) assert_array_less(res, np.ones(res.shape))
def ellipse_fits(img_labelled, exclusion_list=[0]): '''Bla bla ''' ellipses_by_label = {} for k_label in np.unique(img_labelled): if k_label in exclusion_list: continue rows, cols = np.where(img_labelled == k_label) coords = np.stack([rows, cols]).T ellipse = EllipseModel() estimate_success = ellipse.estimate(coords) if not estimate_success: xc, yc = tuple([int(x) for x in np.median(coords, axis=0)]) ellipse.params = xc, yc, 10, 10, 0.0 ellipses_by_label[k_label] = ellipse return ellipses_by_label