【图像处理】霍夫变换:霍夫变换原理、霍夫空间、霍夫直线、霍夫圆详解与代码示例

霍夫变换详解与代码示例

霍夫变换(Hough Transform)是一种用于检测图像中几何形状(如直线、圆)的特征提取技术。其核心思想是将图像空间中的点映射到参数空间(霍夫空间),通过累积投票机制识别形状。下面我将逐步推导原理、解释霍夫空间、详述直线和圆检测,并提供Python代码示例(使用OpenCV库)。


1. 霍夫变换原理

霍夫变换基于参数化思想:图像空间中的点对应霍夫空间中的曲线,而霍夫空间中的峰值对应图像中的几何形状。

  • 基本推导(以直线为例):
    • 图像空间中,一条直线可表示为 y=mx+cy = mx + cy=mx+c,但此形式在垂直线时斜率 mmm 无限大,不实用。改用极坐标方程:
      ρ=xcos⁡θ+ysin⁡θ \rho = x \cos \theta + y \sin \theta ρ=xcosθ+ysinθ
      其中:
      • ρ\rhoρ 是原点到直线的垂直距离(ρ≥0\rho \geq 0ρ0),
      • θ\thetaθ 是直线与x轴的夹角(0≤θ<180∘0 \leq \theta < 180^\circ0θ<180)。

在这里插入图片描述

  • 图像空间中每个点 (xi,yi)(x_i, y_i)(xi,yi) 对应霍夫空间中的一条正弦曲线:ρ=xicos⁡θ+yisin⁡θ\rho = x_i \cos \theta + y_i \sin \thetaρ=xicosθ+yisinθ

  • 多个点共线时,它们在霍夫空间中的曲线相交于一点 (θk,ρk)(\theta_k, \rho_k)(θk,ρk),该点即为直线参数。

  • 累积投票:将霍夫空间离散化为网格(累加器数组),每个点 (xi,yi)(x_i, y_i)(xi,yi) 对所有可能的 θ\thetaθ 计算 ρ\rhoρ,并在对应网格单元投票。峰值单元对应检测到的直线。
    在这里插入图片描述

  • 通用原理

    • 适用于任意参数化形状(如圆、椭圆)。
    • 优点:对噪声和部分遮挡鲁棒;缺点:计算复杂度随参数维度增加(如直线是二维,圆是三维)。

2. 霍夫空间

霍夫空间是参数空间,用于累积投票:

  • 定义:图像空间中的点映射到参数空间中的曲线或曲面。
  • 量化
    • θ\thetaθ 范围:000180∘180^\circ180(或 000π\piπ 弧度),通常离散为 1∘1^\circ1 步长。
    • ρ\rhoρ 范围:−D-DDDDDDDD 为图像对角线长度),离散为整数步长(如1像素)。
  • 累加器:二维数组 A[θ][ρ]A[\theta][\rho]A[θ][ρ],初始为0。每个边缘点增加通过它的所有可能直线的投票数。峰值 A[θk][ρk]A[\theta_k][\rho_k]A[θk][ρk] 表示检测结果。

3. 霍夫直线检测

基于上述原理,检测图像中的直线:

  • 步骤

    1. 边缘检测:预处理图像(如Canny边缘检测),获取二值边缘图。
    2. 映射到霍夫空间:对每个边缘点 (xi,yi)(x_i, y_i)(xi,yi),遍历 θ\thetaθ(例如 θ=0∘,1∘,…,179∘\theta = 0^\circ, 1^\circ, \dots, 179^\circθ=0,1,,179),计算 ρ=xicos⁡θ+yisin⁡θ\rho = x_i \cos \theta + y_i \sin \thetaρ=xicosθ+yisinθ,并累加 A[θ][ρ]A[\theta][\rho]A[θ][ρ]
    3. 找峰值:设定阈值,A[θ][ρ]>阈值A[\theta][\rho] > \text{阈值}A[θ][ρ]>阈值 的单元对应检测到的直线。
    4. 转换回图像空间:用 (θk,ρk)(\theta_k, \rho_k)(θk,ρk) 绘制直线 ρk=xcos⁡θk+ysin⁡θk\rho_k = x \cos \theta_k + y \sin \theta_kρk=xcosθk+ysinθk
  • 优化:使用概率霍夫变换(Probabilistic Hough Transform),随机采样边缘点,减少计算量。


4. 霍夫圆检测

圆检测扩展了霍夫变换到三维参数空间:

  • 圆方程:圆心 (a,b)(a, b)(a,b),半径 rrr,方程为:
    (x−a)2+(y−b)2=r2 (x - a)^2 + (y - b)^2 = r^2 (xa)2+(yb)2=r2
  • 霍夫空间:三维空间 (a,b,r)(a, b, r)(a,b,r)
  • 步骤
    1. 边缘检测:获取边缘图。
    2. 梯度优化:利用边缘梯度方向减少计算:
      • 边缘点 (xi,yi)(x_i, y_i)(xi,yi) 的梯度方向 ϕ\phiϕ 近似圆心方向。
      • 对每个边缘点,沿梯度方向 ϕ\phiϕϕ+180∘\phi + 180^\circϕ+180,在可能半径 rrr 范围内计算圆心 (a,b)(a, b)(a,b)
        a=xi−rcos⁡ϕ,b=yi−rsin⁡ϕ a = x_i - r \cos \phi, \quad b = y_i - r \sin \phi a=xircosϕ,b=yirsinϕ
      • 累加三维累加器 A[a][b][r]A[a][b][r]A[a][b][r]
    3. 找峰值:设定阈值,A[a][b][r]>阈值A[a][b][r] > \text{阈值}A[a][b][r]>阈值 的单元对应检测到的圆。
  • 挑战:三维空间计算量大,常使用多尺度或梯度方法优化。

5. 代码示例

使用Python和OpenCV实现霍夫直线和圆检测。需安装OpenCV:pip install opencv-python

(a) 霍夫直线检测代码
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像并转换为灰度
image = cv2.imread('input.jpg')  # 替换为您的图像路径
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 边缘检测(Canny)
edges = cv2.Canny(gray, 50, 150)  # 阈值50和150# 霍夫直线变换
# 参数:边缘图, rho精度(1像素), theta精度(1度), 阈值(投票数)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 150)  # 阈值调整以控制检测灵敏度# 绘制检测到的直线
if lines is not None:for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rho# 计算直线端点x1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)  # 红色直线# 显示结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('霍夫直线检测')
plt.axis('off')
plt.show()
(b) 霍夫圆检测代码
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像并转换为灰度
image = cv2.imread('input.jpg')  # 替换为您的图像路径
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)  # 中值滤波去噪# 霍夫圆变换
# 参数:输入图, 方法(HOUGH_GRADIENT), dp=1(累加器分辨率), minDist(圆心最小距离), param1(Canny高阈值), param2(累加器阈值), minRadius, maxRadius
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=50,param1=50, param2=30, minRadius=10, maxRadius=100)# 绘制检测到的圆
if circles is not None:circles = np.uint16(np.around(circles))for circle in circles[0, :]:center = (circle[0], circle[1])  # 圆心radius = circle[2]  # 半径cv2.circle(image, center, radius, (0, 255, 0), 2)  # 绿色圆cv2.circle(image, center, 2, (0, 0, 255), 3)  # 圆心红点# 显示结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('霍夫圆检测')
plt.axis('off')
plt.show()
代码说明:
  • 输入图像:替换 'input.jpg' 为您的图像路径(确保图像有清晰边缘)。
  • 参数调整
    • 直线检测:cv2.HoughLines 的阈值控制最少投票数(值越大,检测越严格)。
    • 圆检测:param2 是关键阈值(值越小,检测越多圆,但噪声增加)。
  • 输出:显示原图叠加检测结果(直线为红色,圆为绿色带圆心红点)。
  • 优化:实际应用中,可结合图像预处理(如高斯模糊)提高准确性。

霍夫变换是计算机视觉基础工具,广泛应用于车道检测、工业质检等领域。通过调整参数和优化方法,可平衡精度与效率。

总结

霍夫变换通过将图像空间映射到参数空间,有效检测几何形状。其核心是累加器投票机制,在霍夫空间中识别峰值。本示例展示了直线检测的实现,可扩展到其他形状(如圆)。实际使用时,建议结合图像优化(如降采样)以提高效率。如果您有特定图像或扩展需求,我可以进一步调整代码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93749.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java WEB技术-序列化和反序列化认识(SpringBoot的Jackson序列化行为?如何打破序列化过程的驼峰规则?如何解决学序列化循环引用问题?)

一、什么是序列化和反序列化 在java项目中&#xff0c;对象序列化和反序列化通常用于对象的存储或网络传输等。如&#xff1a;服务端创建一个JSON对象&#xff0c;对象如何在网络中进行传输呢&#xff1f;我们知道网络传输的数据通常都是字节流的形式&#xff0c;对象想要在网络…

【生活系列】MBTI探索 16 种性格类型

博客目录一、MBTI 的四个核心维度1. 精力来源&#xff1a;外向&#xff08;E&#xff09;vs 内向&#xff08;I&#xff09;2. 信息获取方式&#xff1a;感觉&#xff08;S&#xff09;vs 直觉&#xff08;N&#xff09;3. 决策方式&#xff1a;思考&#xff08;T&#xff09;v…

innovus在ccopt_design时设置update io latency

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章:

电脑出现英文字母开不了机怎么办 原因与修复方法

当您按下电脑开机键&#xff0c;屏幕上却只显示一串串陌生的英文字母&#xff0c;无法正常进入系统时&#xff0c;这通常是电脑在向您“求救”。这种情况可能由多种原因引起&#xff0c;从外部设备冲突到系统文件损坏&#xff0c;都可能导致电脑无法启动。不必过于焦虑&#xf…

CSS和XPATH选择器对比

1、优缺点比较特性CSS选择器XPath语法复杂度简洁易读较为复杂性能通常更快可能较慢向上遍历不支持支持&#xff08;可选择父元素&#xff09;文本内容选择有限支持完全支持索引选择支持&#xff08;:nth-child&#xff09;支持&#xff08;position()&#xff09;浏览器兼容性优…

libomxil-bellagio移植到OpenHarmony

当使用mesa3dcangh提供的amd显卡驱动时&#xff0c;想利用 Mesa 提供的图形硬件加速能力&#xff0c;来支持视频编解码操作时。需要依赖libomxil-bellagio库&#xff0c;现在成果分享如下&#xff1a; 基础知识 1.OpenHarmony中mesa3d amd显卡驱动编译 2.OpenHarmony中基于G…

uvm-tlm-sockets

TLM 2.0引入了套接字(Socket)机制&#xff0c;实现发起方(initiator)与目标方(target)组件间的异步双向数据传输。套接字与端口(port)和导出(export)同源&#xff0c;均继承自uvm_port_base基类。发起事务的组件使用发起方套接字(initiator socket)&#xff0c;称为发起方&…

AI 如何评价股票:三七互娱(SZ:002555),巨人网络(SZ:002558)

三七互娱&#xff08;SZ:002555&#xff09;作为国内领先的游戏公司&#xff0c;其股票表现需结合财务健康度、行业地位、战略布局及潜在风险综合评估。以下从多维度展开分析&#xff1a; 一、财务表现&#xff1a;增长乏力与高分红并存营收与利润双降 2025年Q1营收42.43亿元&a…

Vibe Coding:AI驱动开发的安全暗礁与防护体系

当OpenAI联合创始人Andrej Karpathy在2025年初的推文里首次提及"Vibe Coding"时&#xff0c;这个概念迅速在开发者社区引发共鸣——它描绘了一种诱人的开发模式&#xff1a;开发者用自然语言描述需求&#xff0c;AI接管代码生成、修改甚至调试&#xff0c;整个过程以…

四、主辅源电路

一、主辅源结构主辅源采用反激变换器拓扑&#xff0c;输入供电有母线供电、电池辅源供电、电网辅源供电。开关管为一个高耐压NMOS功率管。主控芯片采用ICE3BS03LJG&#xff0c;其主要参数如下&#xff1a;商品目录AC-DC控制器和稳压器是否隔离隔离工作电压10.5V~26V开关频率65k…

制造业企业如何保障文件外发图纸数据安全的?

在制造业的发展进程中&#xff0c;文件外发是必不可少的环节&#xff0c;但这也给图纸数据安全带来了诸多挑战。一旦图纸数据泄露&#xff0c;企业的核心竞争力可能会受到严重损害。那么&#xff0c;制造业企业该如何保障文件外发图纸数据安全呢&#xff1f;建立完善的管理制度…

RAG:让AI更聪明的“外接大脑“ | AI小知识

RAG&#xff1a;让AI更聪明的"外接大脑" 什么是RAG&#xff1f; 想象你在参加知识竞赛&#xff0c;突然遇到不会的题目。这时你掏出手机快速搜索正确答案——这就是RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索式增强生成&#xff09;的工作原理。…

TCP 连接管理 之 三次握手详解

TCP 连接管理 之 三次握手详解 &#xff08;一&#xff09;TCP三次握手详细过程及状态变化 1. 第一次握手&#xff08;客户端 → 服务器&#xff09; 报文标志位&#xff1a;SYN1&#xff08;同步序列号&#xff09;&#xff0c;ACK0&#xff08;首次握手无确认&#xff09;序列…

day066-内容分发网络(CDN)与web应用防火墙(WAF)

文章目录0. 老男孩思想-老男孩名言警句1. 云产品日常管理2. 创建快照策略3. CDN 内容分发网络3.1 添加域名3.2 配置CNAME3.3 测试3.4 CDN刷新/预热3.5 命中率3.5.1 查看命中率3.5.2 CDN命中率低怎么办&#xff1f;3.6 访问控制3.7 流量限制4. WAF web应用防火墙4.1 使用WAF4.2 …

Redis高频问题全解析

Q1: Redis为什么这么快&#xff1f; Redis速度快主要有四个核心原因。首先是基于内存操作&#xff0c;所有数据都存储在内存中&#xff0c;避免了磁盘I/O的开销&#xff0c;内存读写速度比磁盘快几万倍。其次采用单线程模型&#xff0c;避免了多线程环境下的线程切换和锁竞争带…

【MATLAB】(三)数据类型与运算符

一.MATLAB的数据存储类型一般而言&#xff0c;在 MATLAB 中数据的存储与计算都是以双精度进行的&#xff0c;但有多种显示形式。在默认情况下&#xff0c;若数据为整数&#xff0c;就以整数表示;若数据为实数&#xff0c;则以保留小数点后4位的精度近似表示。用户可以改变数字显…

智能客服 VS 人工客服:电商企业该选哪种服务模式?

在数字化浪潮的推动下&#xff0c;电商企业对客户服务的效率和质量提出了更高要求。智能客服与人工客服作为两种主流服务模式&#xff0c;各有优劣。本文将从服务效率、成本投入、客户体验等维度&#xff0c;客观分析两者的特点&#xff0c;帮助电商企业做出合理选择。一、服务…

前端基础之《Vue(28)—Vue3 ref相关API》

ref相关API介绍1、ref()&#xff08;1&#xff09;ref介绍 ref用于定义基本数据类型&#xff0c;比如&#xff1a;string / boolean / number等&#xff08;因为这几个没办法代理&#xff09;。 ref的背后是使用reactive来实现的响应式。 使用.value来访问变量的值。&#xff0…

项目管理中如何避免延期?核心策略分析

在项目管理中避免延期&#xff0c;并非依赖于单一技巧&#xff0c;而是要构筑一个系统性的、多维度的防御体系。其核心策略涵盖了&#xff1a;进行全面细致的前期规划与估算、实施严格的范围管理与变更控制、建立主动式全过程风险管理机制、维持高透明度的持续沟通、以及采用数…

【计算机视觉与代码大模型全景解析:从理论基础到学习路线】

&#x1f4d8;计算机视觉与代码大模型全景解析&#xff1a;从理论基础到学习路线&#x1f4d1; 目录1️⃣ 摘要2️⃣ 计算机视觉与大模型基础理论  2.1 &#x1f9e0; 深度卷积神经网络基础原理  2.2 &#x1f441;️‍&#x1f5e8;️ 计算机视觉的技术发展与视觉图灵概念…