OpenCV
4.7.0
Open Source Computer Vision
|
Prev Tutorial: Canny Edge Detector
Next Tutorial: Hough Circle Transform
Original author | Ana Huamán |
Compatibility | OpenCV >= 3.0 |
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} = 4\), \(y_{1} = 9\) 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
Now we will apply the Hough Line Transform. We will explain how to use both OpenCV functions available for this purpose.
First, you apply the Transform:
And then you display the result by drawing the lines.
First you apply the transform:
And then you display the result by drawing the lines.
Using an input image such as a sudoku image. We get the following result by using the Standard Hough Line Transform:
And 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).