【blob算法】不一定要二值化,实际上。在我所接触过的系统中。BLOB算法,没有一家是用二值化的,因为误差太大。 所谓BLOB算法,其实没有什么奥妙可言。简单地说,就是在一个欲定的“清洁”的范围内,将一块斑点(大家可以想象成是一块“污迹”)找出来。 其算法,也不难--至少在目前已知的算法中来看是这样的。完全是基于“边缘寻找”算法之上。上次答应过YOUYOU写一篇有关BLOB算法,非常对不起,最近忙于和国内的合作项目,实在没有时间。只好先欠着。在这里只简单地介绍一下:
BLOB算法的核心思想,就是在一块区域内,把出现“灰度突变”的范围找出来。什么意思呢?便于大家理解举个实际例子:想象大家手上有一面镜子,非常清洁 (清洁到大家脸上的“青春痘”都看得一清二楚)。现在我在上面滴一滴蜡,于是镜面上就出现子一个“污点”。BLOB算法,就是帮助我们把这个“污点”的准 确位置找出来,并确定其大小、形状及面积等的算法。 现在整个镜面就是我们欲定的检测范围。用光源把该范围照亮。于是,由于镜面是强反射的表面,所以在相机中看到的是一片白色,而点了蜡的地方,则不会反光, 或反光极弱。所以这一小块“污点”,在成象中看到的就是一块黑。
算法启动,最普通的算法是边缘寻找中的“卷积算法”(convolution,呵呵。。好象有几种不同名称)。我们把例子具体到极点:现在“卷积算法”的 矩阵设定为2×4,也就是说2行4列。扫描是从左向右由上至下进行的。那么,矩阵每移动一步,程序就会计算矩阵中前半部(列1及列2)的灰度值总和,与矩 阵后部(列3及列4)灰度值总和的差。如果矩阵中的这块图象的颜色是一致的,也就是说矩阵中的8个象素的灰度极接近的话。那么,这个矩阵前部与后部灰度值 总和差应该是趋近0的。 程序一步步运行,矩阵前部与后部灰度值总和差一直接近0。这时,这个矩阵扫描到了那块“污点”的边缘,这时矩阵前部与后部灰度值总和差突然“跳”了起来, 即,矩阵中的灰度值不再接近,出现了一块“黑色”。 于是程序便知道,我们已经描到了一个BLOB,斑点,的边缘。就这样,当程序扫描完整镜面的时候,系统就记录了全部发生这种“突变”情况的点的坐标。而这 些就,就是那块污点的边缘。 下面,我们再对这些边缘点进行一系统的分析,便可以得到这个班点的大小、形状及面积等信息。
BLOB分析,是可以分析出“黑”色或“白”色班点的。因为,我们从算法上可以看出,这种“突变”,对无论是由黑到白,还是从白变黑的情况都是适用的。 上面的例子是“白”表面上的“黑”斑点。另举一例:我们拿一块黑色的塑料板,用刀在上面一划,就出现一条“白”色的划痕。大家套着上面“镜面滴蜡”的例 子,稍作推想,就不难想出同样算法,一样可以分析出“白”色的划痕各种信息。
从上面的介绍大家不难看出,目前的BLOB算法有以下几个缺点:
1,速度过慢。当然了,你要整个区域作逐点扫描。
2,斑点分析难度大。这是一纯几何学上的问题--已知了一个不规则的形状,如何计算它的面积、大小?不是说无法计算,而是简单易行的算法好象还没有。太过 复杂,运算时间就长,速度就更慢了--检测一个苹果的表面,没有理由花上1分多钟去分析吧?另外,在实际应用中,没有单纯的表面检测。通常一个项目,客户 要示检测几样东西,而表面检测只是其中一项。这就使BLOB分析算法的局限性更为明显。比如,我们作一个印刷品的检测:一、检测印刷品上印上去的字是否清 楚;二、检测印刷品表面有没有划痕。于是,我们的BLOB算法就要能区别出哪个“斑点”是文字,哪个“斑点”是划痕。
3,实际应用。BLOB算法在实际应用中,非常依赖光源。几乎可以说,BLOB算法如果离开了一个可靠的光源设计,则完全是个没用的废物。还举苹果表面检 测的例子,苹果表面是有各种颜色的,红红绿绿。而这些颜色上的差异,在黑白相机下来看,就是灰度值的变化。那么,在这个项目中,灯庞的设计就变得至关重要 了:灯源要把苹果表面的色差在成象中“滤”去,而将苹果表面的“伤痕”凸现出来。 以上,就是对BLOB算法的简单介绍,由于时间关系,实在无法将其完善为一篇完整的文章,而我又不喜欢随随便便的糊弄。对不起大家了,等以后有时间再来写 吧。 算法研究小组的朋友们,如果你们能够搞出一套实际可行的BLOB算法来。嘿嘿。。。。我们在老外面前就有的吹了!!
转载于:https://www.cnblogs.com/hjqxaly/archive/2010/11/10/1873384.html