霍夫圆HoughCircles()、霍夫直线检测HoughLines()、HoughLinesP()

霍夫变换原理

在(x,y)空间中我们可以用 y = k 0 x + b 0 y= k_0 x+b_0 y=k0x+b0 来表示一条直线,其中 k 0 、 b 0 k_0、b_0 k0b0是参数。

( k , b ) (k,b) (k,b)参数空间中, y = k 0 x + b 0 y=k_0x+b_0 y=k0x+b0所表示的该参数空间中的一个点(因为 k 0 , b 0 k_0,b_0 k0,b0为定值),无数条直线在该点相交(因为xy不定)
在这里插入图片描述
那么 ( k , b ) (k,b) (k,b)参数空间中,两个点(k_0,b_0),(k_1,b_1)所表示的直线为 b = ( b 1 − b 0 ) / ( k 1 − k 0 ) k + ( b 0 k 1 − b 1 k 0 ) / ( k 1 + k 0 ) b = (b_1-b_0)/(k_1-k_0)k+(b_0k_1-b_1k_0)/(k_1+k_0) b=(b1b0)/(k1k0)k+(b0k1b1k0)/(k1+k0) b = x 0 k + y 0 b=x_0k+y_0 b=x0k+y0 因此可知(k,b)空间中的一条直线能够确定(x,y)空间中的一点。

于是Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:
1)图像空间中的每条直线在参数空间中都对应着单独一个点来表示;
2)图像空间中的直线上任何一部分线段在参数空间对应的是同一个点。
因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。

但在实际应用中,参数空间是不能选择直角坐标系的,因为原始图像直角坐标空间中的特殊直线x=c(垂直x轴,直线的斜率为无穷大)是没办法在基于直角坐标系的参数空间中表示的。

对于图像空间中的垂线来说,用极坐标可以表示为:
r = x c o s θ + y s i n θ = x r = x c o s θ + y s i n θ = x r = x c o s θ + y s i n θ = x r = x c o s θ + y s i n θ = x r=xcos\theta + ysin\theta=xr=xcosθ+ysinθ=x r=xcosθ+ysinθ=xr=xcosθ+ysinθ=xr=xcosθ+ysinθ=x
在这里插入图片描述

从上面可以看到,参数空间的每个点(ρ,θ)都对应了图像空间的一条直线,或者说图像空间的一个点在参数空间中就对应为一条曲线。参数空间采用极坐标系,这样就可以在参数空间表示原始空间中的所有直线了。
注意,此时图像空间(直角坐标系x-y)上的一个点对应到参数空间(极坐标系ρ-θ)上是一条曲线,确切的说是一条正弦曲线。

在这里插入图片描述
在这里插入图片描述

在OpenCV3.0及以上版本中,霍夫直线检测算法定义了两个函数:HoughLines、HoughLinesP

霍夫直线检测HoughLines()标准霍夫变换、多尺度霍夫变换

函数说明:
HoughLines函数输出检测到直线的矢量表示集合,每一条直线由具有两个元素的矢量(ρ, θ)表示,其中ρ表示直线距离原点(0, 0)的长度,θ表示直线的角度(以弧度为单位)。
HoughLines函数无法输出图像空间中线段的长度,这也是霍夫变换本身的弱点。

lines = cv.HoughLines(dst, 1, np.pi / 180, 150, None, 0, 0)
    """
    dst:边缘检测器的输出。它应该是灰度图像(尽管实际上它是二值图像)
    lines:存储被检测直线的参数(r,θ)的向量
    rho:参数r的像素分辨率。我们使用1像素。
    θ:参数θ在弧度上的分辨率。我们用1(CV_PI/180)
    阈值:*检测*”一条直线的最小交点数
    srn和stn:默认参数为0

霍夫直线检测HoughLinesP:渐进概率式霍夫变换

HoughLinesP能够检测出线端,即能够检测出图像中直线的两个端点,确切地定位图像中的直线。
HoughLinesP函数输出检测到直线的矢量表示集合,每一条直线由具有四个元素的矢量(x1, y1, x2, y2)表示,其中(x1, y1)表示线段的起点,(x2, y2)表示线段的终点。

 linesP = cv.HoughLinesP(dst, 1, np.pi / 180, 50, None, 50, 10)
    """
    dst:边缘检测器的输出。它应该是灰度图像(尽管实际上它是二值图像)
    lines:存储检测到的行参数(xstart、ystart、xend、yend)的向量
    rho:参数r的像素分辨率。我们使用1像素。
    θ:参数θ在弧度上的分辨率。我们用1(CV_PI/180)
    阈值:*检测*”一条直线的最小交点数
    minLineLength:可以组成一条直线的最小点数。少于这个点数的直线被忽略。
    maxLineGap:认为在同一直线上的两点之间的最大间隙。

霍夫圆检测HoughCircle

circle = cv2.HoughCircles(temp,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=10,minRadius=0,maxRadius=800)

参数解释:

image:为输入图像,要求必须是灰度图像;

method:为使用霍夫变换圆检测的算法,Opencv只实现了2-1霍夫变换,它的参数是CV_HOUGH_GRADIENT;(一直都是如此)

dp:为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小 一致,dp=2时霍夫空间是输入图像空间的一半,以此类推;

minDist:为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心;

circles:为输出圆向量,每个向量包括三个浮点型的元素——圆心横坐标,圆心纵坐标和圆半径(三维数组);

注意:a , b, c = circle.shape(圆存在)(shape返回数组维数的个数的参数)

参数a代表着二维数组的个数,参数b代表着圆的数量,参数c代表着半径.

param1:有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半

param2:有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。

minRadius:有默认值0,圆半径的最小值

maxRadius:有默认值0,圆半径的最大值

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值