实现流程

  • 假设有一个大小为100*∗100的图片,使用霍夫变换检测图片中的直线,则步骤如下所示:

直线都可以使用(ρ,θ) 表示,首先创建一个2D数组,我们叫做累加器,初始化所有值为0,行表示ρ,列表示θ。


该数组的大小决定了结果的准确性,若希望角度的精度为1度,那就需要180列。对于ρ,最大值为图片对角线的距离,如果希望精度达到像素级别,行数应该与图像的对角线的距离相等。

取直线上的第一个点(x,y)(x,y),将其带入直线在极坐标中的公式中,然后遍历θ的取值:0,1,2,…,180,分别求出对应的ρ值,如果这个数值在上述累加器中存在相应的位置,则在该位置上加1.

取直线上的第二个点,重复上述步骤,更新累加器中的值。对图像中的直线上的每个点都直线以上步骤,每次更新累加器中的值。

搜索累加器中的最大值,并找到其对应的(ρ,θ),就可将图像中的直线表示出来。


cv.HoughLines(img, rho, theta, threshold)
  • img: 检测的图像,要求是二值化的图像,所以在调用霍夫变换之前首先要进行二值化,或者进行Canny边缘检测

  • rho、theta: ρ 和 θ的精确度

  • threshold: 阈值,只有累加器中的值高于该阈值时才被认为是直线。

注意:该方法输入是的二值化图像,在进行检测前要将图像进行二值化处理

import numpy as np
import random
import cv2 as cv
import matplotlib.pyplot as plt
# 1.加载图片,转为二值图
img = cv.imread('./1.png')gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 530, 850)# 2.霍夫直线变换
lines = cv.HoughLines(edges, 0.1, np.pi / 90, 75)# 3.将检测的线绘制在图像上(注意是极坐标噢)
for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv.line(img, (x1, y1), (x2, y2), (0, 255, 0))# 4. 图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.imshow(img[:, :, ::-1]),
plt.title('霍夫变换直线检测')
plt.xticks([]), plt.yticks([])
plt.show()

原图

霍夫变换直线检测

OpenCV 霍夫线检测相关推荐

  1. opencv 提取图像线条 霍夫线检测

    # Writer : wojianxinygcl@163.com # Data : 2020.3.21import cv2 as cv import numpy as npimg = cv.imrea ...

  2. OpenCV 霍夫线变换Hough Line Transform

    OpenCV 霍夫线变换Hough Line Transform 霍夫线变换Hough Line Transform 目标 理论 霍夫线变换 它是如何工作的? 标准概率霍夫线变换 这个程序做什么? 代 ...

  3. OpenCV_09 模版匹配和霍夫变换:霍夫线检测+霍夫圆检测

    1 模板匹配 1.1 原理 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最 ...

  4. OpenCV霍夫圈检测Hough Circle Detection的实例(附完整代码)

    OpenCV霍夫圈检测Hough Circle Detection的实例 OpenCV霍夫圈检测Hough Circle Detection的实例 OpenCV霍夫圈检测Hough Circle De ...

  5. OpenCV霍夫直线检测的实例(附完整代码)

    OpenCV霍夫直线检测的实例 OpenCV霍夫直线检测的实例 OpenCV霍夫直线检测的实例 #include <opencv2/imgproc.hpp> #include <op ...

  6. OpenCV霍夫线圆HoughLinesCircles的实例(附完整代码)

    OpenCV霍夫线圆HoughLinesCircles的实例 OpenCV霍夫线圆HoughLinesCircles的实例 OpenCV霍夫线圆HoughLinesCircles的实例 #includ ...

  7. opencv 霍夫线变换

    霍夫线变换 霍夫线变换是一种用来寻找直线的方法. 是用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像. 它是如何实现的? 众所周知, 一条直线在图像二维空 ...

  8. Python OpenCV -- 霍夫线变换(十二)

    霍夫线变换 1. 霍夫线变换是一种用来寻找直线的方法. 2. 是用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像. 实现: 1.  一条直线在图像二维空间 ...

  9. OpenCV 霍夫圆检测

    圆的表示式是: 其中aa和bb表示圆心坐标,rr表示圆半径,因此标准的霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆形检测,此时效率就会很低,所以OpenCV中使用霍夫梯度法进行圆形的检测. ...

最新文章

  1. sqlce wp from查询语句详解
  2. @import注解使用
  3. php layui实现添加input,Layui实现input输入和选择的方法
  4. Web 设计中的苹果风
  5. 细聊分布式ID生成方法
  6. 可视化计算java_Java可视化计算器
  7. 学生用计算机说明方法,15.文中多处运用了作比较的说明方法.请任选一例.说说运用这种方法的作用. 例子: 作用:...
  8. (计算机组成原理)第一章计算机系统概述-第四节:计算机的性能指标
  9. 从梯度下降到ADMM-学习记录
  10. SurfaceView的经典写法
  11. 别不把自己当有钱人 ——让白领族成为百万富翁族的六大理财秘籍
  12. 软件开发常用设计模式—单例模式总结(c++版)
  13. 阿里云储存OSS(服务端签名后前端直传)
  14. 数据流图、业务流程图、E-R图、系统功能结构图、程序流程图
  15. php 生成小程序码
  16. java for 死循环_一个Java For语句死循环的例子源码
  17. 解决JSONNull导致的JSONObject序列化问题
  18. 某蒟蒻无聊竟用UNO做了个复读机?
  19. ACM教程 - (数论)正整数分解使得乘积最大问题
  20. GitHub 上 100K+ Star 的前端面试开源项目汇总(进大厂必备)

热门文章

  1. Git版本服务器搭建(CentOS)--gitblit
  2. MapReduce数据连接
  3. /usr/lib/ocf/resource.d/pacemaker/ping: line 296
  4. SQL:找出我(uid=2)所有的好友信息,和这些好友发布的最新的一篇文章
  5. matlab int8 矩阵,unit8_matlab数据类型转换——int8转换成unit8
  6. php 线程锁,如何使用python线程锁(实例解析)
  7. Java 性能优化实战记录(3)--JVM OOM的分析和原因追查
  8. 详解RMQ LCA
  9. Yacc 与 Lex 快速入门(词法分析和语法分析)
  10. Golang中常用的并发模型