OpenCV中的霍夫线变换、概率霍夫线变换

  • 1. 效果图
  • 2. 原理
    • 2.1 什么是霍夫变换?
    • 2.2 什么是概率霍夫变换?
  • 3. 源码
    • 3.1 霍夫变换
    • 3.2 概率霍夫变换
  • 参考

这篇博客将介绍Python,OpenCV中的霍夫变换。包括什么是霍夫变换(Hough Transform)、概率霍夫变换(Probablistic Hough Transform),以及如何使用cv2.HoughLines(),cv2.HoughLinesP()来检测图像中的线条。

1. 效果图

原始图 VS霍夫变换效果图如下:

图中检测了所有线,包括角度为0°~180°(红色线,经过原点下方的点)和 角度为-180°~0°的(绿色线,经过原点上方的点)。
原图 VS 概率霍夫变换效果图如下:
概率霍夫变换效果可以设置线之间的间隙大小,检测出来小的短的线;

2. 原理

任意一条线可以用 y=mx+c 进行表示,也可用( ρ,θ)表示, ρ=xcosθ+ysinθ。ρ以像素为单位,θ以弧度为单位。

如果直线从原点下方经过,它的ρ为正,角度为(0,180);如果直线从原点上方经过,ρ为负,角度为(-180,0)。任何垂直线都是0度,水平线是90度。

2.1 什么是霍夫变换?

霍夫变换是一种流行的检测任何形状的技术,即使它是有些微损坏或轻微扭曲的,它也可以成功检测。

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

  • edges:输入图像(二值图像,因此在应用hough变换查找之前,先应用阈值或canny边缘检测)
  • 1: ρ精度,ρ以像素为单位,θ以弧度为单位。
  • np.pi/180:θ精度
  • 200:阈值,假设检测线,表示被检测到的线的最短长度,低于200像素长度的将被丢弃;
  • lines: 返回值(ρ,θ),ρ以像素为单位,θ以弧度为单位。

2.2 什么是概率霍夫变换?

概率霍夫变换(Probablistic Hough Transform)是霍夫变换(Hough Transform)的优化。

  • 霍夫变换拿线的所有点参与计算,而概率霍夫变换只考虑点的一个随机子集,这对于线检测是足够的。

  • 霍夫变换返回值是( ρ,θ),而概率霍夫变换直接返回线的端点更便于操作;

lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap)

  • edages、1、np.pi/180 跟霍夫变换一致,分别为输入二值图像、ρ精度、θ精度
  • minLineLength:最小线条长度。小于此长度的线将被丢弃;
  • maxLineGap:直线段之间允许的最大间距,将其视为单线。
  • lines:它直接返回线的俩个端点。

3. 源码

3.1 霍夫变换

# 霍夫变换(可检测任意形状)# lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
# - edges:输入图像(二值图像,因此在应用hough变换查找之前,先应用阈值或canny边缘检测)
# - 1: ρ精度,ρ以像素为单位,θ以弧度为单位。
# - np.pi/100: 角度,θ精度
# - 200:阈值,假设检测线,表示被检测到的线的最短长度
# - lines: 返回值(ρ,θ),ρ以像素为单位,θ以弧度为单位。
#
# 概率霍夫变换(Probablistic Hough Transform)是霍夫变换(Hough Transform)的优化。
# 霍夫变换拿线的所有点参与计算,而概率霍夫变换不考虑所有的点,而是只考虑点的一个随机子集,这对于线检测是足够的。
# lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap)
# - edages、1、np.pi/180 跟霍夫变换一致,分别为输入二值图像、ρ精度、θ精度
# - minLineLength:最小线条长度。小于此长度的线段将被丢弃;
# - maxLineGap:直线段之间允许的最大间距,将其视为单线。
# - lines:它直接返回两条线的端点。import cv2
import imutils
import numpy as npimg = cv2.imread('hf1.jpg')
cv2.imshow("origin", imutils.resize(img, width=400))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)print(np.pi / 180, np.pi / 360)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)for i, line in enumerate(lines):for rho, theta in line:# print(rho, theta * 180 - 180)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))# 弧度转角度degree = theta * 180 - 180if (degree > 180):degree = degree - 360print(rho, degree)if rho > 0 and degree > 0:  # 经过原点下方的点,角度为正(0,180)cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)else:  # 经过原点上方的点,角度为负(-180,0)cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)cv2.imwrite('houghlines_hf.jpg', img)
cv2.imshow("hf_res", imutils.resize(img, width=400))
cv2.waitKey(0)

3.2 概率霍夫变换

# 概率霍夫变换# 霍夫变换(可检测任意形状)
# lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)
# - edges:输入图像(二值图像,因此在应用hough变换查找之前,先应用阈值或canny边缘检测)
# - 1: ρ精度
# - np.pi/100:θ精度
# - 200:阈值,假设检测线,表示被检测到的线的最短长度
# - lines: 返回值(ρ,θ),ρ以像素为单位,θ以弧度为单位。# 概率霍夫变换(Probablistic Hough Transform)是霍夫变换(Hough Transform)的优化。
# 霍夫变换拿线的所有点参与计算,而概率霍夫变换不考虑所有的点,而是只考虑点的一个随机子集,这对于线检测是足够的。
# lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength, maxLineGap)
# - edages、1、np.pi/180 跟霍夫变换一致,分别为输入二值图像、ρ精度、θ精度
# - minLineLength:最小线条长度。小于此长度的线段将被丢弃;
# - maxLineGap:直线段之间允许的最大间距,将其视为单线。
# - lines:它直接返回两条线的端点。# 概率霍夫变换(Probablistic Hough Transform)是霍夫变换(Hough Transform)的优化。
# 霍夫变换拿线的所有点参与计算,而概率霍夫变换不考虑所有的点,而是只考虑点的一个随机子集,这对于线检测是足够的。import cv2
import imutils
import numpy as npimg = cv2.imread('hf1.jpg')
cv2.imshow("origin", imutils.resize(img, width=400))
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, 10, minLineLength, maxLineGap)# 只绘制第一条线
# for x1, y1, x2, y2 in lines[0]:
#     cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)print(len(lines))
# 绘制所有检测结果
for i, line in enumerate(lines):for x1, y1, x2, y2 in line:cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imwrite('houghlines_hfp.jpg', img)
cv2.imshow("hfp_res", imutils.resize(img, width=400))
cv2.waitKey(0)

参考

  • https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html#py-hough-lines

OpenCV中的霍夫线变换、概率霍夫线变换相关推荐

  1. OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本篇文章中,我们一起探讨了OpenCV中霍夫变换相关的知识点,以及了解了OpenCV中实现霍夫线变换的HoughLines.HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircle ...

  2. 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  3. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  4. OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换

    霍夫线变换 目标 在这个部分您将学习到: 使用OpenCV的以下函数 HoughLines 和 HoughLinesP 来检测图像中的直线. 原理 Note 以下原理的说明来自书籍 学习OpenCV  ...

  5. OpenCV3之——霍夫变换(霍夫线变换和霍夫圆变换)

    霍夫变换 本文章参考@浅墨_毛星云的博客.转载请注明出处. 参考链接: http://blog.csdn.net/poem_qianmo/article/details/26977557 写作当前博文 ...

  6. 霍夫线变换,霍夫圆变化

    向浅墨学习,南航小硕很惭愧. 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/2697 ...

  7. 缺点 霍夫圆_霍夫线变换,霍夫圆变换

    在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为 ...

  8. OpenCV 中的图像处理 004_平滑图像

    本文主要内容来自于 OpenCV-Python 教程 的 OpenCV 中的图像处理 部分,这部分的全部主要内容如下: 改变色彩空间 学习在不同色彩空间之间改变图像.另外学习跟踪视频中的彩色对象. 图 ...

  9. OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    OpenCV中的图像处理 -- 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

最新文章

  1. JavaScript学习笔记(三)——数组
  2. 四. RxJava之基本原理
  3. Android--WebView显示Html,让其中的图片适应屏幕宽度
  4. BOOL,int,float,指针变量 与“零值”比较
  5. 【Pytorch学习】用pytorch搭建第一个神经网络
  6. pytest第一版 入门学习
  7. 支付宝商户代扣2.0文档
  8. 深度剖析目标检测算法YOLOV4
  9. 关 于 正 则 表 达 式 的 类 习 题
  10. Apache Hadoop 启动报错:masternode:ssh: connect to host master port 22: Connection timed out 总结
  11. 从物理页面的争抢看linux内核内存管理
  12. 目前使用的python版本_Python版本到底有多少种?
  13. VS2008 SP1安装失败
  14. 智能楼宇一卡通系统QY-LY04A
  15. 真方位角计算文献汇总:球面三角形两点之间的方位
  16. 诺亚舟linux系统游戏,【Ons模拟器下载】Ons模拟器2020电脑版 正式版-趣致软件园...
  17. 1.16 be going to and will
  18. RocketMQ消费者端消息列队六种负载均衡算法分析
  19. 基于stm32h743+rtthread的开源项目——板载资源介绍(一)
  20. oracle用户登录的3种认证方式

热门文章

  1. php 哲学家进餐,IPC问题-哲学家就餐(示例代码)
  2. java 多线程 事件_java 多线程-线程不安全案例
  3. 播放此电影需要以下插件,但尚未安装: MPEG-4 AAC decoder
  4. Android 绘制同心圆 (2个圆叠加在一起)
  5. Java开发工具简介
  6. 【luogu3398】 仓鼠找sugar [LCA 倍增]
  7. Spark ListenerBus 和 MetricsSystem 体系分析
  8. [Cake] 1. CI中的Cake
  9. [笔记]C#基础入门(八)——C#标识符的命名规则
  10. java实现时间的比较