博客
关于我
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 DBA 进阶知识详解
    查看>>
    Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
    查看>>
    Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
    查看>>
    mysql deadlock found when trying to get lock暴力解决
    查看>>
    MuseTalk如何生成高质量视频(使用技巧)
    查看>>
    mutiplemap 总结
    查看>>
    MySQL DELETE 表别名问题
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>
    MySQL FEDERATED 提示
    查看>>
    mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
    查看>>
    Mysql group by
    查看>>
    MySQL I 有福啦,窗口函数大大提高了取数的效率!
    查看>>
    mysql id自动增长 初始值 Mysql重置auto_increment初始值
    查看>>
    MySQL in 太多过慢的 3 种解决方案
    查看>>
    MySQL InnoDB 三大文件日志,看完秒懂
    查看>>
    Mysql InnoDB 数据更新导致锁表
    查看>>
    Mysql Innodb 锁机制
    查看>>
    MySQL InnoDB中意向锁的作用及原理探
    查看>>
    MySQL InnoDB事务隔离级别与锁机制深入解析
    查看>>