直线检测方法—LSD论文翻译

2023-11-18

 

附原文链接:LSD:a Line Segment Detector

摘  要

LSD是一个线段检测器,能够在线性时间内得到亚像素级精度的检测结果,它无需调试参数就可以适用于任何数字图像上,并且能够自我控制错误数量的检测:平均来说,一个图像中允许一个错误检测。该方法是基于Burns,Hanson和Riseman的方法,并且还采用Desolneux,Moisan和Morel的理论使用了相对(contrario)验证的方法。本文描述的版本相对于原文提出的版本有了进一步改善。

Introduction

LSD目的是为了检测图像中局部直线的边缘,这就是我们常说的线段,图像中的边缘区域就是灰度值(gray level)从黑到白(或从白到黑)变化明显的图像区域,因此梯度(gradient)和水平线(level-lines)是图像中关键的概念,如下图1所示。

本算法首先计算图像中各个像素点的的level-line角度,从而产生level-line field(是一种单位向量场,并且每个向量都同过基准点且相切于level-line),然后这个level-line field将在一定容忍度τ内具有相同的level-line角度的像素划分成不同的像素连通域,这个连通域称之为线段支持域(line support regions),如图2所示。

 每一个线段支持域(一组像素点)都是直线分割的候选区域,并且都有个相应的矩形与之一一对应,该矩形的主方向为线段支持域的惯性主轴方向,并且矩形的大小必须覆盖整个线段支持域,如图3所示。

 每一个矩阵都要经过验证,将矩形区域内像素点的level-line角度与矩形主方向角度的夹角在容忍度τ内的像素点称之为对齐点(aligned point),如图4所示,统计矩形区域内像素点的数量n和内点的数量k的比值,它们之间的比值将作为判断矩形区域是否为检测的线段的标准,该判断标准是基于Desolneux。Moisan和Morel等人提出的一种contrario方法和Helmholtz原则,所谓Helmholtz原则指出不应该对噪声图像产生任何感知(或检测),相应的contrario方法提出在不存在所需结构的情况下定义噪声或contrario模型H0,然后,如果在contrario模型上预期的事件数量与观察到的事件数量一样,则对事件进行验证,换句话说,结构化事件在contrario模型中被定义为稀少。

 对于线段来说,我们对对齐点(aligned point)的数量感兴趣,我们考虑到contrario模型中的线段具有与观察到的线段一样多或更多的对齐点(aligned point),给定一个图像i和矩形r,我们记作k(r,i)最为矩形r中对齐点的个数,n(r)是矩形r中像素的总个数,那么我们期望下式成立:

 

其中表示被考虑矩阵的总数,表示一个矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率,I是H0对应的的随机噪声图像,其固定了对齐点k(r,I)的分布,该分布仅取决于与level-line field相对应的I的分布,因此,H0是用于图像梯度方向的噪声模型,而不是用于图像的噪声模型。k(r,I)中I不对应于图像而是对应于H0的level-line field,但是这并不影响k(r,I)仅仅取决于梯度方向。用于线段检测的contrario模型H0被定义为满足以下特性的level-line field的随机模型:

  • 由独立随机变量组成。
  • 是在[0,2π]上服从均匀分布。

 其中是像素j的level-line角度,在假设H0下,contrario模型上的像素是对齐点的概率为:,并且由于随机变量LLA(j)的独立性,k(r,I)遵循二项式分布,于是矩形对应的噪声模型中对齐点数量不小于实际模型中对齐点数量的概率为:

其中是二项分布的尾部:

测试数对应于可以以固定精度显示对齐的矩形总数,这里要注意的是矩形是定向的,这意味着其起点和终点的顺序不是任意的:起始编码那一侧较暗,因此,从A点到B点的矩形与从B点到A点的矩形是不同的,更进一步详尽的选择是采用所有以图像像素开始和结束的矩形。在一个的图像中可以提供个不同的矩阵,而且矩形的宽度大小为,如下图5所示。

 因此所有可能的矩形个数为,p值的初始值设置为,考虑到后续对于p值还有其他的测试值而不仅仅是\tau /\pi,设为\gamma个,因此测试矩形总数N{_{test}}为:,最终我们定义矩形r在图像i中的误检个数(NFA)为:

 设置一个NFA的阈值\varepsilon,如果一个矩形满足NFA(r,i)\leqslant \varepsilon,那么就可以将其保留为一个直线段检测结果。

Algorithm

本文中的LSD算法的输入为一张灰度值图像,输出为一系列的检测到的线段(矩形),伪算法如下图所示。

  

  1. 以默认 s=0.8的尺度对输入图像进行高斯下采样。
  2. 计算每一个点的梯度值以及level-line方向(level-line orientation)。
  3. 根据梯度值对所有点进行伪排序(pseudo-ordered),建立状态列表,所有点设置为UNUSED。
  4. 将梯度值小于ρ的点状态表中相应位置设置为USED。
  5. 取出列表中梯度最大(伪排列的首位)的点作为种子点(seed),状态列表中设为USED。
    do:
    1. 以seed为起点,搜索周围UNUSED并且方向在阈值[ -t, t]范围内的点,状态改为USED。
    2. 生成包含所有满足点的矩形R。
    3. 判断对齐点(aligned point)密度是否满足阈值D,若不满足,截断(cut)R变为多个矩形框,直至满足。
    4. 计算NFA。
    5. 改变R使NFA的值更小直至NFA <= ε ,R加入输出列表。

图像尺寸缩放(Image Scaling)

本文中LSD算法的第一步是将输入图像的尺度缩小至原来的80%,这种尺度缩小的目的是为了减弱甚至消除图像中的锯齿效应(staircase effect)。将图像进行模糊操作也可以带来同样的效果,但是容易检测到图像中的白噪声(white noise)而产生误检。图6显示了两张不同角度的带有离散边缘的图像,这两张图像都有锯齿效应。在原始尺度下使用LSD算法提取线段,左图提取出四根水平线段而不是一整段,右图则没有提取出任何线段。这都不是我们想要的结果。

图7中显示了将这两张图像缩放至原来的80%后使用LSD算法的结果,从图中可知,都能提取到边缘并且具有正确的方向(尽管左图中提取的线段是断裂的(fragmented))。

将尺度缩小至原来的80%能够有效的解决锯齿效应(将尺度缩小至80%意味着X轴和Y轴都要缩小至原来的80%,因此图像中像素的数量将减小至原来的64%)。本文中的图像尺度缩放是通过高斯降采样(Guassian sub-sampling)进行的:图像首先通过高斯核函数(Guassian Kernel)进行滤波从而避免锯齿现象(aliasing),然后进行降采样。高斯核函数的标准差(standard deviation)由σ = Σ/S  决定,这里S 是缩放因子,这里是0.8, Σ的值设为0.6,能够很好的避免锯齿效应同时避免图像模糊(image blurring)。

梯度计算(Gradient Computation)

图像的梯度是由下图中的2x2的模板(mask)作用于每个点的像素计算到的:

 

其中i(x, y)代表着坐标为(x, y)的像素点的灰度值,图像的梯度由下列公式计算得到:

level-line角度由以下公式计算得到:

 

 梯度的幅值(magnitude)由以下公式计算得到:

 

本算法中选用最小尺寸的模板是为了尽可能的减少梯度计算过程中的彼此依赖。图像的梯度和level-line角度设定(encoder)了边缘的方向,即为从黑到白的转换。值得注意的是,从黑到白和从白到黑的转换是不一样的,两者在梯度和level-line角度都相差了180°。这就意味着LSD算法提取的线段是有方向的并且起点和终点不是随意的(arbitrary)。例如,如果将图像的灰度值反转(revert),那么LSD算法提取出来的线段是一样的,但是线段上的起点和终点将会交换位置 。值得注意的是,本算法计算的图像的梯度值不是像素点(x, y)处的,而是(x+0.5, y+0.5)处的。这个半像素的偏移(offset)会加到输出矩形的坐标中去,从而得到相应的结果。

梯度伪排序(Gradient Pseudo-Ordering)

LSD算法是一种贪婪(greedy)算法,像素处理的顺序会对结果产生一定的影响。边缘的像素点往往具有高的梯度值,因此线段的搜索通常从最高的梯度值开始。排序算法通常需要O(log n)的时间复杂度,然而一个简单的像素梯度伪排序算法只要求O(n)的线性时间复杂度。为了实现这个目标,我们将像素梯度幅值从0至图像中最大的幅值均匀地分成1024个等级(bin),因此图像中的像素点根据他们的梯度值分成了1024个等级。LSD算法首先使用最大梯度值等级中的像素作为种子像素,然后从第二大梯度值等级的像素中选取种子像素,以此内推直至选完所有的等级。当灰度值范围为[0,255]时,将梯度幅分成1024等分完全够用。

梯度阈值(Gradient Threshold)

小梯度值的像素点一般出现在平滑区域或者是梯度变化缓慢的区域。同时,在梯度计算的过程中量化这些点的值会造成很大的误差。在LSD算法中,梯度值小于阈值ρ的像素不能用于线段支持域(line-support regions)和矩形的构建。假定量化误差为n和存在理想的图像i,我们可以得到:

 

 根据图8,我们可以得到:

 

 

其中q 是|∇n|的界限(bound)。利用这个准则我们将角度误差大于角度容忍度τ 剔除。假设|角度误差|≤ τ,我们可以得到:,梯度阈值ρ由q和τ 决定,其中q是梯度值计算过程中量化效应产生的可能误差,τ是区域增长算法中用到的角度容忍度。根据经验,我们将q设为2。

区域增长(Region Growing)

线段支持域是通过合并相同方向的level-line实现的,依赖一种区域增长算法。通过搜索邻居8点中的未使用像素点来确定是否加去线段支持域中,当level-line角度和区域角度θregion 小于角度容忍度τ时将该level-line添加到线段支持区域中。初始的区域角度是由种子像素的level-line角度确定,然后在区域中每增加一个像素点都会更新一次区域角度,有下列公式确定:

 

 区域增长算法如下图所示:

  

 

角度容忍度设为22.5度时最为合理,在该容忍度范围内的像素点都会加入到线段支持域中,他们很大程度上和区域的方向保持一致。如下图所示,实验发现,容忍度为22.5是个较好的参数。

 

矩形近似(Rectangular Approximation)

一个线段对应一个矩形,在评估线段支持域前需要找到与之对应的矩形。将线段支持域看成一个刚体,像素点的梯度值作为该点的质量。矩形的中心为线段支持域的质心,矩形的主方向为线段支持域的第一惯性轴方向。矩形的长度和宽度为包含整个线段支持域的最小值。

 

 

NFA计算(NFA Computation)

NFA:the number of false alarms。The validation step is based on the a contrario approach and the Helmholtz principle proposed by Desolneux。the Helmholtz principle:在完美噪声图像图像中不应该检测到目标。 contrario approach:一个不会检测到目标的噪声图像。对于本课题,contrario model是一个像素值为level-line angle的图像。其level-line angle随机分解为独立且服从平均分布于[0-2*PI]。这里用NFA(Number of False Alarms)来评判观测图像中某个候选矩形少于contrario model中相同位置矩形里内点的数量的概率,NFA越大,表明当前矩形与contrario model中相同位置越相似,相反的,当前矩形越有可能是“真正的目标”。

其中:

   NFA = N * Ph0[ k(r,I) >= k(r,i) ]

  上式中,N为当前大小(m*n)图像中直线(矩形框)的数量。在m*n的图像中直线的起点和终点分别有m*n种选择,所以一共有(m*n)*(m*n)种起点和终点搭配。线段的宽度为[0,m*n ^0.5]。因此在m*n大小的图像中有(m*n)^2.5 种不同直线。N=(m*n)^2.5。k(r,I) 为contrario model ,I 中 r 矩形里aligned pt的数量。k(r,i) 为observe img,i 中 r 矩形里aligned pt的数量。根据contrario model的建立规则,每个像素都服从值域为[0,2*PI]的二项分布。

设k(r,i)=k。

其中:

  角度正负容忍误差为t,总容忍误差为2t。那么在contrario model中某个点为aligned pt的概率为 p=2*t / 2*Pi = t / PI。那么,在 I 中的 r 矩形里,总像素个数为 n。I 中的 r 矩形里aligned pt个数k(r,I)大于等于k的话,可选择的值为k(r,i)、k(r,i)+1、k(r,i)......n。概率为:   ∑ p^i * (1-p)^(n-i) ,i=k,k+1,k+2……n。

因此:

  NFA = (m*n)^2.5  *  ∑ p^i * (1-p)^(n-i) ,i=k,k+1,k+2……n

如果NFA的值很大,认为当前事件出现在contrario model的概率很大,将其认为是背景中的一部分。相反的,认为目标是相对突出(rare)的,是一个合适的“直线”。即:NFA <= ε     ε-meaningful rectangles :E(ho)[ ∑NFA(r) <= ε ] <= ε ,  r∈ R。R为图像中所有直线的集合。E为期望运算。ho为contrario model。根据论文,ε =1。

对齐点密度(Aligned Points Density)

 

如上图所示,因为t的存在且有正负号容忍范围,容易出现图中线段支持域增长不合理,此时应将矩形截断为两个更小的矩形更为合适。若如图分割的区域包含的直线形成的角为钝角,本次操作只留下包含种子的一段,舍弃另一段。舍弃的点重置为UNUSED。d = k / n。k为类内点个数,n为R的length*width。若d > D。accepted。否则,需要将矩形截断。在这里设置D=0.7。文章认为这个数字既能保证同一个矩形中的类内点属性相近,也能保证矩形不会被过分的分割为小的矩形。若没满足d > D 分割方法分为“缩小角度容忍阈值”与“缩小区域半径”的方法。缩小角度容忍阈值:简单的将t值缩小,再次从当前R的seed开始搜寻。如果这一步仍为满足d > D,将逐步舍弃离seed较远的点,直至满足不等式未知。类内点的计算将会解决曲线因为t的存在而误识别为直线的状况。

矩形改进(Rectangle Improvement)

如果当前的R仍旧不能满足NFA,以下的方法将对其进行改进。考虑到在有些情况下,删除line-support region中的一个点会减少R的 length-1个点(想象为对角线)。对不满足NFA的R,采取以下策略:

  1. 减小p=p/2。
  2. 短边减少一行。
  3. 长边减少一行。
  4. 长边减少另一行。
  5. 减小p=p/2 直至满足NFA或R过小被拒或p为原来的1/32。

参考文章

1.直线段检测算法(LSD:a Line Segment Detector)

2.论文:LSD-线段提取算法

转载于:https://www.cnblogs.com/yunkaiL/p/11611020.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直线检测方法—LSD论文翻译 的相关文章

随机推荐

  • [Linux]日志文件已删掉磁盘空间不释放,不重启服务进程的解决方法

    Linux 日志文件已删掉磁盘空间不释放 不重启服务进程的解决方法 问题背景 服务进程启动后 后台会有写日志的操作 当服务进程还没停掉 日志就会一直在写 这时候手动删除日志 会造成日志在linux该目录下已经删除 但是磁盘空间不会被释放掉
  • C语言函数操作大全----(超详细)

    fopen 打开文件 相关函数 open fclose 表头文件 include
  • MAC电脑常用效率工具推荐

    作者主页 IT技术分享社区 作者简介 大家好 我是IT技术分享社区的博主 从事C Java开发九年 对数据库 C Java 前端 运维 电脑技巧等经验丰富 个人荣誉 数据库领域优质创作者 华为云享专家 阿里云专家博主 个人博客 IT技术分享
  • supervisor系列:3、配置文件

    supervisor系列 3 配置文件 文章目录 supervisor系列 3 配置文件 1 文件格式 1 1 环境变量 2 unix http server 段设置 2 1 unix http server 段的值 2 2 unix ht
  • VS中Qt中ui文件和生成.h文件问题

    vs中的ui的ui xxxx h头文件是由Qt通过编译生成 vs项目属性中配置环境调用Qt安装目录下bin目录下的uic exe来自动生成代码 如果移动工程目录 而之前又把相关的ui xxx h头文件添加到工程或移动其位置 那么再次修改ui
  • sketchup 255个su常用插件)_「教程」巧用Rhino和SU,做出你想要的地形效果

    Xiao素材 地形建模教程 本期精选 教你如何做好地形效果图 1 SU部分 地形效果 SU插件安装小教程 su软件是我们现在经常会使用到的一个软件 但是在我们作图的过程中会发现 很多情况下 相对于一些复杂的图形我们需要依赖相关的插件 比如
  • python递归函数代码_Python递归函数 二分查找算法实现解析

    一 初始递归 递归函数 在一个函数里在调用这个函数本身 递归的最大深度 998 正如你们刚刚看到的 递归函数如果不受到外力的阻止会一直执行下去 但是我们之前已经说过关于函数调用的问题 每一次函数调用都会产生一个属于它自己的名称空间 如果一直
  • Kubernetes + Dashboard 集群搭建

    1 环境说明 基于kubeadm工具部署k8s 集群 还有基于二进制的部署方式但是需要单独部署k8s的每个组件比较繁琐 kubeadm是 Kubernetes官 提供的 于快速部署Kubernetes集群的 具 基于Kubernetes v
  • OC中的分类与类扩展

    在OC中 对于已有的类进行扩展 我们有两种方式 1 在原始类的定义中 进行代码扩展 2 通过继承的方式 扩展子类 3 使用分类的方式 第一 二种方式不用多说 第三种方式则是OC中比较有特色的功能 分类允许我们在不更改类的原始代码的情况下 实
  • 接口设计之幂等性设计

    幂等性设计 今天我们来聊聊接口的幂等性设计 所谓幂等 就是任意多次执行所产生的影响均与一次执行的影响相同 幂等性接口是指可以使用相同参数重复执行 并能获得相同结果的接口 这里就不展开数学中的定义了 有兴趣的可以自行google 为什么接口需
  • 关于mysql_free_result和mysql_close的解惑

    之前用mysql的时候一直是在用短链接 调用mysql store result获取一次数据之后就直接调用 以下是代码片段 mysql free result m result mysql close m Database 但是有两个问题
  • 找个好用的录屏软件,怎么这么难?

    真的要被录屏软件给搞疯了 本来公司说要给新人做个培训视频 想着把视频录屏一下 然后简单的剪辑一下就可以了 可谁知道录屏软件坑这么多 弄来弄去头都秃了 不过在头秃了几天之后 终于让我发现了一个值得 私藏 的录屏软件 咱就说这是什么神仙软件 把
  • 编码器测速,获取实际速度

    本例程中使用的电机为带霍尔编码器的减速电机 电机由三部分组成 减速器 电机以及霍尔编码器 霍尔编码器工作原理 霍尔编码器通过电磁转换 将机械的位移转化为脉冲信号 并且输出A B两相的方波信号 A B两相脉冲信号相位相差90 通过检测规定时间
  • Android Studio快捷键从Mac OS改为Win

    原理将Mac的Control映射为Command Command映射为Option Option映射为control 这样与win的快捷键按键习惯应该相同 未长时间测试
  • iOS App上传到苹果应用市场构建版本的图文教程

    使用hbuilderx的h5 或uniapp框架写的前端 进行云打包ios应用 会生成一个ipa后缀的应用文件 这个文件是没有办法像安卓应用那样直接安装在手机上面的 需要上架到苹果应用商店 用户才能下载安装使用 因此 我们这篇文章讲详细介绍
  • 5G基础信令

    一 4 5G高层协议规范框架对比 4G 5G 36 300 LTE整体 38 300 NR整体 36 401 E URTAN整体架构 38 401 NG RAN整体架构 36 321 LTE MAC 38 321 NR MAC 36 322
  • Dockerfile部署mysql并初始化

    文件目录结构 Dockerfile FROM centos 7 ADD jdk 8u261 linux x64 tar gz usr local ADD check mysql sh home datasong release bin CO
  • Gogs使用详解

    Gogs使用介绍 Gogs是一款类似Github 国内有码市 的开源文件 代码管理系统 基于Git 目前功能基本介绍 远程代码仓库管理 代码仓库权限分配 管理 团队管理 代码审查 1 注册 2 基本功能介绍 主面板说明 图中 表示自己个人账
  • 【测试入门】测试用例经典设计方法 —— 因果图法

    01 因果图设计测试用例的步骤 1 分析需求 阅读需求文档 如果User Case很复杂 尽量将它分解成若干个简单的部分 这样做的好处是 不必在一次处理过程中考虑所有的原因 没有固定的流程说明究竟分解到何种程度才算简单 需要测试人员根据自己
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允