http://www.china-vision.net/bbs7/2003-9/29/155940867.html
不一定要二值化,实际上。在我所接触过的系统中。BLOB算法,没有一家是用二值化的,因为误差太大。 所谓BLOB算法,其实没有什么奥妙可言。简单地说,就是在一个欲定的“清洁”的范围内,将一块斑点(大家可以想象成是一块“污迹”)找出来。 其算法,也不难--至少在目前已知的算法中来看是这样的。完全是基于“边缘寻找”算法之上。上次答应过YOUYOU写一篇有关BLOB算法,非常对不起,最近忙于和国内的合作项目,实在没有时间。只好先欠着。在这里只简单地介绍一下:
BLOB算法的核心思想,就是在一块区域内,把出现“灰度突变”的范围找出来。什么意思呢?便于大家理解举个实际例子:想象大家手上有一面镜子,非常清洁(清洁到大家脸上的“青春痘”都看得一清二楚)。现在我在上面滴一滴蜡,于是镜面上就出现子一个“污点”。BLOB算法,就是帮助我们把这个“污点”的准确位置找出来,并确定其大小、形状及面积等的算法。 现在整个镜面就是我们欲定的检测范围。用光源把该范围照亮。于是,由于镜面是强反射的表面,所以在相机中看到的是一片白色,而点了蜡的地方,则不会反光,或反光极弱。所以这一小块“污点”,在成象中看到的就是一块黑。 算法启动,最普通的算法是边缘寻找中的“卷积算法”(convolution,呵呵。。好象有几种不同名称)。我们把例子具体到极点:现在“卷积算法”的矩阵设定为2×4,也就是说2行4列。扫描是从左向右由上至下进行的。那么,矩阵每移动一步,程序就会计算矩阵中前半部(列1及列2)的灰度值总和,与矩阵后部(列3及列4)灰度值总和的差。如果矩阵中的这块图象的颜色是一致的,也就是说矩阵中的8个象素的灰度极接近的话。那么,这个矩阵前部与后部灰度值总和差应该是趋近0的。 程序一步步运行,矩阵前部与后部灰度值总和差一直接近0。这时,这个矩阵扫描到了那块“污点”的边缘,这时矩阵前部与后部灰度值总和差突然“跳”了起来,即,矩阵中的灰度值不再接近,出现了一块“黑