Halcon算法——Hough检测
🎯 Hough变换基础
一、概述
Hough变换(霍夫变换)是一种经典的形状检测算法,广泛应用于直线、圆、椭圆等几何图形的识别中。
其核心思想是:
将图像空间中的点映射到参数空间中,通过“投票”机制寻找最符合几何模型的参数。
换句话说:
- 图像空间中:点代表像素。
- 参数空间中:点代表一条可能的几何形状(如一条线或一个圆)。
- 若多条参数曲线在参数空间中交于同一点,则说明图像中存在对应的几何形状。
二、直线的Hough变换
1. 直线的表示方式
(1)一般式(易理解但不完备)
- 缺点:当直线垂直于x轴时,斜率 \(k \to \infty\),表达式失效。
(2)极坐标式(常用形式)
- \(\rho\):点到原点的距离
- \(\theta\):该垂线与x轴的夹角
这种表达能统一表示所有直线,不会出现垂直线异常问题。
在这种形式下:
- 图像空间中的“一条直线”对应参数空间中的“一个点”;
- 图像空间中的“一个点”对应参数空间中的“一条曲线”。
2. 空间映射关系
对于任意图像中的边缘点 \((x, y)\),其在参数空间 \((\rho, \theta)\) 中满足:
这条方程表示在参数空间中的一条正弦曲线。
若多个点属于同一条直线,它们的正弦曲线将相交于同一点,该交点即为直线的参数 \((\rho, \theta)\)。

3. 算法流程
-
边缘检测
对图像执行边缘检测(如Canny算法),提取明显的边缘点。 -
参数空间定义
设定 \(\rho\) 和 \(\theta\) 的取值范围与分辨率(步长)。 -
投票累加
对每个边缘点,计算所有可能的 \((\rho, \theta)\) 并在累加器矩阵中对应位置投票。 -
寻找峰值
累加器中投票数最高的点代表图像中最可能存在的一条直线。 -
反算绘制
将检测到的 \((\rho, \theta)\) 反算为直线方程,在图像上绘制。
4. 原理图示与理解
- 单个点在参数空间中 → 一条正弦曲线。
- 多个共线点在参数空间中 → 曲线交于同一点。
因此,通过检测累加器中的峰值即可找出图像中的主要直线。
三、Hough直线检测总结
Hough直线检测本质是一个基于投票的统计过程:
- 图像空间的每个边缘点 → 参数空间的一条曲线;
- 多个点若共线 → 参数空间曲线交汇;
- 曲线交点最多的位置即代表一条真实直线。
- \(\rho\)的最大值为图像的对角线长度,\(\theta\)则的取值范围为0-180°。
检测结果可视化为:
参数空间中最密集的交点 ↔ 图像中最明显的直线(有最多的点在这条直线上)。
四、Halcon 中使用 Hough 直线检测
在 Halcon 中,可通过算子 hough_lines 实现标准的霍夫直线检测。
其调用格式如下:
hough_lines(Image : Lines : AngleResolution, Threshold, AngleGap, DistGap :)
参数说明
| 参数名称 | 类型 | 说明 |
|---|---|---|
| Image | 输入参数 | 输入的边缘或二值化图像。通常需在进行边缘检测(如 edges_sub_pix)后使用。 |
| Lines | 输出参数 | 输出检测到的直线对象(区域或轮廓)。 |
| AngleResolution | 输入参数 | 角度分辨率(单位:度)。默认值为 1.0,值越小检测精度越高,但计算时间也相应增加。 |
| Threshold | 输入参数 | 投票阈值。表示在霍夫空间中被认为是有效直线所需的最小累积票数。值越高,检测到的直线越显著。 |
| AngleGap | 输入参数 | 角度合并阈值。当两条直线的角度差小于该值时,认为它们属于同一条直线并进行合并。 |
| DistGap | 输入参数 | 距离合并阈值。当两条直线的距离差小于该值时,同样会被合并为一条直线。 |
五、Halcon 中使用 Hough 方向直线检测(hough_lines_dir)
在 Halcon 中,算子 hough_lines_dir 用于基于霍夫变换检测图像中的线状结构。
与标准的 hough_lines 算子不同,hough_lines_dir 在检测过程中同时考虑了边缘方向信息,从而能够在提高计算效率的同时减少噪声干扰。
其调用格式如下:
hough_lines_dir(ImageDir : Lines : DirectionUncertainty, AngleResolution,
Smoothing, FilterSize, Threshold, AngleGap, DistGap, GenLines, HoughImage, Angle, Dist :)
参数说明
| 参数名称 | 类型 | 说明 |
|---|---|---|
| ImageDir | 输入参数 | 输入的边缘方向图像,通常由 sobel_dir 或 edges_image 获得。 |
| Lines | 输出参数 | 输出检测到的直线区域。当 GenLines = 'true' 时,包含对局部极大值有贡献的像素区域。 |
| DirectionUncertainty | 输入参数 | 表示允许的边缘方向偏差范围(单位:°)。例如,当值为 10 时,一条水平线(0°)可包含方向在 -10° 到 +10° 之间的像素。该值越大,计算时间越长。若设为 180,则忽略边缘方向信息,与 hough_lines 行为一致。 |
| AngleResolution | 输入参数 | 角度分辨率,定义角度检测的精度(精度为 1 / AngleResolution 度)。较小值可提高精度,但增加计算量。 |
| Smoothing | 输入参数 | 霍夫空间平滑方法(如 'mean' 或 'gauss')。用于减少噪声并增强检测稳定性。 |
| FilterSize | 输入参数 | 平滑滤波器尺寸,数值越大平滑效果越明显。 |
| Threshold | 输入参数 | 投票阈值,表示霍夫空间中被认为是有效直线所需的最小累积票数。 |
| AngleGap | 输入参数 | 角度方向上局部极大值之间的最小间隔,用于合并相近方向的直线。 |
| DistGap | 输入参数 | 距离方向上局部极大值之间的最小间隔,用于合并相近距离的直线。 |
| GenLines | 输入参数 | 若设为 'true',则输出参与形成局部极大值的图像区域。 |
| HoughImage | 输出参数 | 未平滑的霍夫空间图像。 |
| Angle, Dist | 输出参数 | 以海森法向形式(Hessian Normal Form, HNF)表示的直线参数:Angle 为法线角度,Dist 为法线长度。 |
使用说明
- 建议在执行
hough_lines_dir前,使用edges_image或sobel_dir获取方向信息图像ImageDir。 - 合理设置
DirectionUncertainty可在保证鲁棒性的同时控制计算量。 - 通过调整
AngleResolution、Threshold与 平滑参数 (Smoothing,FilterSize),可有效抑制噪声并提升直线检测的稳定性。 - 若需要可视化检测到的直线,可结合
get_line_params与disp_line算子实现。 - 当需要同时检测长线与短线时,适当增大
AngleGap与DistGap可避免局部重复检测。
算法特点
- 相比
hough_lines,hough_lines_dir通过引入边缘方向约束,能在噪声较多的图像中更稳定地检测出直线结构; - 当
DirectionUncertainty = 180时,其检测结果与hough_lines等价; - 适用于高精度工业检测场景或边缘模糊的图像。
六、Hough圆检测原理
Hough变换不仅能检测直线,也可用于圆形检测。
圆的方程为:
对于图像中一个边缘点 \((x, y)\),若半径 \(r\) 已知,则圆心 \((a, b)\) 满足:
对于每一个点\((x,y)\),其在参数空间(a,b,r)中都可以表示为一个圆锥,该圆锥表示过这个点的所有圆。那么我们还是之前的思路,找到最多圆锥所共有的点,即为我们检测到的圆形。此外,还需要明确一点。我们搜索的参数空间范围并不是无限大的,图像的大小已经把圆心的取值范围以及圆半径的取值范围的最大值给定住了。

因此:
- 若半径已知 → 参数空间仅有 \((a, b)\) 两个维度;
- 若半径未知 → 参数空间变为 \((a, b, r)\) 三维;
- 每个边缘点对多个 \((a, b, r)\) 值投票;
- 累加器中投票数最高的点即为可能的圆心与半径。
Hough梯度法
在三维空间下直接搜索圆的半径和圆心涉及到3个参数,运算量很大。下面介绍Hough梯度法,该方法根据圆的边缘梯度与边缘相垂直,先去确定圆心的位置,再去确定圆的半径。

此处的\(tan\theta\),对应着每个边缘点的梯度信息(方向),这样我们就通过利用边缘梯度信息将问题转换为了二维,从而能够重复利用上面直线检测的方法去找所有直线相交最多的点,即为我们的圆心。
Hough 变换圆检测算法
(1)根据精度要求,量化参数空间 a 和 b,由此建立二维累加数组 A(a,b),并将其初始化为零。
(2)计算边缘轮廓图像的梯度角度值 \(\tan \theta_i\)
(3)自上而下、自左向右扫描图像,如果检测到当前 \((x_i, y_i)\) 是边缘点,查找当前点所对应的梯度角正切值,然后根据式
计算出每一个 a 对应的 b 值。
(4)根据 a 和 b 的值,执行 \(A(a,b) = A(a,b) + 1\)。
(5)循环执行步骤(3)、(4),直到所有点全部处理完毕。
(6)找到累计数组中最大元素值对应坐标位置,该结果即为圆心坐标。
(7)将圆心坐标代入图像空间中,计算所有边缘点至圆心坐标的距离,找到距离数据中出现频率最高的值,即为圆的半径参数。
七、Halcon中使用 Hough 圆检测
在 Halcon 中,可通过算子 hough_circles 对二值化后的区域进行圆检测。其函数格式如下:
hough_circles(RegionIn : RegionOut : Radius, Percent, Mode)
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| RegionIn | 输入参数 | 输入的区域对象(Region),需对原始图像进行二值化或边缘提取后再输入。 |
| RegionOut | 输出参数 | 输出检测到的圆心位置。对于单个圆,结果可能包含多个像素点区域,而非单一像素点。 |
| Radius | 输入参数 | 圆的半径(像素单位),需要在程序设计前由用户预先设定。 |
| Percent | 输入参数 | 圆的完整度阈值,用于控制圆弧的闭合程度。对于完整的圆,通常设定为 90% 即可。 |
| Mode | 输入参数 | 半径模式选择,用于指定 Radius 所对应的圆边界位置。 |
Mode 参数取值说明
| 模式值 | 含义 | 说明 |
|---|---|---|
| 0 | 外边缘模式 | Radius 表示圆区域(或圆环)的外边缘半径。 |
| 1 | 中线模式 | Radius 表示圆环的中间线半径(通常用于理想圆检测)。 |
| 2 | 内边缘模式 | Radius 表示圆环的内边缘半径。 |
使用说明
- 在使用
hough_circles之前,需对原始图像进行边缘提取或二值化处理,以获得RegionIn区域。 - 调整
Radius与Percent参数,以提高检测的稳定性与精度。 - 输出的
RegionOut可进一步通过area_center或smallest_circle等算子获取圆心坐标与最终半径。
八、总结
| 检测类型 | 参数空间 | 常用方程 | 特点 |
|---|---|---|---|
| 直线检测 | \((\rho, \theta)\) | \(\rho = x\cos\theta + y\sin\theta\) | 适用于所有直线(包括垂直线) |
| 圆检测 | \((a, b, r)\) | \((x-a)^2 + (y-b)^2 = r^2\) | 支持检测任意半径的圆 |
优点:
- 鲁棒性强,不受噪声或断裂边缘影响;
- 能检测任意方向、大小的几何形状。
缺点:
- 参数空间维度高时计算量大;
- 对精度(参数步长)和阈值敏感;
- 不能直接使用,往往需要搭配边缘检测算法获取边缘。
✅ 总结一句话:
Hough变换是图像形状检测的“投票机制”,通过从像素空间到参数空间的映射,把“点检测”转化为“峰值搜索”。


浙公网安备 33010602011771号