霍夫变换(直线检测) 您所在的位置:网站首页 霍夫曲线检测 霍夫变换(直线检测)

霍夫变换(直线检测)

2024-07-06 02:23| 来源: 网络整理| 查看: 265

一、算法简介

        霍夫变换(Hough Transform)是一种用于特征提取的技术,主要用于在图像中检测几何形状,最常见的是直线、圆形等。霍夫变换的基本思想是利用图像空间与参数空间之间的转换来识别特定形状。

        对于直线检测的霍夫变换,直线在图像空间可以表示为y=mx+b,其中m是斜率,b是截距。然而,这种表示方式在处理垂直线时会遇到问题,因为斜率m会趋向于无穷大。因此,霍夫变换采用不同的参数表示法,即极坐标系中的r=xcosθ+ysinθ,其中r是直线到原点的距离,θ是直线的方向角。

        图像中的每个点都可以在参数空间中表示为一条正弦曲线,所有这些曲线的交点代表了通过这些点的直线。通过检测这些交点,我们可以找到图像中存在的直线。

二、实现方式

        通过OpenCV自带的函数实现。

HoughLines: HoughLines是实现标准霍夫变换(SHT, Standard Hough Transform)的函数。它返回的每条直线由两个参数ρ和θ表示。这里,ρ是直线到坐标原点的距离(可以是负数),θ是直线的正规化角度,即从x轴到直线的角度。因为HoughLines使用的是极坐标系表示法,所以它能够检测到整个图像范围内的直线,包括垂直线和水平线。HoughLines比较适合于检测图像中的长直线,相比于HoughLinesP可能需要更多的计算资源,因为它会尝试在整个图像中查找每一条可能的直线。 HoughLinesP: HoughLinesP是实现累积概率霍夫变换(PPHT, Progressive Probabilistic Hough Transform)的函数。它返回检测到的直线的端点,即每条直线由它的两个端点(x1​,y1​),(x2​,y2​)来表示。相比于HoughLines,HoughLinesP不是检测整个图像中的完整直线,而是找到直线段。因此,它对于检测短线段更为有效。它可以减少计算量,提高了效率,允许指定额外的参数来控制检测到的线段的最小长度和最大断裂,这使得它在处理实际图像时更加灵活和有效。HoughLinesP允许用户指定直线段的最小长度和最大间隙,这使得它在某些应用场景下更为灵活和有效。 三、实现步骤 图像预处理:检查通道数、滤波、膨胀腐蚀等等,根据实际使用需求添加;边缘检测:降低计算量、提高检测精度、减少噪声的影响;霍夫变换。 四、代码实现(C++) HoughLines: 参数 image: 输入图像,类型为cv::Mat。这是要进行直线检测的原始图像。cannyThreshold1和cannyThreshold2: 这两个参数用于Canny边缘检测器。cannyThreshold1是较低的阈值,而cannyThreshold2是较高的阈值。这两个值决定了一个像素点是否被认为是边缘的条件。houghRho: 霍夫变换中的ρ(rho)参数,表示ρ的解析度。该值越小,能检测到的直线就越精细。houghTheta: 霍夫变换中的θ(theta)参数,表示θ的解析度(以弧度为单位)。该值越小,能检测到的直线的角度就越精细。houghThreshold: 霍夫变换的阈值,只有超过这个阈值的直线才会被检测出来。该值越高,检测到的直线越少,但越可靠。 返回值

        返回一个std::vector类型的列表,其中每个cv::Vec2f包含两个浮点数:第一个数是直线到原点的距离ρ(rho),第二个数是直线的旋转角度θ(theta,以弧度为单位)。这些值一起定义了检测到的直线。

std::vector detectLines(cv::Mat image, double cannyThreshold1, double cannyThreshold2, double houghRho, double houghTheta, int houghThreshold) { cv::Mat processedImage; // 检查图像通道数,如果是多通道,则转换为灰度图 if (image.channels() > 1) cv::cvtColor(image, processedImage, cv::COLOR_BGR2GRAY); else processedImage = image.clone(); // 边缘检测 cv::Mat edges; cv::Canny(processedImage, edges, cannyThreshold1, cannyThreshold2, 3); // 标准霍夫变换检测直线 std::vector lines; cv::HoughLines(edges, lines, houghRho, houghTheta, houghThreshold); return lines; } HoughLinesP: 参数 image: 输入图像,类型为cv::Mat。这是需要进行直线段检测的源图像。cannyThreshold1与cannyThreshold2: Canny边缘检测器的两个阈值。cannyThreshold1是较低的阈值,而cannyThreshold2是较高的阈值。这两个阈值共同用于确定边缘检测的强度和连续性。houghRho: 霍夫变换中ρ(rho)的解析度,即直线到原点的距离分辨率,以像素为单位。houghTheta: 霍夫变换中θ(theta)的解析度,即直线旋转角度的分辨率,以弧度为单位。houghThreshold: 霍夫变换中的阈值,决定了直线段是否被检测的最小投票数。minLineLength: 能被检测为直线段的最小长度。短于此长度的线段将不被认为是直线。maxLineGap: 同一直线上允许的最大断开长度。如果两个点之间的间隔小于这个值,它们会被视为同一直线段的一部分。 返回值

        返回一个std::vector类型的向量,其中每个cv::Vec4i包含四个整数,表示一条直线段的两个端点(x1, y1, x2, y2)。这样的表示方法允许直接在图像上绘制检测到的直线段。

std::vector detectLine(cv::Mat image, double cannyThreshold1, double cannyThreshold2, double houghRho, double houghTheta, int houghThreshold, int minLineLength, int maxLineGap) { cv::Mat processedImage; // 检查图像通道数,如果是多通道,则转换为灰度图 if (image.channels() > 1) cv::cvtColor(image, processedImage, cv::COLOR_BGR2GRAY); else processedImage = image.clone(); // 边缘检测 cv::Mat edges; cv::Canny(processedImage, edges, cannyThreshold1, cannyThreshold2, 3); // 累积概率霍夫变换检测直线段 std::vector Lines; cv::HoughLinesP(edges, Lines, houghRho, houghTheta, houghThreshold, minLineLength, maxLineGap); return Lines; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有