霍夫变换
一、霍夫直线检测
霍夫变换(Hough Transfrom),是1972年提出的,最开始就是用来在图像中检测直线,后来扩展能检测圆、曲线等
原理:
图像是一个个离散的像素点构成,如果在图像中有一条直线,那也是一系列的离散点构成。
一条直线可以用方程式:y=kx+b表示,k是斜率,b是截距,(x,y)也是点。我们可以转换成b=-kx+y。我们可以把(k,b)看作另外一个空间的点
我们看到,在x-y图像空间中的一个点,变成了k-b参数空间中的一条线,而x-y图像空间中的2个点连成的线,变成了k-b参数空间中的一个交点
所以,霍夫变换检测直线的原理就是:
如果x-y图像空间中有很多点在k-b空间中相交于一点,那么这个交点就是我们要检测的直线
有一个问题需要注意,图像空间中如果一条直线是垂直的,那么斜率k是没有定义的(或者说无穷大)。为了避免这个问题,霍夫变换采用了另一个参数空间:距离-角度参数空间
那么在图像中,每个点都可以用距离和角度来表达
点(x,y)与距离和角度的关系变成了r=xcosθ+ysinθ
在新的距离-角度参数空间中,图像中的一个点变成了一个正弦曲线,而不是k-b参数空间中的直线了。这些正弦曲线的交点就是图像空间中我们要检测的直线了
每一个(r,θ)都表示一条经过(x0,y0)直线,那么同一条直线上的点必然会有同样的(r,θ)。如果将某个点所有的(r,θ)绘制成下面的曲线,那么同一条直线上的点的(r,θ)曲线会相交于一点
函数:(cv2.HoughLines(src, 1, np.pi/180,200))
(1)参数是输入图像,且必须是二值图像,在进行霍夫变换之前需要采用阈值方法的边缘检测;
第二和第三个参数分别是r,θ对应的精度;
第四个参数是阈值,判定为直线投票数的最小值;
注意,投票数取决于直线上点的个数,因此这个阈值代表了检测到的直线的最短长度
霍夫变换的应用:用于分离图像中特殊形状的特征
可以容忍特征边界描述的误差,并且不受噪声的干扰
广泛用于条形码扫描、验证和识别
二、霍夫圆检测
假设一个圆,半径为r,圆心为(a,b),我们将其表示为:
1.png
HoughCircles( InputArray image, OutputArray circles, Int method, Double dp, Double mindist, Double param1, ouble param2, Int minradius, Int maxradius )
参数:
image:输入图像 ,必须是8位的单通道灰度图像
circles: 输出结果,发现的圆信息 (x, y, radius)
method: 方法 CV_HOUGH_GRADIENT
dp = 1:用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。
mindist:10 最短距离-可以分辨是两个圆的,否则认为是同心圆。这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆。反之,这个参数设置太大的话,某些圆就不能被检测出来了。
param1:它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
param2:中心点累加器阈值 – 候选圆心。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
minradius, // 最小半径
maxradius//最大半径