Halcon阈值处理的几种分割方法

Halcon阈值处理的几种分割方法

文章目录

  • Halcon阈值处理的几种分割方法
    • 1. 全局阈值
    • 2. 基于直方图的自动阈值分割方法
    • 3. 自动全局阈值分割方法
    • 4. 局部阈值分割方法
    • 5. var_threshold算子
    • 6 . char_threshold 算子
    • 7. dual_threshold算子

在场景中选择物体或特征是图像测量或识别的重要基础,而阈值处理是最简单也最常用的区域
选择方法,特别适用于目标和背景的灰度有明显区别的情况。下面就介绍几种常用的阈值处理方法。

1. 全局阈值

首先来看什么是阈值。简单来说,闽值就是一个指定的像素灰度值的范围。假设阈值为0~255灰度值,阈值处理就是将图像中的像素灰度值与该阈值进行比较,落在该范围内的像素称为前景,其余的像素称为背景。一般会用黑白两色来表示前景与背景。这样图像就变成了只有黑与白两种颜色的二值图像。
当检测对象的图像灰度与背景差异比较大时,用阈值处理可以很方便地将其与背景分离开来。根据像素与相邻像素之间的灰度值差异设置一个阈值,可以将像素与其相邻像素分隔开来。如果是在图像边缘,可以利用边缘的灰度差值进行简单的阈值处理,有助于沿边界分割图像。在Halcon中,可使用threshold算子进行全局阈值处理。举例如下:

read_image (Image,'data/codes')
rgbl_to_gray (Image, GrayImage)
threshold (GrayImage, DarkArea, 0,128)

该程序的阈值处理结果如图所示,其中图(a)为输入图像,图(b)中的红色区域为阅值处理后提取出的较暗区域。
在这里插入图片描述
在上面的例子中,threshold 算子的第1个参数Graylmage 为输入图像,这里用的是灰度图;第2个参数DarkArea 为输出的区域,类型为Region;第3个和第4个参数为阀值的区间值,表示0~128 灰度范围内的像素区域。

2. 基于直方图的自动阈值分割方法

有时手动设定阈值并不是一个严谨的方法,因为人对图像灰度的感受并不精准,即使对同一场景,当光线有微妙变化时,灰度也会有差异。手动设定阈值在粗估计时可能是一个便捷的方法,但是随着后续计算步骤的叠加,将带来不可估量的误差。在连续采集的图像中,图像的灰度也是动态变化的,环境光照、拍摄角度等因素都会影响图像的灰度。如果阈值是一个固定的值,那么在处理连续图像时结果会不够准确。因此,可以使用自适应阙值进行调节。
自适应阈值是一种基于直方图的阈值。直方图是图像像素落在0~253这个区间内的数量统计图。通过直方图可以看出图像灰度的大致分布,在有些情况下甚至可以估+检测对象的面积与结构。
在Halcon 中使用auto_threshold算子进行自适应阈值处理。该算子可以对单通道图像进行多重闽值处理,其原理是,以灰度直方图中出现的谷底为分割点,对灰度直方图的波峰进行分割。因此,有多少个波峰,就会分割出多少个区域。auto_threshold 算子的第3个参数Sigma(此例中为8.0)是一个平滑算子,可以对直方图进行平滑处理。举例如下:

read_image (Image,'data/shapes')
rgbl_to_gray (Image, GrayImage)
auto_threshold(GrayImage,Regions,8.0)

该程序的阈值处理结果如图所示,其中图(a)为灰度图像,包括几种不同灰度的对象.图(b)用3种不同的颜色区分了自动阈值分割出的3个区域。其中圆形与矩形物体因为灰度值相近被分割为同一区域;三角形的灰度值与另外两种有差异,被分割为单独的区域;背景灰度值最大,也被分割为一个单独的区域。
在这里插入图片描述
auto_threshold算子的前两个参数分别为输入的Image图像和输出的Region类型的区域。第3个参数 Sigma 为对灰度直方图进行高斯平滑的核的大小。高斯卷积运算,其计算原理是,先确定图像的绝对灰度直方图,然后使用高斯滤波器对该直方图进行平滑处理。在本例中,设Sigma 值为8.0,对灰度直方图的平滑效果如图所示。
在这里插入图片描述
图 (a)为原始灰度直方图,可以看出波峰比较多,如不处理将产生大量的分割区域,不利于提取出有意义的部分,因此这里将Sigma 值设得大一些,使波峰变得平滑。图(b)为Sigma为8.0时对灰度直方图进行高斯平滑后的效果,可见波峰明显减少到了3个,因此图像中自动分割的区域也减少到了3部分。
因此,Sigma的值越大,平滑效果越显著,直方图波峰越少,分割出的区域也越少;反之,Sigma的值越小,直方图平滑的效果越不明显,分割的次数也越多。同时可以使用gray_histo 算子和gen_region_histo 算子查看Sigma参数对灰度直方图的影响。

3. 自动全局阈值分割方法

除了auto_threshold算子外,还常用binary_threshold算子对直方图波峰图像进行自动阈值分割。binary_threshold 算子同样利用了直方图,但不同的是,该算子是根据直方图中的像素分布提供可选的分割方法,如使用最大类间方差法或平滑直方图法,都可以自动计算出一个灰度级别用于分割区域。
同时,该算子也可以选择提取较亮还是较暗的范围,尤其适用于在比较亮的背景图像上提取比较暗的字符。举例如下:

read_image (Image, 'data/codes')
rgbl_to_gray (Image, GrayImage)
binary threshold (GrayImage, RegionMaxSeparabilityLight, 'max _separability', 'dark', UsedThreshold)

该程序运行效果如图所示,其中图(a)为灰度图像,图(b)为使用binary _threshold算子进行阈值分割后的图像。
在这里插入图片描述
binary_threshold算子的前两个参数分别为输入和输出的对象。第3个参数为分割的方法,这个例子中选择max_separability,表示在直方图中对最大的可分性进行分割;也可以选择smooth histo,表示平滑直方图,平滑的原理与auto_threshold算子类似。第4个参数表示提取前景还是背景,这里选择dark,表示提取较暗的部分;也可以选择light,表示提取较亮的部分。最后一个参数UsedThreshold 为返回结果,将返回所用的阈值。

4. 局部阈值分割方法

上文介绍了几种全局阈值分割方法,本小节介绍一个基于局部阈值分割的dyn_threshold算子。它适用于一些无法用单一灰度进行分割的情况,如背景灰度比较复杂,有的部分比前景目标亮,有的部分比前景目标暗;又如前景目标包含多种灰度,因而无法用全局阈值完成分割。该算子利用邻域,通过局部灰度对比,找到一个合适的阈值进行分割。
dyn_threshold 算子的应用步骤一般分三步:首先,读取原始图像;然后,使用平滑滤波器对原始图像进行适当平滑;最后,使用dyn threshold算子比较原始图像与均值处理后的图像局部像素差异,将差异大于设定值的点提取出来。
举一个例子,如图(a)所示,该图中前景部分的字符颜色不均匀,无法用单一的灰度阈值进行提取,因此可以使用局部阈值分割方法进行提取。代码举例如下:

read_image (Image, Idata/text')
*将图像转换为灰度图
rgb1_to_gray (Image, GrayImage)
*由于图像对比度比较低,因此对图像进行相乘,增强对比度
mult_image (GrayImage, GrayImage, ImageResult, 0.005, 0)
*使用平滑滤波器对原始图像进行适当平滑
mean _image (ImageResult, ImageMean, 50,50)
*动态阈值分割,提取字符区域
dyn_threshold (ImageResult, ImageMean, RegionDynThresh, 4, 'not_equal')
*开运算,去除无意义的小的杂点
opening_circle (RegionDynThresh, Region0pening, 1.5)
*显示结果
dev_clear_window()
dev_display (RegionOpening)

该段代码运行效果如图所示,其中图(a)为灰度图像,图像中的字符部分颜色不均;图(b)为用dyn_threshold算子进行阈值分割后的图像。
在这里插入图片描述
再举一个使用动态阈值进行轮廓提取的例子。如图(a)所示,该图的前景与背景部分灰度都不均匀,因而无法用全局阈值进行提取,这时可以用dyn_threshold算子提取前景的轮廓。代码如下:

read_image (Image, 'data/garlic')
*将图像转换为灰度图
rgbl_to_gray (Image, GrayImage)
*使用平滑滤波器对原始图像进行适当平滑
mean_image (GrayImage, ImageMean, 30,30)
*动态阈值分割,提取字符区域
dyn_threshold (GrayImage, ImageMean, RegionDynThresh, 30, 'not_equal')
*腐蚀操作,去除杂点
erosion_circle (RegionDynThresh, RegionClosing, 1.5)

该段代码运行效果如图所示,其中图(a)为灰度图像,前景目标灰度复杂,背景因为光
照不均匀,局部甚至比前景目标更亮;图(b)为使用dyn_threshold算子进行阈值分割后的图像。
在这里插入图片描述
dyn_threshold算子的第1个参数为输入的灰度图像。第2个参数为输入的预处理图像,这里食用Mean_Image得到了一张均值图像,用于做局部灰度对比。第3个参数为输出的阈值区域。第。个参数是offset值,是将原图与均值图像作对比后设定的值,灰度差异大于该值的将被提取出来第5个参数决定了提取的是哪部分区域,一般有如下4个选择。
(1)light:表示原图中大于等于预处理图像像素点值加上offset值的像素被选中。
(2)dark:表示原图中小于等于预处理图像像素点值减去offset 值的像素被选中。
(3)equal:表示原图中像素点大于预处理图像像素点值减去offset值,小于预处理图像像素点值加上offset 值的点被选中。
(4)not_equal:表示与equal相反,它的提取范围在equal范围以外。
该算子适用于在复杂背景下提取前景目标的轮廓,或无法用单一灰度阈值提取边缘等情况。注意
实际应用中可以根据图像的灰度值,设置均值滤波器的系数和动态阙值的参数。

5. var_threshold算子

除了dyn threshold算子可以利用局部像素灰度差进行分割外,var_threshold算子也是一种基于局部动态阈值的分割方法。该方法分割的依据是局部的均值和标准差,选择图像中邻域像素满足阈值条件的区域进行分割。该阈值不是一个固定的值,而是在点(x,))的邻域中使用矩形mask进行扫描,分别用点(x,y)的灰度与均值图像中的点(x,y)的灰度,和矩形的中心点的标准差灰度进行比较。该矩形 mask的长宽需要是奇数,这样便于找到矩形的中心点,其具体的宽和高应该略大于待分割的图像区域。举例如下:

read _image (Image,'data/holes')rgbl _to_gray (Image, GrayImage)*设置矩形,选择感兴趣区域
gen_rectanglel (Rectangle, 170, 80, 370, 510)
reduce_domain (GrayImage, Rectangle, ImageReduced)
var _threshold (ImageReduced, Region, 15, 15, 0.2, 35, 'dark')

该程序的运行效果如图所示,其中图(a)为输入图像,图(b)为使用 var_threshold算子进行阈值分割后的图像,灰度变化符合阈值的区域被提取了出来。
在这里插入图片描述
该算子的第1个参数为输入的灰度图像;第2个参数为输出的阈值区域;第3个和第4个参数为用于扫描邻域的矩形 mask的宽和高;第5个参数为标准差因子,用于计算灰度标准差,默认为0.2;第6个参数为设定的绝对阈值,该值用于比较矩形区域内的灰度标准差与均值图像的最小灰度值;第7个参数决定了提取的是哪部分区域,一般有4个选择,即dark、light、equal、not_equal,具体解释与dyn_threshold算子相同。

6 . char_threshold 算子

核算子一般用来提取字符,适用于在明亮的背景上提取黑暗的字符。该算子的运算过程如下:首先计算一个灰度曲线;然后给定一个Sigma值,用于平滑这个曲线;最后将前景与背景区分开来。分割的阈值取决于直方图中的最大值。例如,如果选择百分比为95%,灰度阈值将锁定在距离直方图峰值的5%左右的区域,因为这个算子假定的是字符的灰度都暗于背景。举例如下:

read_ image (Char, 'data/char')
rgbl_to_gray (Char, GrayImage)
char_threshold (GrayImage, GrayImage, Characters, 6, 95, Threshold)

该程序的运行效果如图所示,其中图(a)为灰度图像,图(b)为使用char_threshold算子进行阈值分割后的图。
在这里插入图片描述
与binary_threshold 算子相比,char_threshold算子适用于直方图的波峰之间没有明确的谷底的情况,或者是直方图没有明确的峰值的情况。这种情况是可能出现的,如图像中只包含几个字符,或者是存在不规则光照。

7. dual_threshold算子

该算子表示双阈值处理,其原型如下:
dual threshold(Image : RegionCrossings : MinSize, MinGray, Threshold 😃
该定义来自Halcon官方文档。其第1个参数为输入图像,第2个参数为阈值处理的输出区域,第3个参数为分割出的区域的最小面积,第4个参数为区域的灰度下限,第5个参数为灰度阈值Threshold。该阈值处理可以看作是对两个方向进行了阈值分割,不但提取出了灰度大于等于Threshold 值的范围,也提取出了小于等于-Threshold值的范围。
之所以会有负的灰度值,是因为dual threshold算子在处理之前一般会先对原始图像进行拉普拉斯操作,输入的图像一般是拉普拉斯图像,这类图像包含正的和负的灰度值的区域。
满足灰度阈值并符合面积条件,同时还满足最小灰度条件的区域将最终被分割出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/401633.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-08-06升级记录:Android开发接口-获取定位卫星相关信息

Android中获取卫星信息的接口有两类: 一、GpsStatus 注意:此类在API级别24中已被弃用。 请使用GnssStatus和GnssStatus.Callback 。 这个类表示GPS引擎的当前状态。该类与 GpsStatus.Listener接口配合使用。 方法: 获取卫星信息&#xff…

24/8/15算法笔记 项目练习冰湖

import gym from matplotlib import pyplot as plt %matplotlib inline import os os.environ[SDL_VIDEODRIVER]dummy #设置环境变量 SDL_VIDEODRIVERdummy 是在使用基于 SDL (Simple DirectMedia Layer) 的应用程序时,告诉应用程序不使用任何视频驱动程序。这通常…

Transformer动画讲解-单头注意力和多头注意力

单头注意力和多头注意力 Transformer的起源:Google Brain 翻译团队通过论文《Attention is all you need》提出了一种全新的简单网络架构——Transformer,它完全基于注意力机制,摒弃了循环和卷积操作。 注意力机制是全部所需 正如论文标题所…

景联文科技:一文详解如何构建高质量SFT数据

在图像处理和计算机视觉领域中,将一张图像转化为可用于训练机器学习模型的数据是一项复杂而重要的任务。SFT(Supervised Fine-Tuning,监督微调)是一种常见的深度学习策略,在这一过程中发挥着核心作用。 SFT是指在一个预…

PostgreSQL-02-入门篇-查询数据

文章目录 1 简单查询SELECT 语句简介SELECT 语句语法SELECT 示例1) 使用 SELECT 语句查询一列数据的示例2) 使用 SELECT 语句查询多列数据的示例3) 使用 SELECT 语句查询表所有列数据的示例4) 使用带有表达式的 SELECT 语句的示例5) 使用带有表达式的 SELECT 语句的示例 2 列别…

【MySQL进阶之路】MySQL基础——从零认识MySQL

目录 主流数据库 什么是MySQL MySQL服务 从文件系统角度理解数据库 MySQL架构 SQL语句分类 存储引擎 个人主页:东洛的克莱斯韦克-CSDN博客 主流数据库 数据库开发商特点适用场景SQL Server微软.NET程序员的最爱,适合中大型项目企业级应用&#xf…

Mapreduce_wordcount自定义单词计数

自定义的wordcount 数据处理过程 加载jar包 查看后面的pom文件 以上为需要的jar包路径,将其导入至idea中 Map package com.hadoop;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; im…

电动汽车和混动汽车DC-DC转换器的创新设计与测试方法

汽车 DC-DC 转换器市场规模将达到187亿美元,年复合增长率为10%。 DC-DC 转换器是汽车的重要组成部分,它可以通过电压转换为各种车载系统供电,例如日益复杂的车载信息娱乐系统、使用驾驶辅助系统(ADAS)实现的增强安全功…

灵办AI免费ChatGPT4人工智能浏览器插件快速便捷(多功能)

灵办AI就是您所需的最佳助手!我们为您带来了一款多功能AI工具,不仅能为您提供精准翻译,还能满足您的对话需求、智能续写、AI搜索、文档阅读、代码生成与修正等多种需求。灵办 AI,真正让工作和学习变得轻松高效! 推荐使…

人工智能在网络安全威胁测试中的应用:LLMs如何改变网络威胁格局

一、引言 随着人工智能技术的快速发展,特别是大型语言模型(LLMs)的崛起,网络安全领域也迎来了新的变革。LLMs不仅在自然语言处理方面展现出惊人的能力,还在网络安全威胁测试中显示出巨大的潜力。本文旨在探讨LLMs在网…

【区块链+乡村振兴】链上云仓智慧动产监管平台 | FISCO BCOS应用案例

2021 年初 ,《中共中央国务院关于全面推进乡村振兴加快农业农村现代化的意见》将“乡村振兴”的重要性提升 到前所未有的战略高度。而随着科技与金融的深度融合,金融行业亦开始步入大数据、云计算、人工智能、区块 链的新技术发展。启动金融科技赋能乡村振兴示范工程…

微信小程序--24(列表渲染)

一、wx&#xff1a;for 1.作用 根据指定数组&#xff0c;循环渲染重复的组件结构 2.语法 <view wx:for"{{data中的数据}}"> 索引是&#xff1a;{{index}}, item项是&#xff1a;{{item}}</view> index:表索引item&#xff1a;表当前循环项 …

<数据集>骑行头盔识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;5026张 标注数量(xml文件个数)&#xff1a;5026 标注数量(txt文件个数)&#xff1a;5026 标注类别数&#xff1a;3 标注类别名称&#xff1a;[helmet, without_helmet, two_wheeler] 序号类别名称图片数框数1helm…

轻空间成功承建马来西亚吉隆坡多功能气膜馆

近期&#xff0c;轻空间&#xff08;江苏&#xff09;膜结构科技有限公司顺利完成了马来西亚吉隆坡多功能气膜馆的建设工作。这一项目是轻空间在海外市场的又一重大突破&#xff0c;不仅展现了公司在国际气膜结构领域的卓越技术实力&#xff0c;也进一步巩固了轻空间作为全球领…

IDEA关键词全局检索-之jar包

正常没有下载到源码的jar包&#xff0c;是无法检索到.class编译文件中内容的 repository本地仓库中&#xff0c;也是没有源码的 《检索步骤》 1、首先&#xff0c;下载源码 - 可以配置maven自动下载所有jar包的源码&#xff08;再同样配置File-NewProjectsSetup-Settingsfor…

u-picker 点击遮罩层 无法关闭的原因,尤其要注意最后一点

u-view 组件 u-picker 点击遮罩层无法关闭问题 &#xff08;说实话uview的文档写的真的一般&#xff0c;跟pc端的完全不能比啊&#xff09; 三个需要注意的点 1. 需要添加 closeOnClickOverlay 属性 <u-picker :show"show" :columns"columns" keyNam…

C# 不一样的洗牌算法---Simd指令

洗牌算法&#xff0c;以随机打乱数组中元素的位置 测试数据创建 int[] _data; Random rng new Random(); protected override void CreateData() {_data new int[_size];for (int i 0; i < _data.Length; i){_data[i] i;} } 普通打乱数组元素位置 protected overrid…

如何跳过极狐GitLab 密钥推送保护功能?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…

函数(子程序)的常见、易混淆概念详解【对初学者有帮助】

C语⾔中的函数也被称做子程序&#xff0c;意思就是⼀个完成某项特定的任务的⼀小段代码。 C语⾔标准中提供了许多库函数&#xff0c;点击下面的链接可以查看c语言的库函数和头文件。 C/C官⽅的链接&#xff1a;https://zh.cppreference.com/w/c/header 目录 一、函数头与函…

springBoot框架

使用springmvc框架&#xff0c;除了引入相关的依赖&#xff0c;还需要手动配置spring对象和springmvc对象&#xff0c;这个过程使用xml文件编写实现&#xff0c;最后在web的配置文件中引入这两个对象。 要实现dispatcherServelet的组件功能&#xff0c;还得在springmvc容器中手…