Python OpenCV Hough直线检测算法的原理实现

作者:乔卿 时间:2021-01-29 10:10:00 

直线检测原理

核心要点:图像坐标空间、参数空间、极坐标参数空间 -> (极坐标)参数空间表决

给定一个点,我们一般会写成y=ax+b的形式,这是坐标空间的写法;我们也可以写成b=-xa+y的形式,这是参数空间的写法。也就是说,给定一个点,那么经过该点的直线的参数必然满足b=-xa+y这一条件,也就是必然在参数空间中b=-xa+y这条直线上。如果给定两个点,那么这两点确定的唯一的直线的参数,就是参数空间中两条参数直线的交点。

由于上述写法不适合处理水平或垂直的直线,我们可以使用极坐标的形式描述直线,即ρ=xcosθ+ysinθ,其中ρ是从原点到直线的垂直距离,θ是由这条垂直线和水平轴形成的角度(以逆时针方向测量),

如下图所示:

Python OpenCV Hough直线检测算法的原理实现

因此,任何垂直线θ=0,水平线θ=90°。那么极坐标参数空间中的曲线交点就是由两个点确定的一条直线,如下图所示。

Python OpenCV Hough直线检测算法的原理实现

现在让我们看看Hough变换是如何处理直线的。任何一条线都可以用这两个参数来表示(ρ,θ)。

  • 首先创建一个二维数组,即累加器,用来保存两个参数的值,然后最初将其设置为全0。让行表示ρ,列表示θ。数组的尺寸取决于所需的精度。假设希望角度的精度为1度,则需要180列,枚举0°-179°的所有情况。对于ρ,可能的最大距离是图像的对角线长度。因此,以一个像素的精度计算,行数可以是图像的对角线长度。

  • 枚举所有的点,对于每一个点,将所有经过这一点的直线对应的参数(ρ,θ)在参数空间中找到对应位置,令该位置的累加器加1,即投票。这一过程如下图所示。

Python OpenCV Hough直线检测算法的原理实现

枚举完成所有点之后,累加器中值最大的(若干个)参数组合(ρ,θ)就是经过点最多的(若干条)直线,如下图所示,两条直线对应累加器中最亮的两个点。

Python OpenCV Hough直线检测算法的原理实现

总的来说,对于多个点,我们可以用(离散)参数空间表决的方法,记录每个点对应的允许的参数组合,求得那些被允许次数最多的参数组合,就是最多点经过的直线。

在图像矫正任务中,我们经过Canny算子检测出了若干边缘点,这些点主要集中在四个边界上,因此我们只需要使用Hough直线检测,求出四条直线,就能确定四个边界。

OpenCV实现

cv.HoughLines()封装了上述步骤,该函数原型为:

cv.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

参数:

  • lines:数组,每一个元素都是一条直线对应的(ρ, θ),ρ以像素为单位,θ以弧度为单位。

  • image:输入图像,需要是二值图像,所以在应用hough变换之前应用阈值或canny边缘检测。

  • rho:ρ的精度。

  • theta:θ的精度。

  • threshold:阈值,得票数高于该值的线才被认为是线,由于投票数取决于线上的点数,所以它代表了应该被检测到的线的最小点数。

下面是具体代码:

def hough_detect(image_path):
   # 读取图像并转换为灰度图像
   image = cv2.imread(image_path)
   gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
   # 使用Canny算子检测边缘
   edges = canny_detect(image_path, False)
   # 使用Hough检测直线
   lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
   # 绘制直线
   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(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
   cv2.imshow('line,jpg', image)
   cv2.waitKey()
hough_detect('images/2.jpeg')

效果:

Python OpenCV Hough直线检测算法的原理实现

后面需要调整一下超参数。

来源:https://blog.csdn.net/qq_41112170/article/details/125729006

标签:Python,OpenCV,Hough,直线,检测,算法
0
投稿

猜你喜欢

  • Mysql 数据库双机热备的配置方法

    2010-06-09 19:13:00
  • python实现批量命名照片

    2021-11-03 18:07:42
  • IE8的一些CSS hack

    2008-03-17 13:08:00
  • Python实现Kmeans聚类算法

    2023-05-07 19:25:36
  • python模拟登录并且保持cookie的方法详解

    2023-09-06 06:07:16
  • 在Python中使用Neo4j的方法

    2023-01-16 04:12:39
  • Python 图片视频模糊化实现案例

    2023-05-28 11:50:52
  • 基于Python中isfile函数和isdir函数使用详解

    2023-05-10 00:46:50
  • Python中的下划线详解

    2021-10-24 14:17:32
  • Python新手们容易犯的几个错误总结

    2021-06-22 12:19:54
  • 基于pygame实现童年掌机打砖块游戏

    2023-09-18 20:41:28
  • HTML5本地存储初探(三)

    2010-03-07 15:49:00
  • python分割和拼接字符串

    2023-05-12 05:57:03
  • Python中os模块的12种用法总结

    2023-12-01 07:16:28
  • 程序员的七夕用30行代码让Python化身表白神器

    2023-10-26 12:27:41
  • Python实现弹球小游戏的示例代码

    2022-12-15 18:09:07
  • 关于Python字符编码与二进制不得不说的一些事

    2022-01-07 14:56:46
  • 有时间先后的翻页

    2008-05-23 13:14:00
  • python basemap 画出经纬度并标定的实例

    2023-08-23 23:26:40
  • Python Selenium自动化获取页面信息的方法

    2023-08-22 18:29:31
  • asp之家 网络编程 m.aspxhome.com