韩晓丽, 李勇超, 袁 媛, 王俊伟
(1.太原科技大学, 山西 太原 030024; 2.太原重工股份有限公司, 山西 太原 030024)
输送带作为带式输送机的主要承载和牵引部件,其安全可靠的运行能够保障企业的正常生产需求,极大地提高企业的经济效益。目前学者们在输送带纵向撕裂检测方面提出很多方法,其中机器视觉技术因具有非接触、实时、可控制等优点[1]得到了广泛应用。郭启皇等[2]设计了一套基于Otsu 算法的输送带撕裂检测系统,可以快速、准确检测到运行状态下输送带撕裂痕迹;李现国等[3]设计了一种基于线激光和ARM的输送带纵向撕裂监控系统,该系统能及时准确检测出输送带纵向撕裂故障,具有实时性好、图像处理效率高、布线简便、可远程监控等优点;徐善永等[4]提出基于序列最小最优化(SMO)算法的红外图像检测方法。SMO 算法不仅预测精度高,而且实时性好,对于皮带撕裂故障诊断具有良好的实用价值。
当输送带图像有撕裂特征时,通过图像处理识别,实时发出撕裂报警信息[5]。本文针对带式输送机在使用中出现的输送带纵向撕裂问题,提出了一种基于机器视觉的双目视觉检测方法。该方法首先对采集的图像进行预处理,再对其进行轮廓检测和撕裂报警研究系统流程如图1 所示。
图1 系统流程
要提取输送带的纵向撕裂特征,必须对采集的原始图片进行预处理,以消除噪声、增强反差、突出撕裂信息。图像预处理流程如图2 所示。
图2 图像预处理流程
图像增强用直方图均衡化和自适应直方图均衡化进行处理。直方图均衡化是将原始图像从灰度直方图中的一个比较集中的部分转移到整体上,先从灰度图的灰度曲线入手,将其对应的灰度值保存在直方图中,然后对直方图进行平滑处理,使像素的灰度值分布更均匀,改善整体对比度,使图像更清晰。有时,由于原始图像的直方图变化太大或者太陡,在均衡化处理后会产生“退化效果”,所以这里就需要引入自适应直方图均衡函数,其相关代码如图3 所示。
图3 直方图均衡化相关代码
这种情况下,使用CreateCLAHE 功能把整个图片分割成许多块,对每个数据块进行直方图均衡处理,采用反差极限。对于每一个区块,当直方图中的bin 超出了反差的上限时,将所有的像素点均匀地分布到其他bins 中,再进行均衡化。不同均衡化结果如图4 所示。
图4 不同均衡化效果对比
输送带影像中的噪声影响输送带纵向撕裂的分析和识别,必须对其进行过滤。本文利用空间域滤波技术,对中值滤波、均值滤波等方法进行了分析和研究。对不同方法在输送带带上的滤波效果进行了对比,以达到更好的消除噪声、保存输送带纵向撕裂信息的目的。
均值滤波是线性滤波算法,它是将目标像素的一个模板包含在其周边附近的像素,然后用整个模板中所有像素的平均值取代原始像素值。Python 调用OpenCV 实现均值滤波的核心函数、相关代码及效果如图5 所示。
图5 均值滤波相关代码及效果
Blur(src,ksize,dst=None,anchor=None,border-Type=None)
中值滤波是将中间像素的矩形邻近区域作为中间点,采用邻域平均法对噪声进行降噪,并对其进行了模糊处理。OpenCV 主要调用函数medianBlur(src,ksize,dst=None),相关代码及效果如图6 所示。
图6 中值滤波过程及效果
很明显,中值滤波得到的轮廓效果更为清晰。
将“感兴趣区”分成若干个子区,在进行分割时这些分块会形成一个边界或纹理,从而形成一个物体的特征,然后再对其进行处理,从而实现对物体的识别。
本文先二值化处理,进一步简化灰度图像,使图像中的信息更加纯粹,边缘亮度更加明显,之后再进行边缘检测。
1.3.1 阈值分割
二值化是将一组像素按灰度等级进行分割,这种分割可以根据灰度级别选择一个或多个阈值。OpenCV 提供了多种不同的阈值方法,这些方法包括以下五种,产生的效果如图7 所示。
图7 不同阈值方法的效果图
·cv2.THRESH_BINARY
·cv2.THRESH_BINARY_INV
·cv2.THRESH_TRUNC
·cv2.THRESH_TOZERO
·cv2.THRESH_TOZERO_INV
1.3.2 边缘检测
图像边缘提取极大地降低了数据量,同时将可能被视为无关的信息剔除,保持了图像的重要结构特征。在图像中,边界可以看作是一个具有一阶导数的像素点,通过求一阶导数来确定其边界。这里,分别用Prewitt 算子、Laplacian 算子、Roberts 算子进行处理,效果如图8 所示。通过比较,选择Roberts 算子进行后续的处理。
图8 算子处理效果
梯度运算即图像形态学的梯度操作,其实就是由影像的膨胀减去影像的侵蚀,最后我们得到的轮廓更为清晰。梯度运算morphologyEx()函数中的参数是MORPH_GRADIENT,相关代码及效果如图9 所示。
图9 梯度运算相关代码及处理结果
Python 提供了进行轮廓检测的函数,即.findContours 函数,返回的参数即为该图像的轮廓数量,相关代码如图10 所示。
图10 计算轮廓数量相关代码
轮廓面积是指每个轮廓中所有的像素点围成的区域的面积,单位为像素,相关代码如图11 所示。
图11 计算轮廓面积相关代码
由于三个连续的像素点间的连线有可能在同一条线上,所以可以仅输入一个等值的顶点像素点,相关代码如图12 所示。该函数可以对轮廓的长度进行统计,函数返回值为统计长度,以像素为单位,以double 的形式表示。
图12 计算轮廓周长相关代码
为了实现撕裂警告弹窗,我们需要引入tkinter库,Tkinter(亦称Tk 界面)是Python 的标准接口。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具,相关代码如图13 所示。
图13 引入tkinter 库的相关代码
引入tkinter 库后,即可实现如下的弹窗效果,相关代码如图14 所示。
图14 实现弹窗效果及相关代码
本文根据输送带纵向撕裂图像的特点,提出了一种基于机器视觉的双目识别检测方法。采用了图像预处理中的灰度转换来实现图像的反差,提高了图像的清晰度和视觉效果,使得输送带撕裂特征更为明显;利用Roberts 运算符进行图像分割;最后,利用Python平台的findContours 函数来完成轮廓的检测。经过一系列处理使得纵向撕裂图像的清晰度、辨识度得到了提高,特征更为突出。通过在Python 中引入tkinter库,最终实现了输送带的撕裂报警。该方法能保证对输送带纵向撕裂进行实时、可靠地检测,为输送机的安全、高效运行提供更好的支持和保障。