首页 > 其他分享 >霍夫变换检测直线

霍夫变换检测直线

时间:2024-06-11 14:22:18浏览次数:26  
标签:直线 变换 检测 图像 霍夫 参数 double theta

一、概念

Hough直线检测的基本原理在于利用点与线的对偶性,即图像空间中的直线与参数空间中的点是一一对应的,因此将图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。

注意:

  1. 参数空间是极坐标系,不是k和b组成的笛卡尔坐标系,目的是为了兼容垂直于x轴的直线;
  2. 参数空间不是连续的,而是被离散量化为一个个等大小网格单元,首先直线的方向θ离散化为有限个等间距的离散值,参数ρ也就对应离散化为有限个值。

二、实施步骤

2.1 Hough直线检测步骤

  1. 离散化θ;
  2. 依据图像坐标中的x,y以及θ,求ρ;
  3. 统计离线参数空间中(ρ,θ)出现的次数,最大的即为待检测的直线。

2.1 使用Hough直线检测算法的一般步骤

  1. 彩色图像->灰度图
  2. 去噪(高斯核)
  3. 边缘提取(梯度算子、拉普拉斯算子、canny、sobel)
  4. Hough直线检测

2.3 Hough直线检测的优缺点

优点:抗干扰能力强,对图像中直线的殘缺部分、噪声以及其它共存的非直线结构不敏感,能容忍特征边界描述中的间隙,并且相对不受图像噪声的影响。

缺点:时间复杂度和空间复杂度都很高,并且在检测过程中只能确定直线方向,丢失了线段的长度信息,且由于霍夫检测过程中进行了离散化,因此检测精度受参数离散间隔制约。

三、OpenCV中函数接口介绍

3.1 标准Hough直线检测、多尺度Hough直线检测

CV_EXPORTS_W void HoughLines( InputArray image, OutputArray lines, 
  double rho, double theta, int threshold, 
  double srn = 0, double stn = 0, 
  double min_theta = 0, double max_theta = CV_PI );
  
  //InputArray image:输入图像,必须是8位单通道图像。 
  //OutputArray lines:检测到的线条参数集合。 
  //double rho:以像素为单位的距离步长。 
  //double theta:以弧度为单位的角度步长。 
  //int threshold:累加计数值的阈值参数,当参数空间某个交点的累加计数的值超过该阈值,则认为该交点对应了图像空间的一条直线。 
  //double srn:默认值为0,用于在多尺度霍夫变换中作为参数rho的除数,rho=rho/srn。 
  //double stn:默认值为0,用于在多尺度霍夫变换中作为参数theta的除数,theta=theta/stn。
  //如果srn和stn同时为0,就表示HoughLines函数执行标准霍夫变换,否则就是执行多尺度霍夫变换。

说明:
输出的内容是一个 std::vector<cv::Vec2f> 类型的向量,每个cv::Vec2f 表示一条直线,包含两个浮点数元素:

  1. ρ:点到坐标原点的距离(以像素为单位)。
  2. θ:从x轴到垂线与直线交点的角度(以弧度为单位)。

如果想要在图像空间中进行展示,需进行转换,代码如下:

    // 在原图上绘制检测到的直线
    for (size_t i = 0; i < lines.size(); i++) {
        float r = lines[i][0];
        float theta = lines[i][1];
        double cosTheta = cos(theta);
        double sinTheta = sin(theta);
        double x0 = cosTheta * r;
        double y0 = sinTheta * r;
        cv::Point pt1, pt2;
        pt1.x = cvRound(x0 + 1000 * (-sinTheta)); //1000是任意选定的值
        pt1.y = cvRound(y0 + 1000 * (cosTheta));
        pt2.x = cvRound(x0 - 1000 * (-sinTheta));
        pt2.y = cvRound(y0 - 1000 * (cosTheta));
        cv::line(src, pt1, pt2, cv::Scalar(0, 0, 255), 2, cv::LINE_AA);
    }

3.2 渐进概率式霍夫变换

CV_EXPORTS_W void HoughLinesP( InputArray image, OutputArray lines, 
  double rho, double theta, int threshold, 
  double minLineLength = 0, double maxLineGap = 0 ); 
  
  //InputArray image:输入图像,必须是8位单通道图像。 
  //OutputArray lines:检测到的线条参数集合。 
  //double rho:直线搜索时的距离步长,以像素为单位。 
  //double theta:直线搜索时的角度步长,以弧度为单位。 
  //int threshold:累加计数值的阈值参数,当参数空间某个交点的累加计数的值超过该阈值,则认为该交点对应了图像空间的一条直线。 
  //double minLineLength:默认值为0,表示最小线段长度阈值(像素)。 
  //double maxLineGap:线段上最近两点之间的阈值.默认值为0,表示直线断裂的最大间隔距离阈值。即如果有两条线段是在一条直线上,但它们之间有间隙,那么如果这个间隔距离小于该值,则被认为是一条线段,否则认为是两条线段。 

说明:
输出的内容是一个 std::vector<cv::Vec4f> 类型的向量,每个cv::Vec4f是一条直线,由具有四个元素的矢量(x1, y1, x2, y2)表示,其中(x1, y1)表示线段的起点,(x2, y2)表示线段的终点。

标签:直线,变换,检测,图像,霍夫,参数,double,theta
From: https://www.cnblogs.com/Terrypython/p/18241894

相关文章

  • 从零手撕一个网页版图形编辑器之坐标变换(3)
    ​本编辑器(土豆猫图形编辑器)社区版代码已开源,开源库地址:https://gitee.com/longhan13/lgxmap_community.git本文暂时中断前面章节的代码框架讲解,先讲解一下本编辑器所使用的坐标变换方法及涉及的相关代码,是本编辑器基础的基础。本编辑器所使用的坐标系为右手坐标系,既X正向水......
  • QGIS配准工具的变换算法(翻译自QGIS官方文档)
    QGIS配准工具的变换算法配准工具中有多种变换算法可用,具体取决于输入数据的类型和质量、您愿意在最终结果中引入的几何变形的性质和数量,以及地面控制点(GCP)的数量。目前,可以使用以下变换类型:线性算法用于创建坐标定位文件,与其他算法不同,它实际上不会变换栅格像素。它......
  • 编写一个程序,提示用户输入三个点 p0、p1 和 p2,显示 p2 是否在从 p0 到 p1 的线段左侧
    (几何:点的位置)给定一个从点p0(x0,y0)到pl(xl,pl)的有向线段,可以使用下面的条件来确定点p2(x2,y2)是在线段的左侧、右侧,或者在该直线上(见下图): 编写一个程序,提示用户输入三个点p0、p1和p2,显示p2是否在从p0到p1的线段左侧、右侧,或者在该直线上。下面是运行示例:......
  • §4. 二重积分的变量变换
     掌握二重积分的变量变换的公式和方法。掌握用极坐标计算二重积分的方法(主要是如何把二重积分在极坐标系下化为累次积分)。重点习题:例1-例4、例6难点:変量変换后区域的确定。方法是将区域边界进行变换,新的边界围出来的区域即新的区域。经典方法:利用极坐标变换将圆或圆的一部分变......
  • FPGA数字信号处理之:小波变换算法的实现
    一、定义        小波变换(wavelettransform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够......
  • 27、matlab傅里叶变换:fft()函数
    1、fft 快速傅里叶变换语法Y=fft(X)使用快速傅里叶变换(FFT)算法计算X的离散傅里叶变换(DFT)。Y=fft(X,n)返回n点DFT。Y=fft(X,n,dim)返回沿维度dim的傅里叶变换。例如,如果X是矩阵,则fft(X,n,2)返回每行的n点傅里叶变换含噪信号1)原始信号加噪声......
  • 基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证
    目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览fpga仿真结果matlab调用FPGA的仿真结果进行图像显示2.算法运行软件版本vivado2019.2matlab2022a3.部分核心程序..................................
  • 【心电信号ECG】小波变换心音信号去噪(二维时域 频域 三维时域 频域)【含Matlab源码 462
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。......
  • 如果某一段信号某个频率信号突然消失了,傅里叶变换能否反应出这种变化
    傅里叶变换在处理和分析信号的频率成分方面非常强大,但它有一个重要的局限性,即它假设信号是时间无限长且不变的。这意味着傅里叶变换在处理非平稳信号(即频率成分随时间变化的信号)时,可能不能很好地反映出频率成分的突变。检测频率成分的变化如果某段信号中的某个频率成分突然消失,......
  • 暗水印——变换域DCT水印算法(一种通用性强,能有抵御攻击的手段)
     随着计算机和网络技术的飞速发展,信息的安全保护问题日益突出。数字图像、音频和视频等多媒体数字产品愈来愈需要一种有效的版权保护方法——水印技术,通常用于保护知识产权、防止未经授权的访问、作弊等。广义上可以把水印技术划分为四大类:图像水印、视频水印、音频水印和......