![]() |
OpenCV
Open Source Computer Vision
|
The Hough Transform is a popular technique to detect any shape, if you can represent that shape in a mathematical form. It can detect the shape even if it is broken or distorted a little bit. We will see how it works for a line.
A line can be represented as
So if the line is passing below the origin, it will have a positive rho and an angle less than 180. If it is going above the origin, instead of taking an angle greater than 180, the angle is taken less than 180, and rho is taken negative. Any vertical line will have 0 degree and horizontal lines will have 90 degree.
Now let's see how the Hough Transform works for lines. Any line can be represented in these two terms,
Consider a 100x100 image with a horizontal line at the middle. Take the first point of the line. You know its (x,y) values. Now in the line equation, put the values
Now take the second point on the line. Do the same as above. Increment the values in the cells corresponding to
This is how hough transform works for lines. It is simple. Below is an image which shows the accumulator. Bright spots at some locations denote they are the parameters of possible lines in the image. (Image courtesy: Wikipedia )
Everything explained above is encapsulated in the OpenCV function, cv.HoughLines(). It simply returns an array of (
We use the function: cv.HoughLines (image, lines, rho, theta, threshold, srn = 0, stn = 0, min_theta = 0, max_theta = Math.PI)
image | 8-bit, single-channel binary source image. The image may be modified by the function. |
lines | output vector of lines(cv.32FC2 type). Each line is represented by a two-element vector (ρ,θ) . ρ is the distance from the coordinate origin (0,0). θ is the line rotation angle in radians. |
rho | distance resolution of the accumulator in pixels. |
theta | angle resolution of the accumulator in radians. |
threshold | accumulator threshold parameter. Only those lines are returned that get enough votes |
srn | for the multi-scale Hough transform, it is a divisor for the distance resolution rho . The coarse accumulator distance resolution is rho and the accurate accumulator resolution is rho/srn . If both srn=0 and stn=0 , the classical Hough transform is used. Otherwise, both these parameters should be positive. |
stn | for the multi-scale Hough transform, it is a divisor for the distance resolution theta. |
min_theta | for standard and multi-scale Hough transform, minimum angle to check for lines. Must fall between 0 and max_theta. |
max_theta | for standard and multi-scale Hough transform, maximum angle to check for lines. Must fall between min_theta and CV_PI. |
In the hough transform, you can see that even for a line with two arguments, it takes a lot of computation. Probabilistic Hough Transform is an optimization of the Hough Transform we saw. It doesn't take all the points into consideration. Instead, it takes only a random subset of points which is sufficient for line detection. Just we have to decrease the threshold. See image below which compares Hough Transform and Probabilistic Hough Transform in Hough space. (Image Courtesy : Franck Bettinger's home page )
OpenCV implementation is based on Robust Detection of Lines Using the Progressive Probabilistic Hough Transform by Matas, J. and Galambos, C. and Kittler, J.V. [185].
We use the function: cv.HoughLinesP (image, lines, rho, theta, threshold, minLineLength = 0, maxLineGap = 0)
image | 8-bit, single-channel binary source image. The image may be modified by the function. |
lines | output vector of lines(cv.32SC4 type). Each line is represented by a 4-element vector (x1,y1,x2,y2) ,where (x1,y1) and (x2,y2) are the ending points of each detected line segment. |
rho | distance resolution of the accumulator in pixels. |
theta | angle resolution of the accumulator in radians. |
threshold | accumulator threshold parameter. Only those lines are returned that get enough votes |
minLineLength | minimum line length. Line segments shorter than that are rejected. |
maxLineGap | maximum allowed gap between points on the same line to link them. |