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

yizhihongxing

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日

相关文章

  • 使用Python3 编写简单信用卡管理程序

    以Python3编写简单信用卡管理程序,需要以下步骤: 步骤1:创建数据库 可以使用SQLite数据库,即Python自带的轻量级关系型数据库,以下是创建数据库的代码块: import sqlite3 # 连接数据库 conn = sqlite3.connect(‘card_manage.db’) # 创建curson对象 cursor = conn.cur…

    python 2023年6月3日
    00
  • 快速了解Python相对导入

    以下是关于 Python 相对导入的快速了解攻略: 问题描述 在 Python 中,相对导入是指在一个包中导入另一个包中的模块。相对导入的语法比较特殊,容易引起混淆。本文将快速介绍 Python 中相对导入的语法和用法。 解决方法 以下是 Python 中相对导入的语法和用法: 相对导入的语法 相对导入的语法使用点号(.)表示相对路径。例如,如果要从包中导入…

    python 2023年5月13日
    00
  • 使用python实现excel的Vlookup功能

    下面我将详细讲解使用python实现excel的Vlookup功能的完整实例教程。 简介 Vlookup是Excel中的一个非常常用的函数,它可以在一个范围内查找某个值,并返回其在此范围内的对应值。Python中有一些库可以实现类似的功能,比如pandas和openpyxl等。在这个例子中,我们将使用pandas库来完成这个功能。 步骤 1. 安装panda…

    python 2023年5月13日
    00
  • Python制作动态词频条形图的全过程

    下面详细讲解Python制作动态词频条形图的全过程。 环境准备 首先,需要准备好Python的开发环境。推荐采用Anaconda的发行版,它集成了常用的数据科学工具和库,方便我们进行数据处理和可视化。 需要用到的两个主要的库:matplotlib和wordcloud。其中,matplotlib用于绘制条形图,wordcloud用于生成词云图。 除此之外,还需…

    python 2023年6月3日
    00
  • Mac下python包管理工具pip的安装

    下面是在Mac下安装pip的完整攻略: 安装pip 第一步:下载get-pip.py文件 打开终端(Terminal)应用程序,运行以下命令在https://bootstrap.pypa.io/get-pip.py下载get-pip.py文件: curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 第…

    python 2023年5月14日
    00
  • python中小数点后的位数问题

    Python 中小数点后的位数问题在数值计算中是一个重要的问题,下面详细介绍如何控制Python小数点后的位数。 控制小数点的位数 Python中的浮点数默认以十进制显示,一般情况下小数点后只显示6位,如下所示: >>> a = 1.23456789 >>> a 1.23456789 如果我们想控制小数点后位数的话,一般有…

    python 2023年6月3日
    00
  • Python安装Bs4的多种方法

    安装Bs4的多种方法,我这里介绍3种常用的方法。 方法一:使用pip安装 打开终端或者命令行窗口(Windows用户可以使用cmd或PowerShell)。 输入以下命令并按回车: pip install beautifulsoup4 等待Bs4安装完毕即可。 方法二:使用easy_install安装 安装easy_install。easy_install是…

    python 2023年5月14日
    00
  • Python 自由定制表格的实现示例

    Python 自由定制表格的实现示例 Python 作为一门非常强大的编程语言,有着丰富的库和工具包。其中,pandas 库提供了一种十分灵活和强大的方式来构建和操作表格。本文将介绍如何使用 pandas 库创建自由定制的表格。本文使用的环境如下: Python 3.8.5 pandas 1.1.3 1. 创建表格 在 pandas 库中,我们可以使用 Da…

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