[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码

这篇具有很好参考价值的文章主要介绍了[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

理论

[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码

如上图,左边a,b固定可以确定一条直线,线是() 组成的集合.

下面从xy空间变化到ab空间,此时给定一个绿点()可以确定一条绿色的线,给定一个蓝点 

()可以确定一条蓝色的线,绿线和蓝线相交的点就是左边确定红线的参数a和b.此时xy空间里红线上的其他点,变换到ab空间必过蓝绿线相交点.

下面把ab换成rho和theta.

rho = x cos (theta) + y sin (theta)  这里面rho 是原点到直线的垂直距离,和 theta是由这条垂直线和逆时针测量的水平轴形成的角度(该方向因您表示坐标系的方式而异。OpenCV 中使用了这种表示)。检查下面的图像:

[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码

所以如果线在原点以下通过,它会有一个正的 rho 并且角度小于 180。如果它在原点之上,而不是取大于 180 的角度,而是取小于 180 的角度,并且 rho被取为阴性。任何垂直线将具有 0 度,水平线将具有 90 度。

现在让我们看看霍夫变换如何处理线条。任何线都可以用这两个术语表示,(rho, theta). 因此,首先创建一个二维数组或累加器(以保存两个参数的值),并且最初设置为 0。让行表示(rho) 和列表示 (theta). 数组的大小取决于您需要的精度。假设您希望角度精度为 1 度,您将需要 180 列。对于(rho),可能的最大距离是图像的对角线长度。所以取一像素精度,行数可以是图像的对角线长度。

考虑一个 100x100 的图像,取一个点。你知道它的 (x,y) 值。现在在线方程中,输入值(theta = 0,1,2,....,180) 并检查 (rho)你得到。对于每(rho,theta) 对,您在相应的累加器中将值增加 1 ,所以现在在累加器中,单元格 (50,90) = 1 以及其他一些单元格。

现在取直线上的第二个点。执行与上述相同的操作。增加与您获得的单元格相对应的值。这样,最后,(rho,theta) 单元格累积数越多,说明过这条线的点越多,当大于某一阈值的时候,我们说这是我们要找的一条直线.

OpenCV 中的霍夫变换

上面解释的所有内容都封装在 OpenCV 函数cv2.HoughLines() 中。它只是返回一组(rho, theta)列表。rho以像素为单位测量,并且theta以弧度为单位。第一个参数,输入图像应该是一个二值图像,所以在应用霍夫变换之前应用阈值或使用精明的边缘检测。第二个和第三个参数分别是rho 和theta的精度。第四个参数是阈值,这意味着它应该被视为一条线的最低投票数。请记住,投票数取决于线上的点数。所以它可能代表了应该检测的最小线长。

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

例子代码:

import cv2
import numpy as np

img = cv2.imread('../data/sudoku.png')
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.imwrite('houghlines3.jpg',img)

[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码

 概率霍夫变换

在霍夫变换中,您可以看到,即使对于具有两个参数的行,也需要进行大量计算。概率霍夫变换是我们看到的霍夫变换的优化。它没有考虑所有要点。相反,它只需要一个足以进行线检测的随机点子集。只是我们必须降低阈值。请参见下图,它比较了霍夫空间中的霍夫变换和概率霍夫变换。

[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码

OpenCV 实现基于 Matas, J. 和 Galambos, C. 和 Kittler, JV [55]使用渐进式概率霍夫变换对线条进行鲁棒检测。使用的函数是cv2.HoughLinesP()。它有两个新参数。

  • minLineLength - 线的最小长度。比这短的线段被拒绝。
  • maxLineGap - 线段之间的最大允许间隙,将它们视为一条线。

好处是,它直接返回线的两个端点。在前面的例子中,你只得到线的参数,你必须找到所有的点。在这里,一切都是直接而简单的。

示例代码:

import cv2
import numpy as np

img = cv2.imread('../data/sudoku.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength=100,maxLineGap=10)
for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv2.imwrite('houghlines5.jpg',img)

[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码

参考英文链接:

https://vovkos.github.io/doxyrest-showcase/opencv/sphinxdoc/page_tutorial_py_houghlines.html文章来源地址https://www.toymoban.com/news/detail-457351.html

到了这里,关于[图解]cv2.HoughLines() 和 cv2.HoughLinesP()原理和代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python——使用cv2拼接图片(含代码)

    很多时候我们需要把几张图片拼到一起,当然可以使用PS之类的软件来处理,但是使用python更快并且能批量处理。 假设我们有三张图片:        使用代码把他们横向拼到一起:  当然也可以纵向: 直接上代码,这里需要使用python的cv2模块:

    2024年02月13日
    浏览(48)
  • 解决opencv / cv2 没有代码提示的问题

    在pycharm中初次使用cv2这个包时一般会遇到没有代码提示的问题。 直接 import cv2 ,在调用函数时是没有代码提示的。 有的文章说应该: from cv2 import cv2 as cv ,但是这样有可能会报错说 在__init__.py 中找不到引用cv2, 或者 import cv2.cv2 as cv ,报错为 没有名为cv2的模块 还有可能是

    2024年02月06日
    浏览(53)
  • 【OpenCV】仿射变换中cv2.estimateAffine2D 的原理

    目录 一、介绍 二、仿射变换矩阵 (M) 1.M中六个元素的说明 2.计算旋转角度 3.M的计算过程 三、输出状态 (inliers) 四、错切参数 1.错切参数的定义 2.错切参数例子 (1)水平错切 (2)垂直错切         cv2.estimateAffine2D 是 OpenCV 库中的一个函数,用于估计两个二维点集之间的

    2024年02月04日
    浏览(45)
  • opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale()

    人脸识别是指程序对输入的人脸图像进行判断,并识别出其对应的人的过程。人脸识别程 序像我们人类一样,“看到”一张人脸后就能够分辨出这个人是家人、朋友还是明星。 当然,要实现人脸识别,首先要判断当前图像内是否出现了人脸,也即人脸检测。只有检 测到图像

    2024年02月09日
    浏览(48)
  • Pycharm中opencv/cv2无代码提示问题

    在Pycharm中配置opencv环境是碰到这样import cv2 后输入cv2.后无代码提示并且按住Ctrl + 鼠标左键后无法进入cv2函数的问题。之后我在网上找了许多博客,也试了许多方法,经过几次试验,发现在将cv2文件夹中的cv2.pyd文件放到cv2下的data文件夹中,即可解决问题。原理如此篇文章所示

    2024年02月11日
    浏览(49)
  • PyCharm中python导入cv2函数报黄(标黄)且没有代码提示【已解决√】

    PyCharm中python导入cv2函数一直标黄,看着很不舒服 之前老版本(不记得具体版本了)按照这个教程弄好了:https://blog.csdn.net/qq_44878920/article/details/124755978 现在新版本的PyCharm(2022.3)竟然操作不太一样,一时半伙儿没反应过来怎么设置,摸索了一会儿成功了,步骤如下(同样适合

    2024年02月11日
    浏览(62)
  • opencv视频截取每一帧并保存为图片python代码CV2实现练习

    当涉及到视频处理时,Python中的OpenCV库提供了强大的功能,可以方便地从视频中截取每一帧并将其保存为图片。这是一个很有趣的练习,可以让你更深入地了解图像处理和多媒体操作。 使用OpenCV库,你可以轻松地读取视频文件,并在循环中逐帧读取视频的每一帧。随后,你可

    2024年02月12日
    浏览(52)
  • opencv-python库 cv2 图形绘制 cv2.line()cv2.rectangle()cv2.circle()cv2.ellipse()cv2.polylines()cv2.putText

    cv2.line() 是 OpenCV 中的一个函数,用于在图像上绘制直线。这个函数需要指定图像、线的起点和终点坐标、线的颜色、线的宽度以及线的类型。 下面是 cv2.line() 函数的详细参数说明: 参数解释: 下面是一个使用 cv2.line() 绘制直线的简单示例: 在这个例子中,我们创建了一个

    2024年04月23日
    浏览(46)
  • 【cv2.imread】与【cv2.imdecode】用法

    对于路径中含有中文的图像,直接用cv2.imread读取会报错,上次看到有大佬使用cv2.imdecode就可以正常读取,有点好奇,所以今天来记录下二者用法和区别。 目录  1.读取图像的两种方式对比  2.保存图像的两种方式对比   cv2.imread正常读取影像 运行上述代码,会 报错! cv2.imd

    2024年02月02日
    浏览(48)
  • CV2逐步学习-2:cv2.GaussianBlur()详解

    目录 高斯模糊GaussianBlur()中 参数详解 1.1. 由参数解释产生的 问题 深入理解前的准备: 高斯函数、图像滤波处理及卷积核 解释1.1的问题 权重矩阵 、高斯模糊的流程 摘要 高斯滤波是一种 线性平滑滤波 高斯滤波是对整幅图像进行 加权平均的过程 ,每一个像素点的值都由其本

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包