From 80827d3959023ba5ed9d8e617c7122ef9fc0734d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Sch=C3=B6nberger?= Date: Wed, 1 May 2013 11:34:54 +0200 Subject: [PATCH] Add test case for ransac algorithm --- skimage/measure/tests/test_fit.py | 63 +++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/skimage/measure/tests/test_fit.py b/skimage/measure/tests/test_fit.py index c3750789..83b73840 100644 --- a/skimage/measure/tests/test_fit.py +++ b/skimage/measure/tests/test_fit.py @@ -1,6 +1,6 @@ import numpy as np from numpy.testing import assert_equal, assert_raises, assert_almost_equal -from skimage.measure import LineModel, CircleModel, EllipseModel +from skimage.measure import LineModel, CircleModel, EllipseModel, ransac def test_line_model_invalid_input(): @@ -35,7 +35,7 @@ def test_line_model_estimate(): model_est = LineModel() model_est.estimate(data) - # test whether estimated parameters almost equals original parameters + # test whether estimated parameters almost equal original parameters assert_almost_equal(model0._params, model_est._params, 1) @@ -72,9 +72,66 @@ def test_circle_model_estimate(): model_est = CircleModel() model_est.estimate(data) - # test whether estimated parameters almost equals original parameters + # test whether estimated parameters almost equal original parameters assert_almost_equal(model0._params, model_est._params, 1) +def test_ellipse_model_invalid_input(): + assert_raises(ValueError, EllipseModel().estimate, np.empty((5, 3))) + + +def test_ellipse_model_predict(): + model = EllipseModel() + r = 5 + 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 test_ellipse_model_is_degenerate(): + assert_equal(EllipseModel().is_degenerate(np.empty((1, 2))), True) + + +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_ransac(): + # generate original data without noise + model0 = CircleModel() + model0._params = (10, 12, 3) + t = np.linspace(0, 2 * np.pi, 1000) + data0 = model0.predict_xy(t) + outliers = (10, 30, 200) + data0[outliers[0], :] = (1000, 1000) + data0[outliers[1], :] = (-50, 50) + data0[outliers[2], :] = (-100, -10) + + # estimate parameters of corrupted data + model_est, inliers = ransac(data0, CircleModel, 3, 5) + + # test whether estimated parameters equal original parameters + assert_equal(model0._params, model_est._params) + for outlier in outliers: + assert outlier not in inliers + + if __name__ == "__main__": np.testing.run_module_suite()