python hough变换检测直线的实现方法

Python Hough变换检测直线的实现方法

Hough 变换是一种在图像处理中常用的技术,可以用来检测直线等形状,它的基本思路是将直角坐标系中的点映射到极坐标系中,在极坐标系中,一条直线对应着一个点,在极坐标系中检测直线等形状比在直角坐标系中更方便。python 提供了很多库可以实现 Hough 变换检测直线,本文将介绍其中的 hough_lines 和 hough_lines_p 两个函数的用法。

安装

在使用之前,需要在python中安装相应的库,其中最重要的是 OpenCV 库,在终端中输入以下命令可以安装 OpenCV 库,其它库都可以通过pip命令安装:

pip install opencv-python numpy matplotlib

hough_lines

基本方法

hough_lines 函数可以直接通过 OpenCV 库的 cv2.HoughLines() 调用。这个函数的主要参数是二值化后的图像,第二个参数是ρ 的精度,第三个参数是θ 的精度。ρ 是指从原点到直线的垂线距离,θ 是直线与 x 轴正方向的直线夹角,第四个参数是阈值,即检测到的直线的数量。

import cv2
import numpy as np

img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
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(img,(x1,y1),(x2,y2),(0,0,255),2)

cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个功能非常简单,以下是对代码的解释。首先进行 Canny 边缘检测,并将图像转换为灰度图像:

img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

然后使用 cv2.HoughLines() 检测图像中的直线:

lines = cv2.HoughLines(edges,1,np.pi/180,200)

其中,第一个参数 edges 是一张二值化过的图像, 二值化后的灰度图像所显示的所有边缘都被运算了 Hough 变换,第二个和第三个参数分别代表单位长度的精度,在这里以像素为单位。第四个参数是在 滤波阈值内检测出来的直线才会被绘制,这个参数越大, 要求的线段就越为明显,如果滤波阈值是一个极小值(比如 20), 使用其他图片时就极少会检测出线段。

接下来,使用 for 循环遍历找到的每条直线,然后将其显示在原图上:

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(img,(x1,y1),(x2,y2),(0,0,255),2)

最后,使用 cv2.imshow() 将两张图像显示出来:

cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例

在这个示例中,我们将运行上面的代码来检测一张图像中的直线。

假设我们有一张名为 test.jpg 的图片,其中包含了几条直线,我们将这张图像指定给第一行代码中的 imread() 函数。运行程序之后,它将显示出原始图像,以及用线段显示出检测到的直线的图像。

hough_lines_p

基本方法

hough_lines_p 函数是 OpenCV 库中的另外一个实现 Hough 变换检测直线的函数。在使用 hough_lines_p 函数中,不需要特殊指定斜率和截距的范围,它可以自动调整大小,以确定最佳 Hough 线条的数量。

import cv2
import numpy as np

img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)

for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是对代码的解释。首先,我们进行 Canny 边缘检测并使用 cv2.HoughLinesP() 检测图像中的直线:

img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)

其中,第二和第三个参数是距离精度和角度精度。 第四个参数是最小直线长度,第五个参数是用于网络连接确定线段的最大允许间距。

最后,使用 for 循环遍历找到的每条直线,然后将其显示在原图上:

for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

最后,使用 cv2.imshow() 将两张图像显示出来:

cv2.imshow('Edges',edges)
cv2.imshow('Result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例

在这个示例中,我们将运行上面的代码来检测一张图像中的直线。

假设我们有一张名为 test.jpg 的图像,其中包含了几条直线,我们将这张图像指定给第一行代码中的 imread() 函数。运行程序之后,它将显示出原始图像以及用线段显示出检测到的直线的图像。

以上就是 Hough 变换检测直线的两种 python 实现方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python hough变换检测直线的实现方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python中的异常处理讲解

    Python中的异常处理攻略 什么是异常? 在Python中,异常指的是程序运行时遇到的错误或者异常情况。这些错误可能是由于输入不当、系统错误、文件不存在等等原因造成的。当程序出现异常时,Python会自动抛出一个异常对象,如果不对这个异常进行处理,程序就会崩溃。 异常处理的方式 Python提供了多种异常处理的方式。一般来说,可以将异常处理分为以下几步: …

    python 2023年5月13日
    00
  • Python格式化日期时间操作示例

    下面是Python格式化日期时间操作的完整攻略。 格式化日期时间字符串的基本介绍 Python的datetime模块提供了一组处理日期和时间的类和函数,可以方便地进行日期和时间的计算和格式化输出。其中,strftime()方法用于将日期时间对象格式化为指定格式的字符串,strptime()方法则用于将字符串解析为日期时间对象。 strftime()方法 st…

    python 2023年6月2日
    00
  • 用python写的一个wordpress的采集程序

    下面是详细讲解用 Python 写的 WordPress 采集程序的完整攻略。 什么是 WordPress 采集程序 WordPress 采集程序是一种自动化爬虫程序,用于采集 WordPress 站点上的文章、标签、分类等内容,并把采集的数据转化为特定格式,以备后续处理。采集程序可以帮助我们快速获取需要的数据,从而提高数据处理效率。 如何编写 WordPr…

    python 2023年6月3日
    00
  • Python入门之列表用法详解

    以下是详细讲解“Python入门之列表用法详解”的完整攻略。 在Python中,列表是一种非常常用的数据类型,它可以存储多个值,并且可以进行添加、删除、修改等操作。本文将介绍列表的基本用法,并提供两个示例说明。 列表的基本用法 创建列表 可以使用方括号[]来创建一个列表,其中每个元素之间用逗号隔开。例如: lst = [1, 2, 3, 4, 5] 上述代码…

    python 2023年5月13日
    00
  • 在Python 3中实现类型检查器的简单方法

    下面就是详细讲解“在Python 3中实现类型检查器的简单方法”的攻略。 概述 Python 是一种动态弱类型的语言,使得在编写程序时出现错误的可能性增大,尤其是涉及到类型的错误。在 Python 3 中,我们可以通过类型注释来对变量、函数的参数和返回值进行标注,然后利用第三方模块 mypy 实现类型检查。 步骤 第一步:安装 mypy 在命令行中输入以下指…

    python 2023年5月13日
    00
  • python Opencv实现停车位识别思路详解

    关于“python OpenCV实现停车位识别思路详解”,我可以提供以下攻略。 标准车道检测流程 车道检测技术是停车位识别技术的先决条件,如果车道无法识别,那么停车位检测也就无从谈起。车道检测的主要流程如下: 图像预处理:首先,需要进行图像预处理,去掉图像中不必要的信息,比如车道外的景物、天空、交通指示牌等。预处理的方式可以是灰度化、二值化或者高斯滤波等。 …

    python 2023年5月19日
    00
  • 浅谈Python模块导入规范

    浅谈Python模块导入规范 在Python中,模块的导入是非常重要的一环,因为它不仅可以组织代码和提高代码的复用率,还可以提高代码的可读性和可维护性。在Python中,有多种不同的模块导入方式,那么我们应该如何规范地导入模块呢? 模块的导入方式 在Python中,主要有三种模块导入方式: import 语句 import 语句允许我们导入一个模块或者一个模…

    python 2023年5月14日
    00
  • Python闭包思想与用法浅析

    Python闭包思想与用法浅析 什么是闭包 闭包(closure)是函数式编程的重要的语法结构,是一种特殊的内嵌函数。闭包定义在外层函数中,而且可以引用外层函数的局部变量,将外层函数与内层函数连接起来形成一种闭合的状态。 在Python中,只要在一个函数中,定义了另外一个函数,且内部函数使用了外部函数的变量,那么这个外部函数,就称为闭包。 闭包的优点 闭包的…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部