python-opencv 霍夫变换

霍夫变换

霍夫变换是经典的直线检测算法,最初用来检测图像中的直线,同时也可以将其扩展,用来检测图像中的简单几何结构(如:圆,矩形等)。

直线检测原理

理解霍夫变换直线检测原理是有必要的,理解了其原理自然能理解函数中的参数对检测的意义和作用,进而能根据自己应用场景的需求设置参数。

直线可以分别用直角坐标系和极坐标系来表示:
python-opencv 霍夫变换_第1张图片

假设在直角坐标系下分析直线检测问题:

确定参数a,b能够在直角坐标系下表示一条直线,那么存在a-b空间,使得直角坐标系上在某直线上的所有点都能映射到a-b空间上的某个点上。映射到a-b空间某点的数量越多,越可能图像存在一条直线。
通俗的讲,就是同一条直线上的点a,b值是一样的,如果能在图像上找到a,b值相同的点(并且很多),则说明存在一条由该a,b值确定的直线。
但是,由于直线的斜率可能为无穷大(垂直直线),或者无穷小(水平直线), 那么在a-b空间就不便对直线进行描述和刻画,所以有人提出采用极坐标参数空间进行直线检测。

极坐标下分析直线检测问题:

极坐标下表示直线的公式:
在这里插入图片描述
与直角坐标系的分析一样,存在一个r-θ空间,图像中同一条直线上的点会有相同的r-θ,这些点达到一定的数量,可认为存在一条直线。
python-opencv 霍夫变换_第2张图片
Opencv中先计算(r-θ)的累加数,累加数超过一定值后就认为在同一条直线上。

代码实现

Opencv中使用cv2.HoughLines()在二值图像上实现霍夫变换,函数返回的是极坐标下描述直线的(r,θ)数据(每一组r,θ数据表示一条直线)。

# 1.加载图片,转为二值图
img = cv2.imread('shapes.jpg')
drawing = np.zeros(img.shape[:], dtype=np.uint8)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)

# 2.霍夫直线变换
lines = cv2.HoughLines(edges, 0.8, np.pi / 180, 90)
参数解析
  • 参数一:要检测的二值图像(一般是边缘检测后的图像)
  • 参数二:r的变化精度,r的变化步长,上面说过要在r-θ空间上进行焦点检测,r的步长越小能检测到的直线就越多,一般设为1就够用了。
  • 参数三:角度θ变化精度,与r一样,不同是该值是弧度,一般设为1度,也就是np.pi/180
  • 参数四:累加数伐值,原理中有说到,r-θ空间上映射的某点达到一定数量时才被视为一条直线,该值就是这个数量
画出检测点
# 3.将检测的线画出来(注意是极坐标噢)
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))

    cv2.line(drawing, (x1, y1), (x2, y2), (0, 0, 255))

统计概率霍夫直线变换

前面的方法为标准的活肤变换,他会计算图像中的每一个点,计算量比较大,另外他得到的是一整条(r和θ),并不知道图像中直线的端点。所以提出了统计概率霍夫直线变换,是一种改进的霍夫变换:

# 3.统计概率霍夫线变换
lines = cv2.HoughLinesP(edges, 0.8, np.pi / 180, 90, minLineLength=50, maxLineGap=10)
参数说明

前面几个参数跟标准的霍夫变换一样,有两个可选参数:

  • minLineLength: 最短长度阀值,比这个长度短的线会被排除
  • maxLineGap:同一直线两点间的最大距离(点不连续不认为是一条直线)

输出结果自动帮我们转换到了直角坐标系,相当方便:

# 3.将检测的线画出来
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)

检测结果

python-opencv 霍夫变换_第3张图片

参考文章

https://www.jianshu.com/p/34d6dc466e81
https://blog.csdn.net/qq_40962368/article/details/81950178

学长广告

在这里为自己打个广告
学长亲自接计算机毕业设计:
有意者q746876041
在这里插入图片描述

你可能感兴趣的:(opencv,python)