霍夫变换直线检测

霍夫变换直线检测的理解

霍夫直线检测

设需要检测的直线为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算出来,接下来进行阈值化和非极大值抑制,将不是极大值的票箱进行抑制找出极大值的位置。

发布了40 篇原创文章 · 获赞 0 · 访问量 2103

猜你喜欢

转载自blog.csdn.net/DDWDDZY/article/details/105059917