霍夫变换直线检测

霍夫直线检测

设需要检测的直线为r=xcosθ+ysinθ,(1)然后对二维图像进行Canny边缘检测和二值化处理,然后遍历每一个像素点,如果检测出来边缘是白色的话就记录下该点A的x,y值按θ划分的区间进行依次带入(1)式然后算出r的值然后按区间给r投票,算出所有的θ,点A的计算完毕,然后检测到下一个白色像素的点又可以进行一次这样的投票,直到所有的边缘点都完成投票,根据一组特定的θ和r可以确定一条直线图示的表格可以看作是一组投票箱的位置,最后根据投票结果,投票数最多的最有可能是一条直线。因为在一条直线上,某一个θ来说投的都是同一个r的区间。

在这里插入图片描述

python部分代码

def lines_detector_hough(edge,ThetaDim=None,DistStep=None,threshold=None,halfThetaWindowSize=2,halfDisWindowSize=None): imgsize=edge.shape if ThetaDim=None: ThetaDim=90 if DistStep=None: DistStep=1 MaxDist=np.sqrt(imgsize[0]**2+imgsize[1]**2) DistDim=int(np.cell(MaxDist/DistDim)) if halfThetaWindowSize=None: halfThetaWindowSize=DistDim/50 accumulator=np.zeros((ThetaDim,DistDim)) sinTheta=[np.sin(t*np.pi/ThetaDim) cosTheta=[np.sin(t*np.pi/ThetaDim) for i in range(imgsize[0]): for i in range(imgsize[1]): if not edge[i,j]==0 for k in range (ThetaDim): accumulator[k][int(round(i*cosTheta[k]+j*sinTheta[k]*DistDim/MaxDist))]+=1

ThetaDim=90相当于我们的投票箱横轴有90个刻度,相当于把360度分成了90份,一份只有4度;
DistStep相当于每一个刻度代表的长度就是1;
MaxDist相当于算出图像对角线的长度也就是霍夫直线检测可以检测出的最长的直线(图像尺寸的平方开根号)np.cell(MaxDist/DistDim),最大尺寸处于刻度并向上取整即可求出最大的r.
accumulator=np.zeros((ThetaDim,DistDim))设置了横纵轴刻度的投票箱.cosTheta/sinTheta先一次性的把所有theta的位置都算出来.if not edge如果该像素位置是边,则直接投票加一,直接把round算出来,接下来进行阈值化和非极大值抑制,将不是极大值的票箱进行抑制找出极大值的位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值