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

OpenCV之霍夫变换

霍夫变换(Hough Transform)是一种经典的形状检测算法,尤其在直线、圆等几何图形识别中应用广泛。它通过将图像空间中的特征映射到参数空间进行投票,最终找到最匹配的几何形状。以下从原理到实战的全面解析:


一、霍夫变换的核心思想

1. 图像空间 → 参数空间
  • 问题:在图像中直接检测直线(或圆)困难,因为噪声、断裂会影响结果。
  • 解决方案:将检测问题转换为参数空间的峰值搜索问题。
2. 以直线检测为例
  • 图像空间:一条直线由无数像素点组成。
  • 参数空间(霍夫空间):直线表示为 (ρ, θ) 极坐标参数:
    • ρ:直线到原点的垂直距离
    • θ:直线的法线与x轴的夹角
3. 投票机制
  • 图像中每个边缘点对应参数空间的一条曲线,多条曲线的交点即为潜在的直线参数。

二、霍夫直线检测(从像素到参数)

1、霍夫直线检测流程

  1. 对每个边缘点 (x,y)

    • 穷举所有可能的θ(例如 0°, 1°, ..., 180°
    • 对每个θ,计算对应的ρ:ρ = x·cosθ + y·sinθ
    • 将结果 (θ, ρ) 记录到投票表(累加器)
  2. 统计投票结果

    • 所有点计算完成后,投票数最多的 (θ, ρ) 组合即为图像中的直线。
  3. 阈值筛选

    • 仅保留投票数超过阈值的组合(排除噪声干扰)。

2、霍夫直线检测案例

输入图像 (5x5 像素)

假设有一张微型二值图像,白色(255)为边缘点,黑色(0)为背景:

import numpy as np
image = np.array([[0,   0,   255, 0,   0],[0,   255, 0,   255, 0],[255, 0,   0,   0,   255],[0,   255, 0,   255, 0],[0,   0,   255, 0,   0]
], dtype=np.uint8)

这个图像是一个X形交叉的直线,我们手动模拟霍夫变换检测过程。


步骤1:提取边缘点坐标

找到所有白色像素的位置(边缘点):

(0,2), 
(1,1), (1,3), 
(2,0), (2,4), 
(3,1), (3,3), 
(4,2)
步骤2:定义参数空间
  • 直线参数:使用极坐标 (ρ, θ)
    • ρ(rho):直线到原点的垂直距离(范围:-max_distmax_dist,这里 max_dist=√(4²+4²)≈5
    • θ(theta):角度(范围:0~180°,按步长45°简化计算)
步骤3:为每个边缘点投票

对每个边缘点 (x,y),计算所有可能的 (ρ, θ)

  • 公式ρ = x*cosθ + y*sinθ
  • 示例1:点 (2,0)
    • θ=0°: ρ = 2cos0 + 0sin0 = 2
    • θ=45°: ρ = 2cos45 + 0sin45 ≈ 1.41
    • θ=90°: ρ = 2cos90 + 0sin90 = 0
    • θ=135°: ρ = 2cos135 + 0sin135 ≈ -1.41

将计算结果填入累加器(投票表):

θ \ ρ -2 -1 0 1 2
+1
45° +1
90° +1
135° +1
  • 重复所有点的计算
    • (0,2) → 在 θ=90°ρ=2(投票)
    • (4,2) → 在 θ=90°ρ=4(超出范围忽略)

最终累加器(部分):

θ \ ρ -2 -1 0 1 2
http://www.xdnf.cn/news/19143.html

相关文章:

  • Linux系统部署:Certbot 实现 Nginx 自动续期部署 Let‘s Encrypt 免费 SSL 证书
  • css三角形
  • 万字解析RAG(检索增强生成)系统的构建与优化,从基础架构逐步深入到高级技术
  • 深度学习入门Day10:深度强化学习原理与实战全解析
  • 虚拟机快照对内存与磁盘空间的影响
  • Git 合并冲突
  • C++ 编译和运行 LibCurl 动态库和静态库
  • 32.String str=aaa与 String str=new String(aaa)一样吗?new String(“aaa”);创建了几个字符串对象
  • Linux按键驱动开发
  • 明远智睿 RK3568 核心板:以硬核性能解锁多领域应用新可能
  • 手写一个Spring框架
  • 【活动回顾】“智驱未来,智领安全” AI+汽车质量与安全论坛
  • Labview邪修01:贪吃蛇
  • 数据结构:归并排序 (Iterative Merge Sort)
  • 非支配排序遗传算法进化多目标优化算法
  • 【混合开发】Android+webview模拟crash崩溃补充说明
  • 【LeetCode每日一题】141. 环形链表 142.环形链表 II
  • Rspack
  • Kafka入门指南:从安装到集群部署
  • Mock 在 API 研发中的痛点、价值与进化及Apipost解决方案最佳实践
  • 【Docker/Redis】服务端高并发分布式结构演进之路
  • RS485、RS232、RS422协议
  • 若依微服务一键部署(RuoYi-Cloud):Nacos/Redis/MySQL + Gateway + Robot 接入(踩坑与修复全记录)
  • 云手机的安全性如何?
  • LeetCode Hot 100 第8天
  • 群组分析 (Cohort Analysis)——哪批用户最优质?
  • 【Spring底层分析】Spring AOP补充以及@Transactional注解的底层原理分析
  • 12大主流本地文档管理系统功能与价格对比分析
  • 如何设置阿里云轻量应用服务器镜像?
  • v-model与v-bind区别