【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个像素,通过周围的像素,算出一个平均值给中心的像素。卷积核会从头到尾,扫描整幅图片。(图片边缘处更具卷积核大小,通过镜像将像素点补齐)

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

那这样得出的图片的每个像素点的值,都是它原本图片的周围像素点的平均值! 

我们来看看均值滤波的效果:

原图
原图
均值滤波后
均值滤波后

 均值滤波后,给人的第一感觉就是,图片变模糊了,轮廓处没有那么分明了!

“ 那个这个均值滤波感觉没啥作用啊!”,我一度这么认为。

但其实,我们对对图片做某种滤波操作是,有的时候并不是为了宏观上的图片展示效果,而是微观上每个像素的值

比如均值滤波!得到每个像素值后再结合另个一个算子dyn_threshold达到目的!

dyn_threshold

dyn_threshold算子,字面意思就是 动态阈值,又称 局部阈值。比全局阈值 threshold 多了一个前缀 dyn_ 。不管是动态阈值,还是全局阈值,他们的目的都是 为了 做图片分割!把我们感兴趣的部分挑出来。动态阈值 的优势在于,在光照不均匀的情况下做分割!

我们来看看这张图片:

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

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

 动态阈值(局部阈值),就能解决这个问题!它的思路是,将某个像素和周围的像素做对比,如果比 周围像素的平均值 高出某个值 就会被分割出来。这就体现了局部的特点。从而避开了光照不均的问题。

那现在的问题是 周围像素的平均值 哪里来?没错,就是 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,表示和平均【halcon】灰度直方图直观理解与应用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分区中去寻找:

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年9月19日
下一篇 2023年9月19日

相关推荐