当前位置: 首页 > news >正文

霍夫变换(Hough Transform)原理简要介绍

📘 霍夫变换(Hough Transform)

参考1:OpenCV
参考2:bilibili,我觉得讲的蛮好

一、什么是霍夫变换?

霍夫变换是一种用于在图像中检测几何形状的经典算法。它最常用来检测直线,也可以扩展到检测圆、椭圆等其他形状。

它的核心思想是:

将图像空间中的点转换到参数空间中进行“投票”,找出最有可能存在的几何结构。

二、为什么用霍夫变换?

在图像中直接找直线并不容易,因为:

  • 图像可能有噪声或断开的边缘
  • 直线可能被遮挡或部分缺失

而霍夫变换通过统计所有边缘点对各种可能直线的“支持程度”,可以有效识别出图像中真实存在的直线。

三、直线检测的基本思路

1. 直线的数学表示

一条直线可以用多种方式表示:

  • 斜截式:y = kx + b → 不适合垂直直线(k无穷大)
  • 极坐标式:ρ = x cos(θ) + y sin(θ)

✅ 在霍夫变换中使用的是极坐标形式,其中:

  • ρ 是原点到这条直线的垂直距离
  • θ 是这条垂线与 x 轴之间的夹角

2. 参数空间(霍夫空间)

每条直线由两个参数决定:ρ 和 θ。我们可以建立一个二维空间来表示这些参数:

  • 横轴:θ,范围通常是 0° 到 180°
  • 纵轴:ρ,范围根据图像大小确定(如 -500 到 +500)

这个空间就叫做霍夫空间,或者参数空间。

四、霍夫变换的核心步骤

步骤 1:提取图像中的边缘点

首先使用边缘检测算法(如 Canny)得到图像中所有的边缘点。

  • 这些点是我们要用来“投票”给潜在直线的关键点。

步骤 2:每个点都“投票”给所有可能经过它的直线

对于每一个边缘点 (x, y):

  • 遍历角度 θ 的所有可能值(比如从 0° 到 180°,每次增加 1°)
  • 对于每一个 θ,计算对应的 ρ
  • 得到一组 (ρ, θ),代表一条可能经过该点的直线
  • 在参数空间中,对这个位置“加 1 票”

每个点都会产生很多组 (ρ, θ),也就是在参数空间中留下很多“投票”。

步骤 3:参数空间中出现最多“票数”的位置就是图像中最可能的直线

在参数空间中:

  • 哪些 (ρ, θ) 出现的次数最多?

  • 这些位置就代表图像中最有可能存在的直线!

  • 就像选举一样,得票最多的候选人胜出。

五、如何理解“每个点都要遍历 0°~180°”?

这是很多人疑惑的地方。

其实很简单:

  • 每个点都可以属于无数条直线。
  • 我们不可能穷尽所有角度,所以设定一个步长(如 1°),在这个范围内逐一尝试。
  • 每次尝试一个角度,算出对应的半径 ρ,就得到了一组可能的直线参数。
  • 然后在这个参数组合上加一票。

所以,每个点都会为 180 个不同的角度分别生成一个 ρ,并在参数空间中对应的位置“投票”。

六、累加器数组的作用

为了记录所有“投票”,我们使用一个二维数组,称为累加器(Accumulator)。

  • 行表示 ρ
  • 列表示 θ
  • 数组中的数值表示有多少个点“认为”这条直线存在

最终,找到累加器中数值最高的几个位置,就找到了图像中最可能的几条直线。

七、精度问题:连续 vs 离散

虽然 ρ 和 θ 在数学上是连续的,但我们在实现时必须将其离散化:

  • 角度 θ 通常按 1° 分辨率取值
  • 半径 ρ 也按 1 像素为单位进行划分

这就会带来一定的误差,但我们可以通过调整分辨率来控制这种误差的影响。

  • 类似于把一个光滑曲线画在方格纸上,虽然不能完全精确,但只要格子够小,就能非常接近真实结果。

八、总结一句话

霍夫变换的本质是:让图像中的每个边缘点为所有可能经过它的直线“投票”,最后找出得票最多的那几条直线。

相关文章:

  • 基于51单片机的多功能洗衣机仿真
  • 食品计算—Food Portion Estimation via 3D Object Scaling
  • 力扣HOT100之二分查找:153. 寻找旋转排序数组中的最小值
  • 第二十八课:深度学习及pytorch简介
  • Vue3中computed和watch的区别
  • Faiss vs Milvus 深度对比:向量数据库技术选型指南
  • [面试精选] 0094. 二叉树的中序遍历
  • UDP 与 TCP 调用接口的差异:面试高频问题解析与实战总结
  • SQL慢可能是触发了ring buffer
  • Ubuntu下有关UDP网络通信的指令
  • Vue学习之---nextTick
  • 《经济学原理》第9版第5章弹性及其应用
  • Nodejs工程化实践:构建高性能前后端交互系统
  • PC与Windows远程连接与串流:方案简介(ZeroTier + Parsec、Moonlight + Sunshine、网易UU远程)
  • [C++] list双向链表使用方法
  • Spring AI 核心工作流
  • Spring Boot + Thymeleaf 防重复提交
  • 微前端架构下的B端页面设计:模块化与跨团队协作的终极方案
  • Oracle业务用户的存储过程个数及行数统计
  • Qt的学习(一)
  • 网站怎么做能让人搜到/文章推广平台
  • 自建网站怎么做优化/百度网址链接
  • 网站搭建公司排行榜/站内推广有哪些方式
  • IC 网站建设/关联词有哪些
  • 网站建设系统公司/郑州网站定制
  • 怎么做物物交换网站/广州网站维护