点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

今天我们将学习如何借助霍夫变换技术来检测图像中的直线和圆。

什么是霍夫空间?

在我们开始对图像应用霍夫变换之前,我们需要了解霍夫空间是什么,我们将通过一个例子来进行了解。

参数空间

当我们处理图像时,我们可以将图像想象成是某个 x 和 y 坐标上的二维矩阵,在该坐标下,一条线可以被描述为 y = mx + b。

参数空间

在参数空间中,我们称之为霍夫空间,我可以用 m 和 b 来表示同一条线,因此图像空间中的一条线的表征将是霍夫空间中 m-b 位置的一个点。

霍夫空间

但是我们有一个问题,当 y = mx + b 时,我们不能表示一条垂直线,因为斜率是无限的。所以我们需要一种更好的参数化方式,极坐标(ρ 和 θ)。

霍夫空间

  • ρ:描述直线与原点的距离

  • θ:描述远离水平线极坐标的角度

线极坐标

不过,一个非常重要的观察结果是,当我们在一条线上取多个点,然后我们变换到我们的霍夫空间时,会发生什么呢?

霍夫空间中的点线关系

图像空间上的单个点转化为霍夫空间上的曲线,其特殊性是图像空间上一条直线之间的点将由具有单个接触点的多条曲线表示。

这将是我们的目标,找到一组曲线相交的点。

什么是霍夫变换?

霍夫变换是一种特征提取方法,用于检测图像中的简单形状,如圆、线等。

“简单”特征是通过参数的形状表示推导出来的。一个“简单”的形状将仅由几个参数来表示,例如一条直线可以用它的斜率和截距来表示,或者一个圆可以用 x、y 和半径来表示。

在我们的直线示例中,霍夫变换将负责处理图像上的点并计算霍夫空间中的值。

进行转换并随后找到相交曲线的算法有点复杂,因此超出了本文的范围。不过,我们将看看这个算法的实现,它是OpenCV库的一部分。

使用 OpenCV 检测直线

在OpenCV中,使用霍夫变换的线检测是在函数HoughLines和HoughLinesP(概率霍夫变换)中实现的。我们将重点讨论后者。

该函数需要以下参数:

  • image : 8 位单通道二进制源图像,该功能可以修改图像。

  • lines : 线的输出向量。每条线由一个 4 元素向量 (x_1, y_1, x_2, y_2) 表示,其中 (x_1,y_1) 和 (x_2, y_2) 是每个检测到的线段的端点。

  • rho :累加器的距离分辨率(以像素为单位)。

  • theta :累加器的角度分辨率(以弧度为单位的)。

  • threshold :累加器阈值参数,只有获得足够票数的行才会被返回。

  • minLineLength : 最小线长度,小于该长度的线段将被拒绝。

  • maxLineGap :同一直线上连接点的最大允许间距。

举个例子让我们能够更好的理解:

# Read image
img = cv2.imread('lanes.jpg', cv2.IMREAD_COLOR)
# Convert the image to gray-scale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Find the edges in the image using canny detector
edges = cv2.Canny(gray, 50, 200)
# Detect points that form a line
lines = cv2.HoughLinesP(edges, 1, np.pi/180, max_slider, minLineLength=10, maxLineGap=250)
# Draw lines on the image
for line in lines:x1, y1, x2, y2 = line[0]cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3)
# Show result
cv2.imshow("Result Image", img)

结果如下:

线路检测示例

我们实际使用仅边缘图像作为霍夫变换的参数非常重要,否则算法将无法按预期工作。

使用 OpenCV 检测圆

该过程与直线的过程大致相同,不同之处在于这次我们将使用 OpenCV 库中的不同函数。我们现在将使用 HoughCircles,它接受以下参数:

  • image: 8 位、单通道、灰度输入图像。

  • circles:找到的圆的输出向量。每个向量都被编码为一个 3 元素的浮点向量 (x, y, radius) 。

  • circle_storage: 在 C 函数中,这是一个内存存储,将包含找到的圆的输出序列。

  • method: 使用的检测方法。目前唯一实现的方法是 CV_HOUGH_GRADIENT ,基本上是 21HT。

  • dp: 累加器分辨率与图像分辨率的反比。例如,如果 dp=1 ,则累加器具有与输入图像相同的分辨率。如果 dp=2 ,累加器的宽度和高度是原来的一半。

  • minDist:检测到的圆的中心之间的最小距离。如果参数太小,则除了真实圆圈之外,可能还会错误地检测到多个相邻圆;如果太大,可能会遗漏一些圆圈。

  • param1:第一个方法特定的参数。在 CV_HOUGH_GRADIENT 的情况下,它是传递给 Canny () 边缘检测器的两个阈值中较高的阈值(较低的阈值是较小的两倍)。

  • param2:第二个方法特定的参数。在 CV_HOUGH_GRADIENT 的情况下,它是检测阶段圆心的累加器阈值。它越小,检测到的假圆就越多,与较大累加器值相对应的圆圈将首先返回。

  • minRadius:最小圆半径。

  • maxRadius:最大圆半径。

需要注意的是,参数必须有所不同,因为我们无法使用与用于线的相同参数化来描述圆,而是需要使用类似 (x - x0)^^2 + (y - y0)^^2 = r^^2的方程.

代码:

# Read image as gray-scale
img = cv2.imread('circles.png', cv2.IMREAD_COLOR)
# Convert to gray-scale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Blur the image to reduce noise
img_blur = cv2.medianBlur(gray, 5)
# Apply hough transform on the image
circles = cv2.HoughCircles(img_blur, cv2.HOUGH_GRADIENT, 1, img.shape[0]/64, param1=200, param2=10, minRadius=5, maxRadius=30)
# Draw detected circles
if circles is not None:circles = np.uint16(np.around(circles))for i in circles[0, :]:# Draw outer circlecv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)# Draw inner circlecv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)

请注意,与前面的示例相比,我们在这里不应用任何边缘检测函数,这是因为该函数 HoughCircles 具有内置的 Canny 检测函数。

结果:

圆形检测示例

结论

霍夫变换是一种用于检测图像中简单形状的出色技术,具有多种应用,从医学应用(如 X 射线、CT 和 MRI 分析)到自动驾驶汽车。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

基于Python利用OpenCV实现Hough变换的形状检测相关推荐

  1. cv2 python 获取斑马线_基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...

  2. 基于python的opencv图像处理实现对斑马线的检测(最简单的方法!!!几十行代码搞定!!!)

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...

  3. 使用Python,OpenCV和Hough圆检测图像中的圆

    使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...

  4. 基于Python的OpenCV+TensorFlow+Keras人脸识别实现

    前言:本节要讲的人脸识别主要是借鉴了 一位研究生前辈的文章 我只是在他的基础上进行了改动,让代码能在现在的TensorFlow2.X 等的环境下运行 先看一下效果图 完整工程及源代码请点击链接下载:人 ...

  5. 基于Python通过OpenCV实现的口罩识别系统理论篇

    基于Python通过OpenCV实现的口罩识别系统理论设计篇 一.项目实现环境 基于Python 3.8.1版本 opencv-python 4.2.0.34版本 需要自己下载OpenCV的库文件,添 ...

  6. python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)

    python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码 一.前言 今天的低价单孔摄像机(照相机)会给图像带来很多畸变.畸变主要有两 种:径向畸变和切想畸变.如下图所示,用 ...

  7. AI 质检学习报告——实践篇——第三步:python利用OpenCV打开摄像头截图后实现图片识字

    AI 质检学习报告--实践篇--第一步:python利用OpenCV打开摄像头并截图 AI 质检学习报告--实践篇--第二步:实现图片识字 前边两篇实践已经分别实现了利用OpenCV打开摄像头并截图和 ...

  8. AI 质检学习报告——实践篇——第一步:python利用OpenCV打开摄像头并截图

    写在前边 想要做一个AI质检的项目,一点一点来,首先:python利用OpenCV打开摄像头并拍照. 效果 设摄像头像素不咋地,实际的产品肯定不会是这个像素,必须安排一个专业的. 实现代码 impor ...

  9. ubuntu16.04安装python.h_ubuntu16.04 下基于 Python 的 OpenCV 的安装

    ubuntu16.04 下基于 Python 的 OpenCV 的安装 这几天一直在学习基于 Python 的 OpenCV , 开发环境是在 Ubuntu16.04 下, 学习的心得就是基于 Pyt ...

最新文章

  1. Redis设计与实现之SDS和链表
  2. oracle11连12c报权限错误,关于Oracle12c连接报错的问题
  3. 张凯江:架构能力-“构建”世界的能力
  4. Spring : Spring @Transactional-事物回滚
  5. 用Python统计瓦尔登湖的词频
  6. 微信小程序——极点日历使用方法
  7. Golang 方法接收者为值与指针的区别
  8. IIS7.5 在已有的WEB网站上配置FTP发布
  9. mysql教程查询语句_mysql-Mysql 查询语句怎么写?
  10. 实验8:Problem A: 立体空间中的点(I)
  11. 孙鑫VC学习笔记:第十九讲 动态链接库
  12. 微服务2.0时代,论其痛点与触点
  13. Unity3D开发Android游戏(二)Hello world
  14. SDIO接口简单描述
  15. 通过exe解决kindle for pc中文书籍无法修改字体的问题
  16. 英语学习必备:Eudic欧路词典 for Mac增强版
  17. 小米平板1刷los神盾系统
  18. 判断四个点是否可以构成矩形(优雅的解法!!!)
  19. win7电脑设置自动关机
  20. 爬虫与数据分析(二)

热门文章

  1. 受用一生的高效PyCharm使用技巧(二)
  2. 用高中数学理解AI “深度学习”的基本原理
  3. AI入侵机械设计,苦逼的“机械狗”还有未来吗?
  4. Scikit-learn 发布 0.20版本!新增处理缺失值、合并Pandas等亮点功能
  5. 活动推荐 | 百千万人才工程创新大讲堂开启报名
  6. 从上云到云管,只差一名青云“最佳小助手”
  7. Uber AI实验室总结「神经进化」研究:如何利用遗传算法优化网络?
  8. AI一分钟 | 妈呀!连地铁都开始无人驾驶了,飞机还远吗;北京无人驾驶新规出台,终于知道李彦宏该不该被罚了(12月19日)
  9. 分库分表:如何做到永不迁移数据和避免热点?
  10. Spring Boot 整合 Quartz 实现 Java 定时任务的动态配置