使用霍夫变换和OpenCV以及Python实现形状的检测

今天,我们将学习如何借助称为霍夫变换的技术来检测图像中的直线和圆。在开始对图像应用霍夫变换之前,我们需要了解霍夫空间是什么,我们将通过示例的方式来学习。

1、参数空间

当我们处理图像时,我们可以想象图像是在某些x和y坐标上的2d矩阵,在此之下,一条线可以描述为 y = mx + b

但是在参数空间(我们将其称为霍夫空间)中,我可以代表与mvs 相同的线b,因此图像空间上线的特征将是m-b霍夫空间中该位置的单点。

但是,我们有一个问题,使用y = mx + b,由于斜率是无限的,因此我们无法表示垂直线。因此,我们需要一种更好的参数化方法,即极坐标(rho和theta)。

2、霍夫空间

(1)rho:描述直线到原点的距离;(2)theta:描述与水平面的夹角;

但是,一个非常重要的问题是,当我们围绕一条线取多个点并转换为霍夫空间时,会发生什么。

图像空间上的单个点转换为霍夫空间上的曲线,其特殊之处在于,图像空间上一条线之间的点将由具有单个接触点的多条曲线表示。这将是我们的目标,找到一组曲线相交的点。

3、什么是霍夫变换?

霍夫变换是一种特征提取方法,用于检测图像中的简单形状,例如圆形,直线等。“简单”特性是根据参数的形状表示得出的。“简单”形状仅由几个参数表示,例如,一条线可以由其斜率和截距表示,或者可以由x,y和半径表示。在我们的示例中,霍夫变换将负责处理图像上的点并计算霍夫空间中的值。用于进行转换并随后找到相交曲线的算法有点复杂,因此不在本文讨论范围之内。但是,我们将看一下该算法的实现,它是OpenCV库的一部分。

4、使用OpenCV检测线

在OpenCV中,使用Hough变换检测线中的功能被实现HoughLines和HoughLinesP(概率Hough变换)。我们将专注于后者。该函数需要以下参数:

(1)image:8位单通道二进制源图像。该图像可以通过该功能进行修改。

(2)lines:行的输出向量。每条线由4个元素的向量(x_1,y_1,x_2,y_2)表示,其中(x_1,y_1)和(x_2,y_2)是每个检测到的线段的终点。

(3)rho:累加器的距离分辨率(以像素为单位)。

(4)theta:累加器的角度分辨率(以弧度为单位)。

(5)threshold:累加器阈值参数。仅返回那些获得足够投票的行

(6)minLineLength:最小行长。短于此的线段将被拒绝。

(7)maxLineGap:同一条线上的点之间允许链接的最大间隙。太复杂?一个例子更容易理解:

结果如下:

非常重要的一点是,我们实际上使用仅边缘图像作为Hough变换的参数,否则该算法将无法按预期工作。

5、使用OpenCV检测圆圈

该过程与行的过程大致相同,除了这次我们将使用与OpenCV库不同的函数。即now HoughCircles,它接受以下的参数:

(1)image:8位单通道灰度输入图像。

(2)circles:找到的圆的输出向量。每个向量都被编码为3元素浮点向量(x,y,radius)。

(3)circle_storage:在C函数中,这是一个存储器存储,其中将包含找到的圆的输出序列。

(4)method:使用的检测方法。当前,唯一实现的方法是CV_HOUGH_GRADIENT,基本上是21HT

(5)dp:累加器分辨率与图像分辨率的反比。例如,如果dp = 1,则累加器具有与输入图像相同的分辨率。如果dp = 2,则累加器的宽度和高度是其一半。

(6)minDist:检测到的圆心之间的最小距离。如果参数太小,则除了真实的圆圈外,还可能会错误地检测到多个邻居圆圈。如果太大,可能会错过一些圆圈。

(7)param1:第一个方法特定的参数。对于CV_HOUGH_GRADIENT,它是传递给Canny()边缘检测器的两个阈值中的较高阈值(较低的阈值是较小的两倍)。

(8)param2:第二个方法特定的参数。在CV_HOUGH_GRADIENT的情况下,它是检测阶段圆心的累加器阈值。它越小,可能会检测到更多的假圆圈。与较大的累加器值相对应的圆将首先返回。

(9)minRadius:最小圆半径。

(10)maxRadius:最大圆半径。

请记住,参数必须有所不同,因为我们无法用与用于线相同的参数化描述圆,而是需要使用像的方程(x - x0)^^2 + (y - y0)^^2 = r^^2:

请注意,与之前的示例相比,此处我们未应用任何边缘检测功能。这是因为该函数HoughCircles具有内置的canny检测。检测结果:

6、结尾

霍夫变换是一种用于检测图像中简单形状的出色技术,它具有多种应用,从医学应用(例如X射线,CT和MRI分析)到自动驾驶汽车。如果你想了解有关Hough空间的更多信息,建议你自己实际操作一遍运行代码,自己尝试不同的配置,并查看OpenCV官方文档以获取更多的信息。谢谢阅读!

打开APP阅读更多精彩内容