![]() |
OpenCV
3.0.0-rc1
Open Source Computer Vision
|
In this tutorial you will learn how to:
As you know, a line in the image space can be expressed with two variables. For example:
For Hough Transforms, we will express lines in the Polar system. Hence, a line equation can be written as:
y = \left ( -\dfrac{\cos \theta}{\sin \theta} \right ) x + \left ( \dfrac{r}{\sin \theta} \right )
Arranging the terms: r = x \cos \theta + y \sin \theta
In general for each point (x_{0}, y_{0}), we can define the family of lines that goes through that point as:
r_{\theta} = x_{0} \cdot \cos \theta + y_{0} \cdot \sin \theta
Meaning that each pair (r_{\theta},\theta) represents each line that passes by (x_{0}, y_{0}).
If for a given (x_{0}, y_{0}) we plot the family of lines that goes through it, we get a sinusoid. For instance, for x_{0} = 8 and y_{0} = 6 we get the following plot (in a plane \theta - r):
We consider only points such that r > 0 and 0< \theta < 2 \pi.
We can do the same operation above for all the points in an image. If the curves of two different points intersect in the plane \theta - r, that means that both points belong to a same line. For instance, following with the example above and drawing the plot for two more points: x_{1} = 9, y_{1} = 4 and x_{2} = 12, y_{2} = 3, we get:
The three plots intersect in one single point (0.925, 9.6), these coordinates are the parameters ( \theta, r) or the line in which (x_{0}, y_{0}), (x_{1}, y_{1}) and (x_{2}, y_{2}) lay.
OpenCV implements two kind of Hough Line Transforms:
a. The Standard Hough Transform
b. The Probabilistic Hough Line Transform
Using an input image such as:
We get the following result by using the Probabilistic Hough Line Transform:
You may observe that the number of lines detected vary while you change the threshold. The explanation is sort of evident: If you establish a higher threshold, fewer lines will be detected (since you will need more points to declare a line detected).