Files
scikit-image/doc/source/tutorials/hough_transform.txt
T
Pieter Holtzhausen 6df94d2fdd Tutorial save figs
2011-08-22 15:36:20 +02:00

134 lines
3.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
***************
Hough transform
***************
The Hough transform in its simplest form is a method to detect straight lines.
http://en.wikipedia.org/wiki/Hough_transform
As a first example we construct a line intersection.
.. ipython::
In [1]: import numpy as np
In [2]: from scikits.image.transform import hough, probabilistic_hough
In [3]: import matplotlib.pyplot as plt
In [4]: from matplotlib.lines import Line2D
In [5]: image = np.zeros((100, 100))
In [6]: for i in range(25, 75):
...: image[100 - i, i] = 255
...: image[i, i] = 255
...:
In [7]: plt.imshow(image)
@savefig hough_original.png width=4in
In [8]: plt.show()
The Hough transform converts the image into a parameter space that represents
lines. A line can be represented by the distance r of its closest point to the
origin and by the angle theta of this vector.
Every non-zero pixel of the image votes for potential line candidates, and the
local maxima represents the parameters of probable lines.
.. ipython::
In [9]: h, theta, d = hough(image)
In [10]: plt.figure()
In [10]: plt.title("hough transform")
In [10]: plt.xlabel("degrees")
In [10]: plt.ylabel("distance")
In [11]: plt.imshow(h)
@savefig hough_transform.png width=4in
In [12]: plt.show()
As can be seen, the maxima occur at 45 and 135 degrees, corresponding to the
normal vector angles of each line.
Another method is to use the function probabilistic_hough, an implementation
based on the Progressive Probabilistic Hough Transform [1]. It states that a
random subset of voting points give good enough results, and that lines can
be extracted during the voting process by walking along connected components.
This returns the beginning and end of line segments, which are useful.
The function has three parameters: a general threshold that is applied to
the Hough accumulator, a minimum line length and the line gap that influences
line merging.
.. ipython::
In [13]: lines = probabilistic_hough(image, threshold=10, line_length=10, line_gap=1)
In [14]: plt.figure()
In [15]: for line in lines:
....: p0, p1 = line
....: plt.plot((p0[0], p1[0]), (p0[1], p1[1]))
....:
@savefig hough_probabilistic1.png width=4in
In [16]: plt.show()
The Hough transform are often used on edge detected images.
.. ipython::
In [17]: from scikits.image.io import imread
In [18]: from scikits.image import data_dir
In [19]: from scikits.image.filter import canny
In [20]: image = imread(data_dir + "/camera.png")
In [21]: edges = canny(image, 2, 1, 25)
In [22]: plt.imshow(edges)
@savefig hough_edge_detected.png width=4in
In [23]: plt.show()
Apply the Probabilistic Hough Transform and find lines longer than 10 with a
gap less than 3 pixels.
.. ipython::
In [24]: plt.figure()
In [25]: plt.imshow(np.zeros(edges.shape))
In [26]: lines = probabilistic_hough(edges, threshold=10, line_length=5, line_gap=3)
In [27]: for line in lines:
....: p0, p1 = line
....: plt.plot((p0[0], p1[0]), (p0[1], p1[1]))
....:
@savefig hough_lines.png width=4in
In [28]: plt.show()
References
----------
.. [1] C. Galamhos, J. Matas and J. Kittler,"Progressive probabilistic Hough
transform for line detection", in IEEE Computer Society Conference on
Computer Vision and Pattern Recognition, 1999.
[2] Duda, R. O. and P. E. Hart, "Use of the Hough Transformation to Detect
Lines and Curves in Pictures," Comm. ACM, Vol. 15, pp. 1115 (January,
1972)