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).