灰度直方图

横坐标:是 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

小结:

这篇文章,由灰度直方图,引出了三个常用的用于分割的函数:

  1. threshold 全局阈值分割
  2. binary_threshold
  3. dyn_threshold 动态阈值分割
  4. mean_image 均值滤波。

更多的,分割算子可以到halcon的实例代码中的Segmentation分区中去寻找:

【halcon】灰度直方图直观理解与应用相关推荐

  1. 【医学图像处理】 2 灰度直方图、图像二值化(阈值分割)

    文章目录 1 灰度直方图 1.1 直方图理解 1.2 直方图计算 1.3 直方图均衡化 1.3.1 全局均衡化 1.3.2 自适应(局部)均值化 2 图像二值化(阈值分割) 2.1 二值化理解 2.2 ...

  2. Halcon工具之灰度直方图

    Halcon工具之灰度直方图Halcon工具之灰度直方图Halcon工具之灰度直方图 第一步:读取图片 read_image (Image, 'printer_chip/printer_chip_01 ...

  3. Halcon_灰度直方图和特征直方图的使用

    1.灰度直方图 在进行阈值分割的时候往往要确定一定的灰度范围,把自己想要的部分分割出来,这时就需要借助灰度直方图(如下图所示). 拖拉图中1处确定最小灰度值,拖拉图中2处确定最大灰度值,区间内的范围就 ...

  4. python绘制灰度图片直方图-python+opencv 灰度直方图及其二值化

    图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度图像之后,统计各个像 ...

  5. OpenCV下的灰度直方图生成及显示的源码,带详细注释

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 注:本文的源码来自博客  http://blog ...

  6. 数字图像处理:第三章 灰度直方图

    第三章 灰度直方图 目录 1.    灰度直方图 2.    直方图均衡化 3.    直方图规范化 4.    色彩直方图 作业 1.灰度直方图 灰度直方图(histogram)是灰度级的函数,它表 ...

  7. OpenCV:实现灰度直方图和单通道直方图拉伸

    原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 本文略有修改,如有疑问或者版权问题,请移步原作者或者告知本人. 直接贴代码: ...

  8. 【OpenCV 例程200篇】45. 图像的灰度直方图

    [OpenCV 例程200篇]45. 图像的灰度直方图 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直方图是反 ...

  9. matlab颜色直方图特征提取,灰度直方图特征提取的Matlab实现

    Computer Knowledge and Technology 电脑知识 与技术第5卷第32期(2009年11月)本栏目责任编辑:唐一东人工智能及识别技术灰度直方图特征提取的Matlab 实现 刘 ...

最新文章

  1. c# BackgroundWorker组件介绍(属性、方法、事件)
  2. android 4.0(ICS)源码下载方法
  3. Keepalived - Keepalived 实现 tomcat双机热备
  4. 判断当前是否是微信浏览器
  5. Redis Streams 介绍
  6. Java开发的几个注意点
  7. PHP引用全局作用域中可用的全部变量是,php全局变量之学习笔记
  8. 嫌学校 App 太“烂”,极客父母做了开源版本,却遭官方报警?
  9. Linux的Open Files设置过小导致程序退出并且Unable to create new native thread
  10. ES和Kibana在docker中的安装
  11. 浅析ASP.NET 2.0的用户密码加密机制
  12. 配置svn支持http协议访问
  13. 【数据仓库】数据仓库的发展史
  14. TMS320C55x的硬件结构
  15. 【Qt】arm-none-eabi-gdb-py.exe由于找不到python27.dll 无法继续执行代码
  16. 数通学习网络协议地图
  17. 实现原理 扫描枪_详细介绍扫描枪工作原理
  18. win查看产品密钥的方法
  19. 艺歌点歌系统服务器连接不了,艺歌手机点歌系统歌曲是什么格式
  20. 拾叶集 - 江湖一剑客

热门文章

  1. 框架 --mybatis(ORM映射)-数据库技术
  2. maven项目查看依赖树
  3. “微信教父”张小龙2021最新演讲,视频号、直播、创作者透漏了几大重要趋势丨国仁网络
  4. ftp文件缓存服务器,ftp服务器上的缓存在哪
  5. matlab之ARMA(p,q)模型
  6. 教小白使用Vmware安装苹果虚拟机
  7. 【NLP】文本分类TorchText实战-AG_NEWS 新闻主题分类任务(PyTorch版)
  8. 核芯国产最强锁相环PLL
  9. C#语言实例源码系列-实现屏幕放大器和取色
  10. o.m.s.m.ClassPathMapperScanner : No MyBatis mapper was found in ‘[com.XXX.XXX]‘ pack