阈值分割的理解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在一张黑白的图片上面,或者整个文词用灰度图这个词吧,其实说的都是同一类图片。在这张图片上面咱们能到看到文字啊数字啊字母啊之类的东西。是什么原因呢?

就一个原因:有亮的地方,有暗的地方。不然就一片白或一片黑。那么这些白的黑的在计算机里面怎么描述呢?

就是灰度值,通常灰度值被定义在0-255范围内,意思就是说一片白就是255,一片黑就是0了。中间的灰色部分按照比例关系赋值。

说完这灰度值,咱接着说阀(fa)值或者阈(yu)值,其实他们是一个东西。不过这些名字起的都不好,大白话就是分界值。就像考试的时候60分万岁,59.9白搭。意思就是这么个意思。既然如此为啥大家还都说阈值啊阀值啊之类的,而不说分界值呢?因为需要装啊!就像现在搞IT的人不搞几个新名词让人们头晕怎么忽悠钱呢?

既然大家已经进入了影像处理行业,为了入乡随俗,或者说为了装深沉,确切的说为了好忽悠客户。请大家使用阈值这个“高深”词汇。这样妹子票子就都有了。。

好了废话说完,下面进入正题。如果使用阈值提取咱们需要的图像。

在HALCON里面提供以下阈值提供方法或是函数:

一:最初级的阈值提取

threshold(输入图像,输出的区域,阈值的下限,阈值的上限)

二:稍微牛X一点的自动地全局阈值(就是自动确定阈值的范围)

bin_threshold (输入图像,输出的区域)

三:更牛X的动态阈值

dyn_threshold (输入的图像,输入的分割模板,输出的区域,偏移值,要亮的还是要暗的)

四:大绝招之Watershed 中文名分水岭

(尚未领悟该招数,待续)

五:大绝招之Watershed 的加强版watersheds_threshold

一:最初级的阈值提取

这个招术主要是用于对付下面这张图片,

你看,这黑的是黑白的是白,清晰清楚几个鸟国文字印在上面。对付这种图片只要使用

最初级的阈值提取 threshold即可。

参数一:就是这个灰度图了,

参数二:就是我们要的区域了

参数三和四怎么定呢?

见下图。

HALCON很贴心的给我们提供查看当前灰度值的工作,只要把鼠标放在图像,那么HALCON 软件的右下角就显示当前的灰度值了。我们把鼠标在文字(Limit)上移动一下,大致可以判断出来灰度值最小也有130,既然如此

我们就知道参数三个参数四怎么填了。就是130和255。

看下效果

好了我们还要的区域被提取出来了。有的哥们说周围那一大片红的咋办呢?怎么去除呢?

我想说这已经偏离主题了,不过可以告诉你非常极其简单就可以实现。

二:自动地全局阈值 bin_threshold 。

本来想在HALCON里面演示这个例子,不过由于鄙人的升级速度太快,一不小心干到版本12了。

在版本12里面已经不再支持了bin_threshold了。提供了稍微复杂的些的加强招数:binary_threshold

不过在说binary_threshold之前,我们还是把 bin_threshold说清楚吧。因为他的确简单易用。

这个自动全局阈值的核心就是自动确定阈值,那么他是如何确定的呢?

我们继续上面那个图(limit)的例子。下面阈值确定的步骤:

第一步:把图片的灰度值数出来,然后画出图。为了好忽悠,我们的给这张图起来个名字:灰度直方图。

其实就是数一数灰度为0的像素点有几个,灰度值为1的像素点有几个,灰度值为2的像素有几个,。。。。。一直到

灰度值为255的像素点为几个。最后画成一张图,下面有请“灰度直方图”闪亮登场。(鲜花,掌声)

从这张灰度直方图上面,俺们看到,灰度值只要集中在40-90 和160-230,就是说这些灰度数值的像素点比较多。

好了第一步做完了。

第二步:平滑灰度直方图,为了让大家知道什么叫平滑,我将向大家展示我惊人的绘画技巧

(多次获得幼儿园杯大奖赛冠军)

掌声,鲜花。。。。

请看图。

原来灰度直方图上面有很多细小的毛刺,做完平滑后都就是图上的红线了。

(PS:红线应该是很平滑的,但是由于我幼儿园毕业很多年了,画工有些退步,请见谅)第三步:需要波峰处的灰度值(大致是65)作为阈值的上限,

波谷出的灰度值(大致是120)作为阈值下限

将其提取出来。

效果如下:

××××××××××××××我是美丽的分割线×××××××××××××××××××××××××××××××

好了 bin_threshold 说完了,咱们接着说他的加强版binary_threshold(在HALCON12里面提供了)

这样大家就做比较了。

这个招数或者说函数的参数比较多一些。

依次是:

参数一:输入的图像

参数二:输出的区域

参数三:模式max_separability' smooth_histo

max_separability'==如果使用这种模式,那么将统计灰度值直方图上面的灰度值分布情况,然后基于最大分离前景(亮的部分)和背景(暗的部分)的原则确定分界值也就是阈值。特别说明这个模式只可以对byte和uint2 类型的图像处理

'smooth_histo==如果选择这种模式的话,首先平滑灰度直方图,然后在确定阈值。

参数四:要亮的还是要暗的('dark' 就是要暗的部分 'light' 就是要亮的部分)

第五个参数:只有一个UsedThreshold可选,估计是HALCON的研发人员为了以后再次升级该函数使用的。

看效果

补充说明:以上使用的都是全局阈值的方法,为啥叫全局阈值呢?因为一旦把阈值确定下来了就是拿这个阈值数(比如60),对正副图片的每一个像素的灰度值进行比较。

全局阈值的实现党获取有自动获取和手动设定两种方式。

自动获取的方法有bin_threshold (或者binary_threshold)

手动设定有: threshold

下面介绍一种新的方式介于手动设定和自动设定二者之间:

步骤一:使用gray_histo 获取图像的直方图(其实返回的有两个直方图一个是绝对直方图一个相对直方图)

步骤二:使用sort_index寻找出现频率最高的灰度值

步骤三:把比最高灰度值小一定灰阶值的灰度值作为阈值

动态阈值

三:更牛X的动态阈值

对于一些背景比较单纯的图像,使用全局阈值是比较适用的,但是现实往往残酷的,由于光线的变化或是其他原因我们很难得到背景单纯的图像,更多的类似于背景复杂的图像(见:/read-2637.html)

图像从左下角到右上角亮度逐渐降低,如果使用全局阈值的话,不论怎么提取都是不行的。那怎么办呢?放弃? NO!放弃不符合我们傲娇的逼格。经过一番摸索我们找到了名为动态阈值分割的招式。

啥意思?动态还阈值又什么分割?这么长的名字这是吓唬咱老百姓吗?群众是这么容易被吓到的吗?

相关文档
最新文档