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中的数据类型可以分为以下几类: 数字(Number) 字符串(String) 列表(List) 元组(Tuple) 集合(Set) 字典(Dictionary) 布尔值(Bool) 数字(Number) Python中支持的数字类型有: 整数(int):表示…

    python 2023年5月30日
    00
  • python算法学习双曲嵌入论文方法与代码解析说明

    以下是关于“Python算法学习双曲嵌入论文方法与代码解析说明”的完整攻略: 简介 双曲嵌入是一种用于将高维数据映射到双曲空间的算法,它可以用于聚类、分类、降维等多种机器学习任务。在本教程中,我们将介绍如何使用Python实现双曲嵌入算法,并解析相关论文的方法和代码。 论文介绍 我们将使用论文《Poincaré Embeddings for Learning…

    python 2023年5月14日
    00
  • Python文件基本操作实用指南

    以下是详细讲解“Python文件基本操作实用指南”的完整攻略,包含两个示例说明。 1. 打开文件 在Python中,我们可以使用open()函数来打开一个文件。open()函数的语法如下: open(file, mode=”, buffering=-1, encoding=None, errors=None, newline=None, closefd=T…

    python 2023年5月14日
    00
  • 一篇文章带你了解谷歌这些大厂是怎么写 python 代码的

    一篇文章带你了解谷歌这些大厂是怎么写Python代码的 作为一名Python开发者,我们应该如何写出高质量、高效率的Python代码?这就需要我们去了解那些在业界颇有影响力的大厂是怎样写Python代码的。本文将以谷歌为例,带大家了解谷歌这些大厂是怎么写Python代码的。 1. 代码风格 谷歌采用了PEP 8作为Python代码风格的基本规范。PEP 8提…

    python 2023年5月18日
    00
  • 如何在Python中进行Anderson-Darling测试

    Anderson-Darling测试是一种常用的拟合优度检验方法,它可以帮助我们判断数据是否来自特定分布。在Python中,我们可以利用scipy库的stats模块来进行Anderson-Darling测试。下面是一步步的攻略: 准备工作 在进行Anderson-Darling测试之前,需要先安装好Python及相应的必要的库文件,这里我们以scipy为例。…

    python-answer 2023年3月25日
    00
  • Python使用matplotlib实现的图像读取、切割裁剪功能示例

    下面是“Python使用matplotlib实现的图像读取、切割裁剪功能示例”的完整攻略。 1. 安装matplotlib库 使用matplotlib库前,需要先安装matplotlib库。在命令行窗口运行以下命令: pip install matplotlib 2. 图像的读取 通过使用matplotlib.image模块中的imread()函数可以读取图…

    python 2023年5月18日
    00
  • python3.5安装python3-tk详解

    详细讲解“python3.5安装python3-tk详解”的完整攻略如下: 什么是Python3-tk Python3-tk是Python3.x的一个模块,用于创建图形化用户界面(GUI),它是基于Tkinter库的一个Python3.x扩展。如果想要在Python3.x中使用Tkinter库,则必须安装python3-tk包。 安装方法 以下是在Ubunt…

    python 2023年5月14日
    00
  • python元组拆包实现方法

    当我们需要同时处理多个值时,通常可以使用Python的元组类型。元组是不可变的有序序列,可以存储各种类型的数据。Python元组拆包是一种将元组中的元素分配给多个变量的快捷方式,这样我们可以很方便地进行多个变量赋值。下面是Python元组拆包实现方法的详细攻略。 实现方法 Python元组拆包实现方法主要有以下几种: 多变量赋值:将元组中的元素赋值给多个变量…

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