提取线条的lines_color、lines_facet、 lines_gauss算子
Halcon中线条提取的算子主要有:
lines_color(Image : Lines : Sigma, Low, High, ExtractWidth, CompleteJunctions : )
lines_facet(Image : Lines : MaskSize, Low, High, LightDark : )
lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
其中lines_facet、 lines_gauss又可以归为同一类(从帮助文档的算子签名Signature可知这一点)。
一、线条提取和边缘提取的区别
上面三个线条提取的算子,输出的是一堆XLD;而 edges_sub_pix 这种边缘提取算子,得到的也是一堆XLD。那么它们有什么区别呢?
举个例子说明:

read_image (Image, 'angio-part')
count_channels (Image, Channels)
if (Channels == or Channels == )
rgb1_to_gray (Image, Image)
endif lines_gauss (Image, Lines, 2.3, 0.0, 0.7, 'dark', 'true', 'parabolic', 'true')
edges_sub_pix (Image, Edges, 'canny', 1, 5, 10)
dev_set_color ('green')
dev_display (Image)
dev_display (Lines)
lines_gauss和edges_sub_pix 输出的XLD的区别对比如下:

相信大家已经看出了两者的区别了。
图像的“边缘”指的是:图像中灰度有明显跳变的地方。如果在图中画一条“有一定宽度的线”,那么线的两侧应该都可以提取到边缘。
而线条提取的算子(例如lines_gauss)提取的是这条“有一定宽度的线”的“骨架线”,它一般只有一根。
为什么我想写一篇文章单独讲“线条提取”呢?主要因为跟我目前工作遇到的困难有关。
公司目前在用传统算法 + 深度学习做复杂缺陷检测。如果用Halcon做缺陷检测的话,用到的无非是形态学分析、频域处理、特征筛选等等,但是对于不太明显或者难以定位分割的缺陷,Halcon就束手无策了。但是深度学习在这方面有独特的优势,它可以通过标注大量的缺陷形态,不断训练学习,从而获得对复杂缺陷的识别定位能力。
但是对于“较浅且大批量出现的划痕”这种缺陷类型,深度学习也束手无策,因为它很难去逐个标注这些缺陷——一方面标注工作量太大,一方面很难准确地标注。
划痕,其实就是一种线条,用Halcon提供的线条提取算子,可以很轻松找出这些划痕(或线条)。
二、lines_color
算子描述为:检测有色的线条及其宽度。
lines_color(Image : Lines : Sigma, Low, High, ExtractWidth, CompleteJunctions : )
该算子从输入图像Image中提取彩色线条,并将提取的线条以亚像素XLD轮廓的形式返回Lines。
Sigma——要应用的高斯平滑量。
Low——磁滞阈值操作的下限阈值。
High——磁滞阈值操作的上限阈值。
ExtractWidth——应该提取线宽吗?(一般选择‘true’)
CompleteJunctions——是否应该在无法提取的地方添加连接点?
注意:
如果使用较大的平滑量(Sigma),应相应地为“High”和“Low”选择较小的值。
一般来说,特别是在需要提取线条宽度的时候,参数Sigma的选择应该满足Sigma >= w/1.732(w代表图像中线条的宽度(线条直径的一半)),最小允许值是Sigma >= w/2.5。例如,对于一个宽度为4个像素(直径为8个像素)的线条来说,Sigma >= 2.3是合适的参数。(4/1.732 = 2.3)
下面研究一下CompleteJunctions参数的意思。它可取的值有true或者false。该参数的意思为:是否应该在无法提取的地方添加连接点?
那它到底有什么作用呢?举例说明:

read_image (Image, 'cable1')
lines_color (Image, Lines1, 3.5, , , 'true', 'false')
lines_color (Image, Lines2, 3.5, , , 'true', 'true') dev_set_color ('green')
dev_clear_window ()
dev_display (Lines1)
dev_clear_window ()
dev_display (Lines2)

意思很明显了,当CompleteJunctions = 'true'时,会在无法提取的地方添加连接点,这样某些XLD可能会连起来。参考官方示例程序:lines_color.hdev。
三、lines_facet
算子描述为:使用小平面模型检测线条。
lines_facet(Image : Lines : MaskSize, Low, High, LightDark : )
下面的观点提炼自帮助文档:
① 参数LightDark确定是提取亮线还是暗线。
② MaskSize的值越大,图像的平滑度就越大,但可能会导致线条的局部化程度更差;MaskSize的值越小,提取的线条越短,碎片越多,但这可能会导致相当长的执行时间。
③ 关于取值,当Sigma=1.5时,此时大致对应于MaskSize 的值为5。
但是,这个算子我们一般不用。因为如何给MaskSize、Low、High取合适的值确实是一门技术活,不好掌握,更重要的lines_gauss算子完全可以替代它,并且更易掌握。OK,忘记lines_facet吧。
四、lines_gauss
算子描述为:检测线及其宽度。
lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
这里多了一个参数LineModel(其他参数前面都说过)。
LineModel:提取线条的模式,有'none', 'bar-shaped', 'parabolic', 'gaussian' 四种。含义如下:

对大多数应用来说,LineModel的'bar-shaped'参数是正确的选择,'parabolic'参数常用来提取边缘比较锐利的线条(比如背光照明的图像中的线条),'gaussian'则在线条边缘不那么锐利的时候使用。参数LineModel仅在参数ExtractWidth被设置为'true'时才有意义。
上图中,可以看出'parabolic'图示中,箭头指向的过渡处过渡陡峭(适合提取锐利的线条)。而'gaussian'图示中,箭头指向的过渡处过渡平滑(适合提取边缘平滑的线条)。
其实lines_gauss算子的参数是最多的,因此参数如何正确取值一点都不简单。但是很明显,官方偏爱lines_gauss这个算子,它们开发了calculate_lines_gauss_parameters算子。
calculate_lines_gauss_parameters( : : MaxLineWidth, Contrast : Sigma, Low, High)
算子描述为:根据要提取的线条的最大宽度和对比度计算lines_gauss的参数Sigma、Low和High。
MaxLineWidth定义要使用lines_gauss提取的线条的最大宽度。
Contrast参数应设置为要提取的典型线条的灰度值对比度。在任何情况下都将提取具有较高对比度的所有线条。
Contrast参数可以设为具有两个值的元组(例如[60, 10]),第二个值定义为要提取的线的最小对比度。
第二个值不能大于第一个值。如果只给出一个值,则最小对比度默认为对比度/3.0。
最小对比度的值越小,线条越长,线条延伸到对比度低的区域;值越高,线条越短,但线条越突出。
还是以前面的图为例:
read_image (Image, 'angio-part')
count_channels (Image, Channels)
if (Channels == or Channels == )
rgb1_to_gray (Image, Image)
endif calculate_lines_gauss_parameters (, [,], Sigma, Low, High)
lines_gauss (Image, Lines, Sigma, Low, High, 'dark', 'true', 'parabolic', 'true') dev_set_color ('green')
dev_display (Image)
dev_display (Lines)

由前文可知,对于线条提取,我们只需要掌握lines_color和lines_gauss这两个算子即可。
参考资料:
【Halcon】2D测量之三
lines_gauss用法解析
提取线条的lines_color、lines_facet、 lines_gauss算子的更多相关文章
- Halcon——图像增强算子以及分类
摘要 图像增强就是指通过某种图像处理方法对退化的某些图像特征,如边缘.轮廓.对比度等进行处理,以改善图像的视觉效果,提高图像的清晰度,或是突出图像中的某些"有用",压缩其他&quo ...
- 【halcon】学习记录
图像采集和二值化等处理 * Image Acquisition : Code generated by Image Acquisition open_framegrabber (, , , , , , ...
- halcon——缺陷检测常用方法总结(频域空间域结合)
摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...
- Halcon · 曲线宽度检测算法总结
视觉检测中,直线的宽度很好检测,即两条平行线的垂直距离,而曲线的宽度检测则需要另辟蹊径. 检测图像中曲线边缘的宽度,用以判断边缘是否崩缺,总结如下五种方法: 1.图像匹配判断 概述:建立标准图像参考, ...
- 图像处理-07-图像的轮廓提取-Robert算子
图像的轮廓提取-Robert算子 图像的边缘:周围像素灰度有阶跃变化或“屋顶”变化的那些像素的集合,边缘广泛存在于物体与背景之间.物体与物体之间,基元与基元之间,是图像分割的重要依据. 物体的边缘是由 ...
- 边缘检测算子和小波变换提取图像边缘【matlab】
Roberts边缘检测算子:根据一对互相垂直方向上的差分可用来计算梯度的原理,采用对角线方向相邻两像素之差. 小波变换的方法比较适用于展现夹带在正常信号中的瞬间反常现象,具有方向敏感性.所以可以边缘检 ...
- Sift算子特征点提取、描述及匹配全流程解析
Sift之前的江湖 在Sift横空出世之前,特征点检测与匹配江湖上占据霸主地位的是角点检测家族.先来探究一下角点家族不为人知的恩怨情仇. 角点家族的族长是Moravec在1977年提出的Moravec ...
- halcon算子
halcon的算子列表 Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样 ...
- halcon的算子列表
Chapter 1 :Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一个训练样本添加到一个高斯混合模型的训 ...
随机推荐
- 【Python】解析Python中的线程与进程
基础知识 线程 进程 两者的区别 线程的类型 Python 多线程 GIL 创建多线程 线程合并 线程同步与互斥锁 可重入锁(递归锁) 守护线程 定时器 Python 多进程 创建多进程 多进程通信 ...
- layui弹出层layer的area过大被遮挡
layer弹出窗口在弹出时指定了area,弹出后,如果当前页面(iframe)大小比弹出的窗口小,那么就会出现无法操作弹出窗口的尴尬情况.如图: 弹出窗口比当前页面大,这时,唯有放大整个页面才能看到 ...
- (原)关于音频onset detection算法的阅读
Orgin:Using Audio Onset Detection Algorithms 本文档只记录了部分的内容,主要以aubio相关内容为主,并非整个文档的完整内容,记录人:lihaiping16 ...
- java 迭代的陷阱
/** * 关于迭代器,有一种常见的误用,就是在迭代的中间调用容器的删除方法. * 但运行时会抛出异常:java.util.ConcurrentModificationException * * 发生 ...
- Bootstrap table插件 被选中的行颜色改变
参考:https://www.jianshu.com/p/1bb4c37ef636 在 bootstrap-table.min.css 中修改源码 //选中行颜色 .fixed-table-conta ...
- spark org.apache.spark.ml.linalg.DenseVector cannot be cast to org.apache.spark.ml.linalg.SparseVector
在使用 import org.apache.spark.ml.feature.VectorAssembler 转换特征后,想要放入 import org.apache.spark.mllib.clas ...
- 导出excel按照指定格式
1.项目有个需求,要按照特定格式 导出Excel表格. 正常的都是一行 ,下面是数据.这次有个变动,就是每隔 几列要换行,下面是数据.在下面是数据部分.花了一上午写了下需求,不难但是花时间 //实现特 ...
- sql简单存储过程分享
很多程序员朋友都视sql为洪湖水猛兽,其实深入分析一下,多用些时间与耐心,sql还是可以理解的. 本文主要是针对刚刚接触sql的新手朋友,进行一个sql存储过程的简单分享. 小子第一次发布文章,也是借 ...
- mysql新增用户无法授权!? 解决方案
先上解决方法 :) 创建用户cat 密码 CREATE USER '; 修改user表中的注册用户cat update user set host='%' where user='cat'; 授权: ...
- JS系列:数据类型详细讲解
ctrl+B加粗 ### 数据类型: - 1.number数字类型 NaN:not a number 不是一个数 ,但他是数字类型 isNaN:检测当前值是否不是有效数字,返回true代表不是有效数字 ...