博客
关于我
OpenCV学习笔记之十一——霍夫变换(霍夫线变换,霍夫圆变换)
阅读量:798 次
发布时间:2023-04-15

本文共 2694 字,大约阅读时间需要 8 分钟。

霍夫变换与霍夫圆变换技术详解

一、霍夫变换概述

霍夫变换是一种图像处理技术,广泛应用于直线检测、曲线识别等领域。其核心思想是在参数空间中通过累加运算找到符合特定形状的曲线集合。霍夫变换最初由Paul Hough提出,后经Richard Duda和Peter Hart的改进,逐渐发展成为用于多种形状识别的重要工具。

1.1 霍夫线变换

霍夫线变换专注于直线检测,适用于边缘二值图像。OpenCV提供三种霍夫线变换:

  • 标准霍夫变换(SHT):由HoughLines函数实现,适用于经典霍夫线变换。
  • 多尺度霍夫变换(MSHT):基于标准霍夫变换的多尺度扩展,通过HoughLines函数调用。
  • 累计概率霍夫变换(PPHT):通过HoughLinesP函数实现,优化了标准霍夫变换的效率。

1.2 霍夫圆变换

霍夫圆变换扩展至圆形物体识别,需要处理三个空间参数:圆心坐标和半径。OpenCV中采用“霍夫梯度法”来实现圆变换,通过边缘检测和梯度计算,逐步筛选圆心候选,最终确定圆形区域。

二、霍夫变换原理

2.1 参数空间转换

霍夫变换将直线表示为极坐标形式:

  • 直线表示:极径ρ和极角θ表示直线。
  • 点对应的曲线:每个点对应一族直线,形成极坐标曲线。

2.2 曲线交点检测

霍夫变换通过检测参数空间中的交点来确定直线或圆。对于直线,交点数量超过阈值即可确认直线存在;对于圆,需要同时满足圆心和半径条件。

三、霍夫线变换函数详情

3.1 HoughLines函数

  • 函数定义
    void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0)
  • 参数说明
    • image:输入图像,需转换为8位单通道二进制图像。
    • lines:输出直线集合,每条线由两个点表示。
    • rho:直线搜索的半径步长。
    • theta:直线搜索的角度步长。
    • threshold:交点累加值阈值。
    • srnstn:多尺度参数,用于控制累加器步长。

3.2 HoughLinesP函数

  • 函数定义
    void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0)
  • 参数说明
    • image:输入图像,需转换为8位单通道二进制图像。
    • lines:输出直线集合,每条线由四个点表示端点。
    • rho:直线搜索的半径步长。
    • theta:直线搜索的角度步长。
    • threshold:交点累加值阈值。
    • minLineLength:直线最小长度,过短的线段不显示。
    • maxLineGap:直线最大间距,避免过长的线段重复。

四、霍夫圆变换实现

4.1 HoughCircles函数

  • 函数定义
    void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0)
  • 参数说明
    • image:输入图像,需为8位灰度单通道图像。
    • circles:输出圆集合,每个圆由圆心坐标和半径表示。
    • method:检测方法,目前仅支持CV_HOUGH_GRADIENT
    • dp:累加器分辨率与输入图像的比率。
    • minDist:圆心最小距离,避免近似圆重复检测。
    • param1param2:边缘检测参数,影响圆的可靠性。
    • minRadiusmaxRadius:圆的半径范围。

4.2 实现步骤

  • 边缘检测:使用Canny边缘检测获取图像边缘。
  • 梯度计算:利用Sobel算子计算局部梯度,确定切线方向。
  • 累加器更新:根据梯度方向更新累加器,找出圆心候选。
  • 圆心筛选:根据累加器值和距离阈值筛选最可靠的圆心。
  • 半径确定:通过非零像素支持度确定最优半径。
  • 五、代码实现示例

    #include 
    #include
    #include
    using namespace std;using namespace cv;Mat Img_scr, Img_gray, Img_Canny, Img_BGR;Mat Img_scr1, Img_gray1, Img_dst;void callback_houghlines(int, void*) { static int threshold_val = 110; // 使用HoughLinesP函数检测直线 vector
    lines; HoughLinesP(Img_Canny, lines, 1, CV_PI/180, threshold_val, 30, 10); // 绘制检测到的直线 for (size_t i = 0; i < lines.size(); ++i) { Vec4i L = lines[i]; line(Img_BGR, Point(L[0], L[1]), Point(L[2], L[3]), Scalar(60, 50, 180), 1); } imshow("HoughLinesP", Img_scr);}int main() { threshold_val = 110; Img_scr = imread("build.jpg"); Img_Canny = Canny(Img_scr, 50, 200, 3); namedWindow("HoughLinesP"); createTrackbar("threshold", "HoughLinesP", &threshold_val, 320, callback_houghlines); return 0;}

    六、效果展示

    通过上述代码,可以实现实时直线检测,用户可以通过滚动条调整阈值,观察不同直线检测结果。代码结构清晰,注释详细,便于理解和修改。

    转载地址:http://sgrfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
    查看>>
    MySQL InnoDB引擎的锁机制详解
    查看>>
    Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
    查看>>
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    mysql order by多个字段排序
    查看>>
    MySQL Order By实现原理分析和Filesort优化
    查看>>
    mysql problems
    查看>>
    mysql replace first,MySQL中处理各种重复的一些方法
    查看>>
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    查看>>
    Mysql Row_Format 参数讲解
    查看>>
    mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
    查看>>
    MySQL Server 5.5安装记录
    查看>>
    mysql slave 停了_slave 停止。求解决方法
    查看>>
    MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
    查看>>
    mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
    查看>>
    mysql Timestamp时间隔了8小时
    查看>>
    Mysql tinyint(1)与tinyint(4)的区别
    查看>>