灰度直方图

横坐标:是 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. [转载] Maven类包冲突终极三大解决技巧 mvn dependency:tree
  2. 如何让一种币更有生命力——一种BCH开发资金募集方案大讨论
  3. ubuntu解决eclipse中logcat只显示level栏
  4. DCMTK:测试CT像框FG类
  5. 如何在EXCEL中添加下拉框
  6. 有趣分享:国内产业图谱
  7. 裁员见司品,程序员趁早准备退路
  8. Dart基础第11篇:抽象类 多态 以及接口
  9. 新浪微博android代码,新浪微博Android源代码(基于OAuth1.0 仅供学习)
  10. 745. 前缀和后缀搜索(每日一难phase2--day27)
  11. GD32F103替换STM32F103
  12. android studio代理设置
  13. 帝国cms 评论 审核 php,帝国CMS自动审核发布脚本
  14. Please sign in with an app-specific password. You can create one at appleid.apple.com.
  15. 日本SUPER DELIVERY电商使用虚拟信用卡海淘购物攻略
  16. 「Arm Arch」 ISA 概述
  17. C++ Reference: Standard C++ Library reference: C Library: cstdio
  18. docker重启 容器自动重启
  19. 统计中的f检验和t检验的区别
  20. 2.9 Nginx一致性HASH算法

热门文章

  1. 隐私计算加密技术基础系列-Diffie–Hellman key exchange
  2. 绘制2019-nCoV动态疫情地图
  3. 完全数,丰沛数,不足数
  4. sql 转换 不足位数补0
  5. 雷神笔记本做java,详细爆料雷神911Air星战三代 15.6寸笔记本好不好用?怎么样呢?大神吐槽真心话...
  6. 利用简单的爬虫获取CV顶会论文
  7. 智能家居项目(八)之树莓派+摄像头进行人脸识别
  8. 《绿皮书》:剧情紧凑,语言很美
  9. 应用QQ2440(s3c2440)ARM开发板驱动MMA7455加速度计的linux设备驱动编写
  10. [一维前缀和]leetcode303:区域和检索 - 数组不可变(easy)