阈值分割的理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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!放弃不符合我们傲娇的逼格。经过一番摸索我们找到了名为动态阈值分割的招式。
啥意思?动态还阈值又什么分割?这么长的名字这是吓唬咱老百姓吗?群众是这么容易被吓到的吗?