【halcon】灰度直方图直观理解与应用
灰度直方图

横坐标:是 0~255 表示灰度值的范围
纵坐标:是在不同灰度值下像素的个数!
那么灰度直方图的本质就是统计不同灰度下像素的个数!
它的直观目的,就是查看灰度的分布情况!
与之相关的函数:
全局的阈值分割 threshold
threshold (ImageChannel3, Regions, 248, 255)
选择一个灰度范围,分割出在次范围中的像素。

binary_threshold
binary_threshold (ImageChannel3, Region, 'max_separability', 'dark', UsedThreshold)

如果你的背景和产品是很分明的,各自的灰度都有一个峰值(如上图)
这个函数会自动生产一个灰度值,可以很好的区分产品和背景。
'max_separability' 是一个算法的选择
'dark' 表示你想要的是比较暗的那个部分!
UsedThreshold,就是根据算法自动算出的灰度值!
mean_image
mean_image (Image, ImageMean, 13, 13)
字面意思就是,求图像的平均。专业的说法就是 【大名鼎鼎的】 均值滤波。
第一个参数是原始的图片,第二个参数是,滤波后的图片,最后两个参数表示,卷积核的大小(也就是平均的一个范围的大小)
具体的算法过程就是,一个卷积核,就像一个网格罩子,每次从原图取出 如13*13个像素,通过周围的像素,算出一个平均值给中心的像素。卷积核会从头到尾,扫描整幅图片。(图片边缘处更具卷积核大小,通过镜像将像素点补齐)

那这样得出的图片的每个像素点的值,都是它原本图片的周围像素点的平均值!
我们来看看均值滤波的效果:


均值滤波后,给人的第一感觉就是,图片变模糊了,轮廓处没有那么分明了!
“ 那个这个均值滤波感觉没啥作用啊!”,我一度这么认为。
但其实,我们对对图片做某种滤波操作是,有的时候并不是为了宏观上的图片展示效果,而是微观上每个像素的值!
比如均值滤波!得到每个像素值后再结合另个一个算子dyn_threshold达到目的!
dyn_threshold
dyn_threshold算子,字面意思就是 动态阈值,又称 局部阈值。比全局阈值 threshold 多了一个前缀 dyn_ 。不管是动态阈值,还是全局阈值,他们的目的都是 为了 做图片分割!把我们感兴趣的部分挑出来。动态阈值 的优势在于,在光照不均匀的情况下做分割!
我们来看看这张图片:

很明显的光照不均匀,左边的偏暗,右边的偏亮!就是说产品是一个整体,是我们感兴趣的地方,需要将其分割出来,但是产品的左边变暗,右边偏亮,如果用全局阈值,那边我们很难将产品从图片中分割出来。全局分割效果如下:

动态阈值(局部阈值),就能解决这个问题!它的思路是,将某个像素和周围的像素做对比,如果比 周围像素的平均值 高出某个值 就会被分割出来。这就体现了局部的特点。从而避开了光照不均的问题。
那现在的问题是 周围像素的平均值 哪里来?没错,就是 mean_image。
mean_image 和 dyn_threshold 一般是联合使用的。
首先,对图片做一个均值滤波(mean_image ),然后通过动态阈值(dyn_threshold ),将原图的每个像素点 和 均值后的图片的每个像素点 进行对比,分割出高出平均值一定值的像素点。
mean_image (Image, ImageMean, 27, 27)
dyn_threshold (Image, ImageMean, RegionDynThresh, 5, 'light')

dyn_threshold 参数解释:
第四个参数(5) 的意思 就是 如果比 平均值高出5,那么这个像素就是我们想要的。
反之如果一个黑色的像素值为1,周围也都是值为1的黑色,那么平均出来的值肯定也是1,这样的像素点就会被剔除。
所以动态阈值的核心思想找和周围像素差值比较大的像素点。从而解决光线不均的问题。
mean_image 卷积核大小的选择:
卷积核越大,平均的范围就越大,也就是这个“局部”越大!如果我们把卷积核设置的比较小,看看会有什么情况:

有的产品边缘提取出来是空心的,这是因为,产品边缘线中间的区域像素差不多,在加上平均的局部区域比较小,那么中间的像素和平均像素就会相差无几,所以不会被选中。
这时,我们就需要增加卷积核的大小,卷积核的大小得比你想选中得边缘要大,这样求出均值就会更低,这样就不会出现空心的问题。
例子参考
动态阈值还有一个小例子供大家参考:
【halcon】例子分析之动态阈值_code bean的博客-CSDN博客之前的【halcon】系列文章中,有介绍全局,阈值的方法,threshold。但是当我们的图片的背景光线不均匀时,我们就需要动态阈值的方式,及不同的明度区域使用不同的阈值。如:这张图就是明暗不均,我们没有办法使用全局的阈值挑选出全部的“棋子”动态阈值时根据周围的环境进行对比的,使用我们先需要做一个均值滤波:做了这个均值滤波之后得到了一个“明暗的背景”,它并不是最终的结果,而是一个动态阈值的参考对象。使用 light,表示和平均值相比offset=15,更亮的部分。使用 dark,表示和平均https://blog.csdn.net/songhuangong123/article/details/125152743#:~:text=%E5%8F%91%E5%B8%83-,%E3%80%90halcon%E3%80%91%E4%BE%8B%E5%AD%90%E5%88%86%E6%9E%90%E4%B9%8B%E5%8A%A8%E6%80%81%E9%98%88%E5%80%BC,-code%20bean
小结:
这篇文章,由灰度直方图,引出了三个常用的用于分割的函数:
- threshold 全局阈值分割
- binary_threshold
- dyn_threshold 动态阈值分割
- mean_image 均值滤波。
更多的,分割算子可以到halcon的实例代码中的Segmentation分区中去寻找:

相关文章:
【halcon】灰度直方图直观理解与应用
灰度直方图 横坐标:是 0~255 表示灰度值的范围 纵坐标:是在不同灰度值下像素的个数! 那么灰度直方图的本质就是统计不同灰度下像素的个数! 它的直观目的,就是查看灰度的分布情况! 与之相关的函数ÿ…...
Android笔记:动画
文章目录1.View Animation(视图动画)1.1 Tween Animation(补间动画)Animation 继承属性透明度alpha缩放scale移动translate旋转rotateset标签Animation父类共有函数1.2Frame Animation (逐帧动画)2.Propert…...
Git学习总结
目录 Git工作的基本流程图 git基本配置 配置SSH公钥 查看提交日志(log) 版本回退 为常用指令配置别名 添加文件至忽略列表 Git操作的基本指令 编辑 Git远程仓库的操作 把黑马的Git视频看完了黑马程序员Git全套教程,完整的git项目管…...
第四天笔记
1. 简述自定义转换器的使用过程? 第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。 第二步:在 spring配置文件中配置类型转换器。 Spring配置类型转换器的机制是 将自定义的转换器注册到类型转换服务中去…...
《MySQL学习》 全局锁和表锁
一.MySQL锁的分类 二.全局锁 全局锁对整个数据库加锁,可以执行如下命令,整个数据库都将处于只读状态。 Flush tables with read lock ;我们可以执行 unlock table进行解锁 unlock table ;读操作 非读操作(阻塞) 全局锁的典型使…...
Altium Designer输出生产文件Gerber、IPC、NC Drill、坐标文件--AD
AD软件版本:22.2.1 gerber文件输出共有两部分: 1、Gerber Files:铜皮 和 外形分别导出 2、Nc Drill Files 分3次导出 一、Gerber Files 导出2次 设定原点 ** Edit->Origin->Set** 一般板边左下角为原点,可以根据自己板子形状确定 导…...
用VSCode搭建Vue.js开发环境及Vue.js第一个应用
目录 一、VSCode安装 二、VSCode简单配置 三、Vue.js的下载和引入 四、Vue.js第一个应用 一、VSCode安装 Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,可用于Windows,macOS和Linux。它内置了对JavaScrip…...
Leetcode 每日一题 2341. 数组能形成多少数对
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...
前后端分离-小项目-3前后端交互
第一步编写前端页面,第二步搭建后端环境,现在开始第三步,继续完善前端功能完善“添加”按钮功能Ajax异步请求安装在前端项目安装ajax。在Terminal输入:npm i axios -S点击“添加”按钮,弹出Dialog对话框设置对话框里面…...
Spring如何整合MyBatis框架?使用XML及java类的配置方式
前言 Spring文章链接: 从头到尾Spring概念,家族,核心技术使用,事务这一篇就够了!!!_千小半的博客-CSDN博客_spring最新技术 mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小…...
第七届蓝桥杯省赛——8冰雹数(递归)
题目:任意给定一个正整数N,如果是偶数,执行: N / 2如果是奇数,执行: N * 3 1生成的新的数字再执行同样的动作,循环往复。通过观察发现,这个数字会一会儿上升到很高,一会…...
Android 10.0 设置静态ip重启后获取不到ip的修复
1.概述 在定制化开发中,对于设置静态ip以后可以正常使用,但是遇到一个新问题 就是开机以后,获取不到ip 地址,这就有点不正常了,获取不到ip 就自然连不上网了,所以要分析问题所在解决问题 2.设置静态ip重启后获取不到ip的修复的核心代码 frameworks/opt/net/ethernet/java…...
mysql笔记
基础 概念 数据库体系结构的三级模式为:外模式、概念模式和内模式。 内模式:存储模式,对数据的物理结构和存储方式的描述。提供数据定义语言定义的。如顺序还是索引存储(将概念模式定义的数据进行组织存储,达到较好…...
华为OD机试 - 最多等和不相交连续子序列(Python)| 真题+思路+考点+代码+岗位
最多等和不相交连续子序列 题目 给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。 数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。 求一组连续子序列,组内子序列的数目最多。输出这个数目。 输入 第一行输入为…...
第四届宁波网安市赛训练题
Crypto 散乱的密文 8fd4a4c94gf15{50}l72d3提示了2 1 6 5 3 4,我们直接横向排列 2165348fd4a4c94gf15{50}l72d3 按顺序竖着抄下来fc1l84f}a45dg034{2d957,然后栅栏解密,注意这里是W型栅栏解密,行数6 flag:flag{52048c453d794df1} 综合解密…...
Windows中MySQL 8.x版本忘记密码如何重设
Windows中MySQL 8.x版本忘记密码如何重置 文章目录Windows中MySQL 8.x版本忘记密码如何重置一、前言二、重置密码操作1、停止MySQL服务2、以安全模式启动MySQL服务3、无密码登录mysql4、重置登录密码5、验证密码是否重置成功三、最后我想说一、前言 好久之前在电脑下载的MySQL…...
【信管12.1】信息文档管理与配置管理
信息文档管理与配置管理对于项目管理来说,文档非常重要,如果是传统的工程行业项目的话,仅仅标书就是几百上千页的。相对来说,其实信息系统开发项目已经好很多了。另外就是配置项,它是比文档更大的一个概念,…...
一文搞懂Linux的标准输出/错误重定向
前言 今天在写一个脚本时,需要将shell命令和可执行程序的输出重定向在某一个log文件中,但是遇到了点小问题,索性就研究下输出重定向到底怎么回事。 Linux系统,有一个非常重要概念,就是一切皆文件。在使用shell脚本时&a…...
【OJ】计数的梦
📚Description: Bessie 处于半梦半醒的状态。过了一会儿,她意识到她好像在数羊,不能入睡。Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码:每一个数码在计数的过程中出现过多少次…...
【项目实战】MySQL使用CONCAT字符串拼接函数实现与特殊字符的拼接
一、需求说明 因为有新功能需要上生产环境,总有一些乱七八糟的兼容历史数据的活要去做,比如以下。 需要批量的更新数据库中某个字段(如id列中原来是ABCDEFG,需要改成[“ABCDEFG”]), 没错,就是…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
