【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”]), 没错,就是…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...