来源:技术饭
霍夫变换是一种对图像中形状的定位技术,常被用于提取图像中的直线,圆和椭圆等简单形状。霍夫变换运用两个坐标空间之间的变换,将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。
简单形状指可以用少量参数表示的形状,如,直线可由两个参数表示。霍夫变换的主要优点是它对遮挡不敏感。本文通过一个简单的例子来介绍霍夫变换如何运作的。
霍夫变换检测直线
直线的方程通常表示为:
该函数中斜率m可以取介于–∞到+∞之间的值。但对于霍夫变换,参数需要有界。故在霍夫变换中,直线的极形表示为:
(方程1)
这里ρ表示直线与原点的垂直距离(以像素为单位),θ是以弧度为单位测量的角度,直线与原点形成的角度,如下图所示:
在理论上,ρ可能取0到+∞之间的值,但因为图片本身是有限的,故ρ也是有界的。
累加器
在2D空间中,每一个(ρ,θ)对应一条线,这个过程也叫做线由ρ和θ参数化。
下图2D阵列被称为累加器,因为我们将使用这个阵列的仓来收集图像中存在哪些线的证据。左上角的单元格对应于a(-R,0),右下角对应于(R,π)。随着收集到更多关于存在具有参数ρ和θ的线的证据,容器内的值(ρ,θ)将增加。
检测图像中的线条需要以下几个步骤:
1.初始化累加器
首先需要创建一个累加器数组。累加器中的单元格数量是一个设计决定。假设选择了一个10×10的累加器,意味着ρ只能取10个不同的值,θ可以取10个不相同的值,因此程序可以检测到100种不同的线。累加器的大小也将取决于图像的分辨率。
2.检测边缘
当累加器设置好后,我们需要为累加器的每个单元搜集数据。如果图像中有一条可见线,则边缘检测器应在该线的边界处发射。这些边缘像素为线的存在提供了数据。边缘检测的输出是边缘像素的阵列 [ (x1, y1), (x2, y2) ... (xn, yn)]
3. 按边缘像素进行投票
对于上述阵列中的每个边缘像素(x,y),我们将θ的值从0变为π,并将其代入方程1,以获得ρ的值。在下图中,我们改变三个像素的θ(由三条彩色曲线表示),并使用方程1获得ρ的值。这些曲线在一点相交,这表明参数为θ=1和ρ=9.5的线正在穿过它们。
我们会得到数百个边缘像素,累加器用于找到由边缘像素生成的所有曲线的交点。
假设我们的蓄能器尺寸为20×20。因此,θ有20个不同的值,因此对于每个边缘像素(x,y),我们可以使用方程1计算20个(ρ,θ)对。与这20个(ρ,θ)值相对应的累加器的bin递增。我们对每个边缘像素都这样做,现在我们有了一个累加器,它拥有关于图像中所有可能线条的所有数据。我们可以简单地选择累加器中高于某个阈值的仓,以找到图像中的线。如果阈值更高,则强线更少,如果阈值更低,就会发现大量的线,包括一些弱线。
在OpenCV中,使用Hough变换的线检测在函数HoughLines和HoughLinesP中实现。此函数包括以下参数:
edges:边缘检测器的输出
line:用于存储线的起点和终点坐标的矢量。
rho:分辨率参数ρ(以像素为单位)
θ:参数θ的分辨率,单位为弧度
threshold:检测直线的最小交点
结果:
霍夫变换检测圆
在线霍夫变换的情况下,我们要检测圆需要三个参数:(x,y)圆心的坐标,半径。所以圆探测器将需要一个3D累加器,每个参数一个。圆的方程为:
要检测圆需要以下步骤:
1. 在边缘检测器(Canny)的帮助下找到给定图像中的边缘。
2. 为圆半径的最大值和最小值设置了阈值。
3. 在3D累加器阵列中收集存在具有不同中心和半径的圆的数据。
函数HoughCircles在OpenCV中用于检测图像中的圆。它采用以下参数:
image:输入图像。
method:检测方法。
dp:累加器分辨率与图像分辨率的反比。
mindst:检测到的圆中心之间的最小距离。
param_1和param_2:这些是特定于方法的参数。
min_Radius:待检测圆的最小半径。
max_Radius:要检测的最大半径。
检测结果如下,其质量很大程度上决定于边缘的质量。
霍夫变换最早于1962年被提出,但随着计算机视觉近年来的飞速发展,这种算法才开始广泛使用。如今,特征提取的需求量越来越大,对于数据进行标记所耗费的时间和精力也极大,而霍夫变换可在复杂的场景中提取特征,应用范围十分广泛。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !