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

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

文章图片

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

文章图片

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

文章图片

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

文章图片

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


    推荐阅读