-
2020-05-09 22:32:59
采用结构光进行扫描检测时,需要提取激光条纹的中心线,本文采用经典的Steger算法提取光条中心。
Steger算法原理
Steger算法基于Hessian矩阵,能够实现光条中心亚像素精度定位:首先通过Hessian矩阵能够得到光条的法线方向,然后在法线方向利用泰勒展开得到亚像素位置。
对于图像中激光条纹上的任意一点(x,y)(x,y),Hessian矩阵可以表示为:
H(x,y)=[rxxrxyrxyryy]
H(x,y)=[rxxrxyrxyryy]其中rxxrxx表示图像沿x的二阶偏导数,其他参数类似。需要注意的是在求Hessian矩阵之前需要对图像进行高斯滤波,高斯滤波时,根据文献[1]中,设置高斯方差σ<w3√σ<w3,其中ww为光条宽度。Hessian矩阵最大特征值对应的特征向量对应于光条的法线方向,用(nx,ny)(nx,ny) 表示,以点(x0,y0)(x0,y0) 为基准点,则光条中心的亚像素坐标为:
(px,py)=(x0+tnx,y0+tny)(px,py)=(x0+tnx,y0+tny)
公式中
t=−nxrx+nyryn2xrxx+2nxnyrxy+n2yryyt=−nxrx+nyrynx2rxx+2nxnyrxy+ny2ryy
如果(tnx,tny)∈[−0.5,0.5]×[−0.5,0.5](tnx,tny)∈[−0.5,0.5]×[−0.5,0.5] ,即一阶导数为零的点位于当前像素内,且(nx,ny)(nx,ny) 方向的二阶导数大于指定的阈值,则该点(x0,y0)(x0,y0) 为光条的中心点,(px,py)(px,py) 则为亚像素坐标。
示例代码
根据Steger算法的原理,借助opencv的Mat数据结构,实现Steger算法如下:
void StegerLine() { Mat img0 = imread("image_0.png", 1); Mat img; cvtColor(img0, img0, CV_BGR2GRAY); img = img0.clone(); //高斯滤波 img.convertTo(img, CV_32FC1); GaussianBlur(img, img, Size(0, 0), 6, 6); //一阶偏导数 Mat m1, m2; m1 = (Mat_<float>(1, 2) << 1, -1); //x偏导 m2 = (Mat_<float>(2, 1) << 1, -1); //y偏导 Mat dx, dy; filter2D(img, dx, CV_32FC1, m1); filter2D(img, dy, CV_32FC1, m2); //二阶偏导数 Mat m3, m4, m5; m3 = (Mat_<float>(1, 3) << 1, -2, 1); //二阶x偏导 m4 = (Mat_<float>(3, 1) << 1, -2, 1); //二阶y偏导 m5 = (Mat_<float>(2, 2) << 1, -1, -1, 1); //二阶xy偏导 Mat dxx, dyy, dxy; filter2D(img, dxx, CV_32FC1, m3); filter2D(img, dyy, CV_32FC1, m4); filter2D(img, dxy, CV_32FC1, m5); //hessian矩阵 double maxD = -1; int imgcol = img.cols; int imgrow = img.rows; vector<double> Pt; for (int i=0;i<imgcol;i++) { for (int j=0;j<imgrow;j++) { if (img0.at<uchar>(j,i)>200) { Mat hessian(2, 2, CV_32FC1); hessian.at<float>(0, 0) = dxx.at<float>(j, i); hessian.at<float>(0, 1) = dxy.at<float>(j, i); hessian.at<float>(1, 0) = dxy.at<float>(j, i); hessian.at<float>(1, 1) = dyy.at<float>(j, i); Mat eValue; Mat eVectors; eigen(hessian, eValue, eVectors); double nx, ny; double fmaxD = 0; if (fabs(eValue.at<float>(0,0))>= fabs(eValue.at<float>(1,0))) //求特征值最大时对应的特征向量 { nx = eVectors.at<float>(0, 0); ny = eVectors.at<float>(0, 1); fmaxD = eValue.at<float>(0, 0); } else { nx = eVectors.at<float>(1, 0); ny = eVectors.at<float>(1, 1); fmaxD = eValue.at<float>(1, 0); } double t = -(nx*dx.at<float>(j, i) + ny*dy.at<float>(j, i)) / (nx*nx*dxx.at<float>(j,i)+2*nx*ny*dxy.at<float>(j,i)+ny*ny*dyy.at<float>(j,i)); if (fabs(t*nx)<=0.5 && fabs(t*ny)<=0.5) { Pt.push_back(i); Pt.push_back(j); } } } } for (int k = 0;k<Pt.size()/2;k++) { Point rpt; rpt.x = Pt[2 * k + 0]; rpt.y = Pt[2 * k + 1]; circle(img0, rpt, 1, Scalar(0, 0, 255)); } imshow("result", img0); waitKey(0); }
示例结果
参考博客:
其中测绘可能会用到的工具ArcToolBox进行道路中心线提取:ArcMap:矢量线数据提取(道路)中心线
更多相关内容 -
ArcGIS 10.6提取道路中心线的两种方法经典教程
2020-06-30 18:45:39我们工作中碰到的道路数据通常为面状,需要提取道路中心线,本文讲解ArcGIS10.6中从面状道路数据中提取道路中心线的两种常用经典方法。 方法一:使用ArcGIS 10.6提供的提取道路中心线工具 本实验中使用到面状数据...我们工作中碰到的道路数据通常为面状,需要提取道路中心线,本文讲解ArcGIS10.6中从面状道路数据中提取道路中心线的两种常用经典方法。
方法一:使用ArcGIS 10.6提供的提取道路中心线工具
本实验中使用到面状数据如下所示:
首先,将面状数据转为线状数据。
转完之后,道路尽头还是封闭的,这样是不能进行提取的,因此需要打开编辑器,将尽头打断并删掉。但是打断尽头往往是巨大的人工操作,非常繁琐。
-
ArcGIS方法-利用到路面提取道路中心线的方法
2020-12-31 01:01:14在利用GIS制图时,需要经常跟数据打交道。很多初级的制图人员都存在一种惯性思路,以为数据精度越高,出图的...由于其精度高,有些数据甚至是不带线道路图层的,而在1w的地图下,道路以线状表达才是符合要求的。所以...在利用GIS制图时,需要经常跟数据打交道。很多初级的制图人员都存在一种惯性思路,以为数据精度越高,出图的效果就越好。这是错误的观点。假如现在需要制作1:1w的地图,但手头上却只有1:500的地形图,数据精度虽然很高,但却无法在小比例尺下显示出来。
回到主题上,1:500的数据,大多数道路都是以面状显示。由于其精度高,有些数据甚至是不带线道路图层的,而在1w的地图下,道路以线状表达才是符合要求的。所以,这就需要涉及到地图制图的一个常规工作—地图缩编。
本文主要介绍如何从到路面直接提取出道路中心线,从而辅助小比例尺地图的制作。
由于面状数据一般都是不规则的,所以很难从其提取中心线,一般的GIS软件也没提供直接提取的工具。ArcGIS里面虽然也有一些工具可以辅助一下处理,例如在制图工具箱里面有一个提取中心线的工具,但这个工具的作用是通过道路边线(双线)提取中心线。也有人说ArcGIS里面同样是提供面转线工具,先用工具转一道再提取不就行了吗?可是问题来了,面转线工具传出来的数据是封闭线,而不是道路边线,提取中心线工具依然是不可用,除非在每个路面图形打断两端的封闭,不然无法进行提取,恰好打断工作又是非常的巨大。因此,该方法还是不可用。
为了解决这个问题,那就是ArcScan扩展模块。提到ArcScan扩展,很多专业人员第一时间反应是这只是个栅格矢量化工具,跟当前讨论的中心线提取似乎没有任何关系。只要深入了解ArcScan扩展的具体细节,我们不难发现其自动矢量化里面可以提取面要素和中心线,利用这一特性,我们就可以曲线去完成该任务了。
先来说说总体思路:
将路面(矢量面数据)转化为栅格数据,因为ArcScan只能对栅格数据进行处理,由于是从矢量转为栅格而非扫描,栅格质量一般会非常好;通过二值化栅格数据后,调整捕捉参数和提取参数,直接提取矢量中心线。步骤看似简单,但在实际操作中有很多细节需要注意,以下是详细步骤:单独加载路面数据,要先设置好纯色符号(建议为纯黑色),去掉轮廓线。这样是为了提升栅格数据质量,黑白分明,便于计算机识别像元。
设置好约束比例,例如2000。约束比例是为了在输出栅格图时控制质量。
点击全屏视图,导出地图,采用tiff方式记录坐标,格式设置为1位单色阈值(非常重要)。如果不选这项,默认出来是RGB三个通道的栅格数据,加载任何一个通道都没法实现栅格数据二值化,意味着无法使用ArcScan功能,所以此处必须要设置。
根据实际需要设置好dpi,这个是直接影响图形识别的因素。Dpi是根据具体的地图图幅进行设置,因此,可能需要尝试多次,找一个比较合适的值,这样图像才能清晰保存下来。
将导出的栅格地图加载到arcmap中,新建一个线要素图层,坐标系与栅格一致,一并加载。加载arcscan工具条,如下图
对栅格数据进行充分类,设置为两类,0和1 ,这就是二值化处理。如果不做分类,ArcScan同样不能识别栅格数据。
设置了分类后,arcscan工具条会显示栅格数据
打开编辑器,开始编辑,选中中心线图层。在arcscan工具条中可以显示预览
如果需要更详细的设置,在矢量化—选项中设置对应的输出图层由于提取的是中心线,矢量化方式就必须选中心线
预览效果如下
蓝色部分为没有捕捉到,可以设置一下工具条
将栅格捕捉适当调整一下,如下图
设置后的预览就不存在蓝色不能捕捉部分,如下图
达到效果后可以点击生成按钮生成最终的效果。
停止编辑并保存数据即可完成所有的提取工作。
直至该步就完成所有的操作,可见,处理一个实际的难题,不能光靠软件提供的工具,要巧妙地运用,做适当的处理,这样才能在意想不到的情况下解决难题。 BY 李远祥
-
利用到路面提取道路中心线的方法
2016-10-11 08:23:23利用到路面提取道路中心线的方法 在利用GIS制图时,需要经常跟数据打交道。很多初级的制图人员都存在一种惯性思路,以为数据精度越高,出图的效果就越好。这是错误的观点。假如现在需要制作1:1w的地图,但手头上...利用到路面提取道路中心线的方法在利用GIS制图时,需要经常跟数据打交道。很多初级的制图人员都存在一种惯性思路,以为数据精度越高,出图的效果就越好。这是错误的观点。假如现在需要制作1:1w的地图,但手头上却只有1:500的地形图,数据精度虽然很高,但却无法在小比例尺下显示出来。
回到主题上,1:500的数据,大多数道路都是以面状显示。由于其精度高,有些数据甚至是不带线道路图层的,而在1w的地图下,道路以线状表达才是符合要求的。所以,这就需要涉及到地图制图的一个常规工作—地图缩编。
本文主要介绍如何从到路面直接提取出道路中心线,从而辅助小比例尺地图的制作。
由于面状数据一般都是不规则的,所以很难从其提取中心线,一般的GIS软件也没提供直接提取的工具。ArcGIS里面虽然也有一些工具可以辅助一下处理,例如在制图工具箱里面有一个提取中心线的工具,但这个工具的作用是通过道路边线(双线)提取中心线。也有人说,ArcGIS里面同样是提供面转线工具,先用工具转一道再提取不就行了吗?可是问题来了,面转线工具传出来的数据是封闭线,而不是道路边线,提取中心线工具依然是不可用,除非在每个路面图形打断两端的封闭,不然无法进行提取,恰好打断工作又是非常的巨大。因此,该方法还是不可用。
为了解决这个问题,作者想到以另一种方式去完成这个工作,那就是ArcScan扩展模块。提到ArcScan扩展,很多专业人员第一时间反应是这只是个栅格矢量化工具,跟当前讨论的中心线提取似乎没有任何关系。只要深入了解ArcScan扩展的具体细节,我们不难发现其自动矢量化里面可以提取面要素和中心线,利用这一特性,我们就可以曲线去完成该任务了。
先来说说总体思路:将路面(矢量面数据)转化为栅格数据,因为ArcScan只能对栅格数据进行处理,由于是从矢量转为栅格而非扫描,栅格质量一般会非常好;通过二值化栅格数据后,调整捕捉参数和提取参数,直接提取矢量中心线。步骤看似简单,但在实际操作中有很多细节需要注意,以下是详细步骤:
-
单独加载路面数据,要先设置好纯色符号(建议为纯黑色),去掉轮廓线。这样是为了提升栅格数据质量,黑白分明,便于计算机识别像元。
-
设置好约束比例,例如2000。约束比例是为了在输出栅格图时控制质量。
-
点击全屏视图,导出地图,采用tiff方式记录坐标,格式设置为1位单色阈值(非常重要)。如果不选这项,默认出来是RGB三个通道的栅格数据,加载任何一个通道都没法实现栅格数据二值化,意味着无法使用ArcScan功能,所以此处必须要设置。
根据实际需要设置好dpi,这个是直接影响图形识别的因素。Dpi是根据具体的地图图幅进行设置,因此,可能需要尝试多次,找一个比较合适的值,这样图像才能清晰保存下来。
-
将导出的栅格地图加载到arcmap中,新建一个线要素图层,坐标系与栅格一致,一并加载。加载arcscan工具条,如下图
对栅格数据进行充分类,设置为两类,0和1 ,这就是二值化处理。如果不做分类,ArcScan同样不能识别栅格数据。
设置了分类后,arcscan工具条会显示栅格数据
-
打开编辑器,开始编辑,选中中心线图层。在arcscan工具条中可以显示预览
如果需要更详细的设置,在矢量化—选项中设置对应的输出图层
由于提取的是中心线,矢量化方式就必须选中心线
预览效果如下
-
蓝色部分为没有捕捉到,可以设置一下工具条
将栅格捕捉适当调整一下,如下图
设置后的预览就不存在蓝色不能捕捉部分,如下图
-
达到效果后可以点击生成按钮生成最终的效果。
停止编辑并保存数据即可完成所有的提取工作。
直至该步就完成所有的操作,可见,处理一个实际的难题,不能光靠软件提供的工具,要巧妙地运用,做适当的处理,这样才能在意想不到的情况下解决难题。
版权声明:本文为博主原创文章,未经博主允许不得转载。
-
-
中心线提取的方法
2018-04-17 15:14:27中心线提取是图像分割的重要步骤之一,中心线提取的好坏直接影响图像分割...二 基于距离变换的方法通过定位距离物体边界最远的一组点来确定物体的中心线,通常采用欧式距离,可以理解为一系列最大内切球的球心构成了... -
基于Arcgis 利用道路面要素提取道路中心线的方法
2018-03-22 10:49:21路网复杂的时候,arcgis制图综合工具箱里提取中心线的方法效果很难让人满意,以下方法亲测有效,效果很好,结果直接输出到模板,很实用,感谢大神。 但是Arcscan在进行栅格单元捕捉时最大能识别100个像素,所以如果... -
ArcGIS提取道路中心线数据制图
2021-02-16 23:21:46文章目录ArcGIS提取道路中心线数据数据采集栅格二值化提取中心线提取中心线结果补全道路中心线符号修饰专题制图 数据采集 最近在学习地理国情检测数据的采集,依次矢量化建筑物区域、大坝、农田、水系之后,为了方便... -
Arcgis根据矢量道路数据来提取道路中心线
2021-07-19 17:37:31Arcgis提取道路中心线的方法 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的... -
Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)
2021-09-02 10:56:02Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)算法背景介绍Hessian 矩阵与泰勒多项式关于求t导数与中心点、亚像素点高斯函数作用文献 算法背景介绍 在线结构光视觉传感器中,由线激光器发射出的线... -
代码:Steger算法提取线激光条纹中心线(CPP+OpenCV)
2022-04-21 19:50:44最近一直在做线结构光扫描三维成像方面的内容,采用结构光进行扫描检测时,需要提取激光条纹的中心线,我利用Steger算法提取激光中心线的亚像素坐标。 下面先介绍一下steger算法的运行思路:(借鉴的别人的总结,直接... -
【FME】平行线中心线生成思路
2018-08-08 09:39:42本操作方案生成的中心线在拐角处使用的是圆形,没有采用直角方案。 设计思路 计算一组平行线之间的距离,得到距离distance 分别给两条线都制作一个buffer面使用的距离为 第一步得到的距离distance (为了... -
ARCGIS利用到路面提取道路中心线的方法
2019-11-18 17:35:23ARCGIS利用到路面提取道路中心线的方法 利用到路面提取道路中心线的方法 在利用GIS制图时,需要经常跟数据打交道。很多初级的制图人员都存在一种惯性思路,以为数据精度越高,出图的效果就越好。这是错误的观点。... -
工程建设制图中的主要可见轮廓线应选用
2020-12-30 18:30:291、工程建设制图中的主要可见轮廓线应选用.()AA、粗实线B、中实线C、粗虚线D、中虚线2、建筑平面图中的中心线、对称一般应用。()CA、细实线B、细虚线C、细单点长画线D、吸双点画线3、建筑施工图中定位轴线端部的圆用... -
数据中心机房综合布线技巧大放送!
2018-09-03 16:51:50五、随着网络设备飞速发展,在选择方案时应尽量开阔一些,水平采用五类或五类以上,保证数据和语音可以互换,垂直采用光纤加大对数线缆,对于一些点较多的建筑,应采用光纤做数据备份而不是用线缆 六、由于光产品... -
方形矩形中心渐开线算法结合鼠标特征码刷怪
2021-12-05 15:26:34在圆形渐开线椭圆形渐开线的拓展,加入了矩形、正方形、中心渐开线的算法,具体见 矩形渐开线结合鼠标特征扫怪 CSDN易语言大漠脚本辅助从入门到提高100课渐开线适合于大漠后台或前台,有的同学会问,我们既然能... -
基于灰度质心法和骨架的激光中心线提取
2019-04-03 11:43:51一般对于激光条纹线,主流的方法是利用steger或者它的改进方法去提取中心线,但是博主之前实现了一下,感觉图像里的hessian矩阵并不能很好的描述条纹的法向,所以就另换方法,这次采用先骨架提取再利用法线上的... -
代码:利用Steger算法提取激光中心线的亚像素坐标(Matlab)
2020-03-03 18:19:42最近一直在做线结构光扫描三维成像方面的内容,采用结构光进行扫描检测时,需要提取激光条纹的中心线,我利用Steger算法提取激光中心线的亚像素坐标,在Matlab 2018b 软件上运行。 下面先介绍一下steger算法的运行... -
光条中心线提取-Steger算法(基于Hessian矩阵)
2018-01-07 19:37:46采用结构光进行扫描检测时,需要提取激光条纹的中心线,本文采用经典的Steger算法提取光条中心。 Steger算法原理 Steger算法基于Hessian矩阵,能够实现光条中心亚像素精度定位:首先通过Hessian矩阵能够得到光条的... -
集线器、交换机与路由器有什么区别?
2018-11-08 10:29:09交换机是集线器的升级换代产品,外形上和集线器没什么分别,是一种在通信系统中自动完成信息交换功能的设备,用途和HUB一样也是连接组网之用,但是它具有比集线器更强大的功能。 交换机也叫交换式集线器,它... -
matlab画电场线
2021-04-29 04:51:14⒊建议硬盘至少 20GB4.安装 MATLAB 仿真软件。 四、实验内容 根据库仑定律,利用 Matlab 强大的...大物论文用MATLAB 绘制两圆板间中心线电场强度和电势图 在学习大学物理的过程中, 我们学到......(卷),期】2006(027... -
基于Qt的多线程流水线异步服务器稳定版
2014-06-07 12:39:44采用流水线线程池避免了这个问题。每个客户端把需要做的操作进行粒度化,在一个环形的队列中,线程池对单个客户端,每次仅处理一个粒度单位的任务。单个粒度单位完成后,该客户端的剩余任务便被重新插入到队列尾部。... -
pcb单层板如何布线_pcb单层板自动布线设置
2021-01-17 13:48:40PCB布线是什么在PCB设计中,布线是完成产品设计的重要步骤,可以说前面的准备工作都是为它而做的,在整个PCB设计中,以布线的设计过程限定最高,技巧最细、工作量最大。PCB布线有单面布线、双面布线及多层布线。PCB... -
Qt 实现画线笔锋效果详细原理
2020-02-14 17:37:43上面的圈圈就是补充的点,点与点之间距离越小,看起来就越平滑,而圈圈的圆心点是跟随最新的path线条走的,就是path线的线条高度的中心点,圈圈的半径大小逐渐变小。 再看看补充点后的效果: 可以看到,笔尖... -
数据链路层---使用集线器的星型拓扑_传统以太网传输介质的改变_总线型--->双绞线为介质的以太网采用星型...
2021-12-04 12:28:29双绞线为介质的以太网采用星型拓扑 星型拓扑的中心----集线器(Hub,多口的中继器) 双绞线和集线器配合使用,每个站需要用两对无屏蔽双绞线(放在一根电缆内),分别用于接收和发送。 1990年IEEE制定出星型以太网... -
轻量级车道线检测
2022-04-18 15:02:05总结:对于车道线场景,采用自下而上的方式较多,因为车道线的场景复杂,不利于检测; 二、聚类算法 通过自下而上的方式分类点后,需要聚类,将各个像素点归到不同的目标上; 这里又称为度量学习距离度量学习相似度... -
单线、双线、三线以及BGP线路有什么区别?
2020-07-17 19:30:20随着互联网规模的不断扩大,服务器租赁托管也越来越流行,服务器租赁托管线路有:单线、双线、三线和BGP线路,那么它们有什么区别和联系呢? 一、定义 首先,我们理解它们的含义,再比较它们的优缺点 单线 一般指... -
车道线检测学习总结
2018-08-24 21:01:34第一步,采用棋盘对相机进行校正: 第二步,对图像进行截取,由于获取到的图像中一半为天空及背景:基于这个先验知识,预先对图像进行截取,可以为后面更准确定位车道线奠定基础。 第三步,基于图像的... -
车道线拟合笔记
2019-11-07 16:34:06按作用又可分为:车行道中心线、车道分界线、停止线、减速让行线、人行横道线、导流线、导向箭头和左转弯导线等。 2、目前视觉_车道线检测方法: 一般的车道有三车道或者四车道,固定的前方摄像头的视角范围内,由于... -
集线器(hub),交换机以及路由器异同;冲突域和广播域详解
2018-02-28 17:01:13集线器(hub) 交换机(switch) 路由器(route) 三者的异同 1)工作层次不同 2)数据转发依据对象不同 3)分割冲突域,广播域 4)防火墙功能 参考文献 冲突域和广播域 在介绍这三个设备的异同之前,我们...