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

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.dtcms.com/a/356255.html

相关文章:

  • 在C++11中实现函数式编程的组合子
  • AI推介-大语言模型LLMs论文速览(arXiv方向):2025.04.25-2025.04.30
  • React Native 初体验
  • rabbitmq学习笔记 ----- 多级消息延迟始终为 20s 问题排查
  • OpenCV 图像预处理核心技术:阈值处理与滤波去噪
  • LubanCat-RK3568 UART串口通信,以及遇到bug笔记
  • CRYPT32!CryptMsgUpdate函数分析和asn.1 editor nt5inf.cat 的总览信息
  • 第八篇 永磁同步电机控制-MTPA、MTPV
  • 深入解析Qt节点编辑器框架:数据流转与扩展机制(三)
  • 实时音视频延迟优化指南:从原理到实践
  • 零知开源——基于STM32F407VET6和ADXL345三轴加速度计的精准运动姿态检测系统
  • Blender模拟结构光3D Scanner(三)获取相机观测点云的真值
  • OpenCV 基础知识总结
  • 无懈可击的 TCP AIMD
  • 亚马逊季节性产品运营策略:从传统到智能化的演进
  • kimi浏览器助手-月之暗面推出的智能浏览器扩展
  • docker中的mysql有中文显示问题跟大小写区分问题?
  • Python从入门到高手9.4节-基于字典树的敏感词识别算法
  • 使用Python脚本执行Git命令
  • React 状态丢失:组件 key 用错引发的渲染异常
  • Rust 安装与运行指南
  • Custom SRP - LOD and Reflections
  • 柳州市委常委、统战部部长,副市长潘展东率队首访深兰科技集团新总部,共探 AI 赋能制造大市与东盟合作新局
  • Claude Code 完整手册:从入门、配置到高级自动化
  • 【python】相机输出图片时保留时间戳数据
  • Linux学习——sqlite3
  • 179-183动画
  • IntelliJ IDEA2025+启动项目提示 Failed to instantiate SLF4J LoggerFactory
  • 零基础json入门教程(基于vscode的json配置文件)
  • 【贪心算法】day4