【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”]), 没错,就是…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
