孙宏昌,胡锃泽,闫伟伟
(1.天津职业技术师范大学 机器人及智能装备研究院,天津 300222;2.天津市智能机器人技术与应用企业重点实验室,天津 300222;3.黄山市科美环境科技股份有限公司,安徽 黄山 245400)
在农业、食品、医学等行业中,职业工作者可以通过计算机减少工作强度,提升工作效率[1]。本研究根据现有研究现状的问题,提出了一种基于改进最大类间方差法结合霍夫变换(Otsu + Hough)的图像处理算法;对工业摄像机拍摄的菌落图像利用Python-OpenCV 进行去噪、滤波、图像增强等预处理,接着使用改进的大津法进行处理[2]得到菌落的二值图像。为避免培养皿边缘对计数结果的影响,通过Hough 方法去除培养皿边缘,最后遍历图像寻找并描绘出菌落的边缘轮廓[3],计算菌落封闭轮廓面积并对其按顺序进行标号,完成菌落计数。
鉴于对微生物检测控制平台的要求和目前实验室现状,选择了该机械臂作为微生物检测控制平台,如图1 所示。运动控制卡选择开放式多轴运动控制器,相当于功能齐全的小型计算器。运动控制卡通过接受上位机Labview 程序指令后,发送信号给机械臂,操控升降臂和伸缩臂对微生物培养皿进行运动,将其放置到合适摄像头获取图像的位置。
图1 升降、伸缩机械臂
通过调用Labview 中的节点函数就可以完成对运动控制卡提供的运动函数动态链接库的控制,在实际使用Labview 中节点函数调用时,需要根据函数的参数类别对输出、输入参数进行一定的配置才能直接调用。如图2 所示为Labview 中的程序框图。
图2 Labview 程序
经过图像采集系统直接得到微生物图像因为噪点、色彩等问题会直接影响最后的精度,所以需要先进行图像预处理。将菌落图像进行图像分割,可以将图像和背景相分离,不光简化后续冗杂的过程,也能给后续计数工作奠定基础及提供便利,最后去除培养皿边缘后即可得到菌落计数数量。使用OpenCV 库作为菌落计数算法开发的图像处理工具,如图3 所示,对菌落进行自动计数分为以下4 个步骤:
图3 菌落计数流程
(1)菌落图像预处理:在得到相关图像后对其进行灰度变换、去噪滤波和图像增强等预处理[4]操作,可以使得后续处理更加方便快捷,提高计数精度。
(2)菌落图像分割处理:使用Otsu 算法对图像进行分割[5],将目标检测物与背景相分离,最理想情况是将背景中所有菌落都分离出来。
(3)去除菌落培养皿边缘图像:利用Hough 变换寻找培养皿边缘圆心并根据已知培养皿半径去除培养皿边缘,确定计数范围,减少计数误差。
(4)菌落计数:通过计算每个封闭区域的面积完成菌落计数。
菌落图像采集设备采集到菌落图像如图4 所示,因为成像系统亮度的响应范围都有一定限度,所以图像存在亮度峰值和最小值之比较低的问题,不利于图像的观察、处理、分析,针对采集到的菌落图像对其进行灰度变换,可以增强对比度,提高图像的视觉表现效果,也为后续图像增强打下了基础。受到各种不可控的主客观因素的影响,图像在采集和传输中会出现噪声、失真等问题,图像需要经过增强才可以满足使用需求。利用图像增强可以放大图像特征,有效减少负面影响,增强视觉效果。
图4 菌落原图像
(1)灰度变换:一副完整的菌落采集图像一般由红色(R)、绿色(G)、蓝色(B)3 个通道组成,而灰度图像是只有纯白通道,为了保证菌落之后算法的处理复杂度和精确度,因此将采集到三通道的彩色图片变成只有单通道的灰度图像。将菌落采集设备采集到的菌落待处理图像进行加权处理,彩色图像的红、绿、蓝三元色像素最终变成灰度图像中对应像素点的灰度值,处理结果如图5 所示。
图5 菌落灰度处理图像
(2)图像增强:在图像采集、图像传播、图像生成等过程中会由于一些外部因素影响,比如光照、噪声等因素,对采集到的图像质量产生噪声干扰,需要对图像进行滤波处理,否则会因为画面的失真和图片中的噪点给后面菌落计数算法造成难度,降低其准确性。选用中值滤波[6]对图像进行滤波降噪处理;中值滤波算法以3×3 滤波函数窗口,计算点(x,y)为中心周围邻域八个格子的像素值以升序排列,并以排列的像素中值作为目标像素(x,y)的新像素值。中值滤波相关原理如图6 所示,降噪之后处理效果如图7 所示。
图6 3×3 中值滤波原理
图7 菌落中值滤波图像
传统Otsu 算法[7]操作理论简单、意义明确,是一种动态计算确定图像分割阈值的自动无监督图像分割算法。该算法[8]利用灰度图像直方图在目标图像和背景中存在的较大差异来得确定最佳阈值大小,将背景与目标图像相分离。传统的Otsu 算法处理图像时,将原图像中的像素点分成了2 个部分:背景的像素点和图像的像素点,但由于算法只考虑到了将图像分割成背景和目标图像2 个方面,当背景和目标灰度值相近时区分困难。将原图像的分割类别分为三大类进行阈值分割,分别分割成“背景图像”“边缘点”和“目标图像”,在对“边缘点”的像素点进行单独讨论,将边缘点进行再次分类,最后将图像分割成背景或目标图像。改进的Otsu 算法一定程度上解决了背景和目标灰度值相近时,传统Otsu 算法难以分割两者的问题,并且有比传统Otsu 算法更好的自适应性和准确性。
假设灰度图像的大小为N×M,L(0,1,2,…,L-1)为F(x,y)的灰度级数,其中灰度值i(i∊{0,1,2,…,L-1})像素个数为ni,将灰度图像分为三大类C0、C1、C2,分别为:“背景图像”“边缘点”和“目标图像”。最大类间方差阈值分别设为k和m,C0类像素灰度级为[0,1,…,k],C1类像素灰度级为[k+1,k+2,…,m],C2类像素灰度级为[m+1,m+2,…,L-1]。其改进的Otsu算法的最大类间方差定义为:
其中三大类C0、C1、C2出现的可能性和其灰度均值分别为:ω0,ω1,ω2和μ0,μ1,μ2(n= 0,1,2)。
其每个类的最大类间方差为:
综上所述,可以得知:
对其式(4)两边对k和m分别求偏导并且让偏导数为0 可以得到:
当所求阈值m,k满足式(5)(6)的关系时,阈值分割效果最佳。当算法根据高、低阈值进行遍历时,将灰度值比低阈值小的像素点去除,反之保存,如果某像素点的灰度值在上述两者之间,像素点有可能是目标,也可能是背景,需要对其模的最大值方向和图像边缘走向计算来确定其归属。将图像的像素梯度幅值分为l个级别,并计算该像素点和其邻域的梯度模值,如果其模的大小在邻域内为最大值,那么该像素点为目标,否则应当去除。改进算法和传统算法经过处理后的图像分别为图8 所示。
图8 改进算法比较
在实际菌落生长过程中,会有部分菌落和培养皿边缘产生粘连现象,培养皿边缘像素处理不当会对计数结果产生一定负面影响。如果在粘连情况下直接利用文献[9]中的方法去除培养皿边缘,会造成很大的计数误差。对此问题,采用Hough 变换[10]来检测圆形培养皿边缘区域,从而有效地剔除培养皿边缘以及边缘以外信息,同时保留与培养皿边缘产生粘连的菌落信息,保证计数的准确性。
利用Hough 变换的算法把圆检测出之后,同时能得到霍夫圆的圆心坐标,根据培养皿的直径R即可再次遍历图像上的像素点,并以Hough 圆的圆心,以R为半径的圆及其外部像素全部置为0 或255 即可将培养皿的边缘剔除,剔除边缘后的菌落图像如图9 所示。
图9 剔除培养皿边缘后的图像
为了验证基于改进Otsu + Hough 图像处理算法的菌落计数算法是否能够解决实际问题,对实际图像采集设备待处理图片进行相关算法测试,实验运行算法环境为Python 的OpenCV 库,其具体算法流程图如图10 所示。在图像经过图像预处理后,对相应二值图像进行遍历处理,寻找在同一个连通域并且是非零的像素点,如果目标点在相同连通域内,证明其属于同一个菌落[11]。
图10 菌落计数算法流程
利用遍历算法找出所有连通区域后,在二值图像上绘制相关连通域,设定阈值面积大小,将每个连通域面积和阈值面积大小对比。如果连通域的面积大于预设的阈值,说明连通域为菌落,否则将它当作噪声来去噪,得到最终的菌落个数。分别对图8、图9 进行菌落计数,最终计数结果,如图11、12 所示。
图11 培养皿边缘去除前计数
图12 培养皿边缘去除后计数
经过上述分析,本实验在Python3.7.0 环境下对将近100 多幅图像进行相关实验测试,并和人工计数结果相比较。测试结果如表1 所示,实验结果和人工计数结果偏差率较小,足够满足实际运用需求。
表1 菌落计数
为了解决人工计算菌落数的准确率和效率低等问题,提出了一种改进Otsu + Hough 图像处理算法的菌落自动计数方法。该方法利用改进的Otsu +Hough 算法和多种其他图像处理算法对采集到的菌落图像进行处理,根据最后遍历出来连通域的面积来确定相对应菌落的数量多少。在保证菌落计数的准确性基础上,提高了计数的工作效率,降低了工作人员工作强度,并且避免了培养皿频繁取出导致的环境变化对菌落生长产生不良影响。综上所述改方法在准确率上满足实验要求,相对人工计数结果误差较小,程序平均图像处理时间较短,适合菌落计数或者同类计数中使用,复现率较高。