From 7a1b1c28de7fd7c1c8ad4fb43d4a9ddf1afad2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Boulogne?= Date: Tue, 6 Aug 2013 15:26:47 +0200 Subject: [PATCH] FIX: fix angle convention --- skimage/transform/_hough_transform.pyx | 9 +++++++- .../transform/tests/test_hough_transform.py | 23 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/skimage/transform/_hough_transform.pyx b/skimage/transform/_hough_transform.pyx index e5fd3ed8..db39172e 100644 --- a/skimage/transform/_hough_transform.pyx +++ b/skimage/transform/_hough_transform.pyx @@ -206,9 +206,16 @@ def hough_ellipse(cnp.ndarray img, int threshold=4, double accuracy=1, hist_max = np.max(hist) if hist_max > threshold: angle = np.arctan2(p1x - p2x, p1y - p2y) - # pi - angle to keep ellipse_perimeter() convention + # to keep ellipse_perimeter() convention if angle != 0: angle = np.pi - angle + # When angle is not in [-pi:pi] + # it would mean in ellipse_perimeter() + # that a < b. But we keep a > b. + if angle > np.pi: + angle = angle - np.pi / 2. + elif angle < - np.pi: + angle = angle + np.pi / 2. b = sqrt(bin_edges[hist.argmax()]) results.append((x0, y0, diff --git a/skimage/transform/tests/test_hough_transform.py b/skimage/transform/tests/test_hough_transform.py index c1917b66..3e5ed71c 100644 --- a/skimage/transform/tests/test_hough_transform.py +++ b/skimage/transform/tests/test_hough_transform.py @@ -165,9 +165,9 @@ def test_hough_ellipse_zero_angle(): def test_hough_ellipse_non_zero_angle(): - img = np.zeros((30, 20), dtype=int) + img = np.zeros((30, 24), dtype=int) a = 6 - b = 9 + b = 12 x0 = 10 y0 = 15 angle = np.pi / 1.35 @@ -176,10 +176,27 @@ def test_hough_ellipse_non_zero_angle(): result = tf.hough_ellipse(img, threshold=15, accuracy=3) assert_almost_equal(result[0][0] / 100., x0 / 100., decimal=1) assert_almost_equal(result[0][1] / 100., y0 / 100., decimal=1) - assert_almost_equal(result[0][2] / 100., b / 100., decimal=1) + assert_almost_equal(result[0][2] / 10., b / 10., decimal=1) assert_almost_equal(result[0][3] / 100., a / 100., decimal=1) assert_almost_equal(result[0][4], angle, decimal=1) +def test_hough_ellipse_non_zero_angle2(): + img = np.zeros((30, 24), dtype=int) + b = 6 + a = 12 + x0 = 10 + y0 = 15 + angle = np.pi / 1.35 + rr, cc = ellipse_perimeter(y0, x0, b, a, orientation=angle) + img[rr, cc] = 1 + result = tf.hough_ellipse(img, threshold=15, accuracy=3) + assert_almost_equal(result[0][0] / 100., x0 / 100., decimal=1) + assert_almost_equal(result[0][1] / 100., y0 / 100., decimal=1) + assert_almost_equal(result[0][2] / 100., a / 100., decimal=1) + assert_almost_equal(result[0][3] / 100., b / 100., decimal=1) + assert_almost_equal(result[0][4], angle, decimal=1) + + if __name__ == "__main__": np.testing.run_module_suite()