让计算机代替人来完成对于红白细胞的自动分析,关键在于对红白细胞的分割与识别。
目前,已经出现了许多种分割和识别方法。在分割上有阈值分割、聚类、边缘检测以及区域提取等方法。特定地使用某种阈值分割法只能将其中的一部分红白细胞分割出来。聚类法是通过检测相似点的簇来对每个聚类进行标记,其缺点是聚类数目事先不可知,而且没有考虑到不同类别间的交叉性。边缘检测通过确定强度值的突变点的位置来区分不同的区域,但是仅仅通过边缘检测并不能取得整体上较满意的效果。区域提取存在停止准则确定困难以及计算复杂等缺点。
结合红白细胞的高倍镜下图像的特点,本文采用了一种基于中值滤波和形态学结合的边缘检测方法,在对灰度图像和二值图像进行边缘检测时,能够有效地抑制噪声,保护边缘细节,提高检测精度。
中值滤波是一种非线性滤波,我们采用的窗口形状为3*3方形,其算法为:
(1)将模板在图像中漫游,并将模板中心与图像中某个像素的位置重合。
(2)读取模板下对应像素的灰度值,设这些灰度值为[[x0, x1, x2], [x3, x4, x5], [x6, x7, x8]],把9个灰度值按值的大小顺序排列。
(3)找出排在中间的一个值,设为y4 = Med{x0, x1, ..., x7, x8},将y4赋给对应模板中心位置的像素。这里Med表示窗口内所有的数按从小到大的次序排列后,取其中值的运算。
经过中值滤波后,图像噪声被去除,而且图像边缘保护得比较好,在运用基于膨胀运算的边缘提取算法对图像进行膨胀运算,使图像边缘上的灰度得到加强,再用膨胀后的图像减去原图像,从而得到图像的边缘。膨胀运算可以填平图像中小孔和弥合小裂缝。
主要利用了opencv中的三个函数:
// 基于中值滤波的自适应二值化
cvAdaptiveThreshold( gray, binary, max_val, CV_ADAPTIVE_THRESH_MEAN_C, 0, 3, 5 );
// 数学形态学上的膨胀和腐蚀
cvDilate( binary, binary, NULL, 3 ); // 膨胀白色区域
cvErode( binary, binary, NULL, 3 ); // 腐蚀黑色区域