mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-29 11:01:19 +08:00
134 lines
3.6 KiB
Plaintext
134 lines
3.6 KiB
Plaintext
***************
|
||
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. 11–15 (January,
|
||
1972)
|