刘卓帆,袁锐
(广东海洋大学,广东湛江 524003)
焊接也称作熔接,是一种以加热、高温或者高压的方式接合金属或其他热塑性材料如塑料的现代工艺过程,它已渗透到制造业的各个领域,直接影响产品质量[1]。在国内,大部分企业在焊接完成后,需要人工观察、检查焊接点处是否焊接成功。
伴随经济的高速发展,计算机视觉技术和它的相关的产业在近些年也逐渐兴起。计算机视觉是用机器代替人眼对图片进行观察判断,图像处理是以计算机视觉为基石的技术,图像处理技术已经走入了实际的生产和应用中,成为生产环节的一种技术手段。
软件使用Anaconda编程集成包为开发工具,基于Python语言中Web框架的Jupyter Notebook设计与实现一款名为“焊点截取”的图像处理软件。程序开发库主要包括:Tkinter、OpenCV、PIL、Torchvision、Os等库和标记语言Markdown。开发环境为:操作系统Win10(64位)、开发语言Python3.8.0、Web应用程序Jupyter Notebook交互式笔记本。
考虑到运行效率和软件的后期开发和维护,使用Jupyter Notebook实现,在一定程度上提高了可维护性、可行性,为后续软件迭代发展打下基础。软件的主要功能需要使用到可以加载图片、查看图片形状和分辨率、显示图片、调整图像大小,用于解决计算机视觉问题的OpenCV库[2];可以直接创建、排版简单、可读、直观、学习成本低、支持插入图片、轻松地导出HTML、md文件的Markdown;Python的标准GUI库Tkinter;Python的图像处理库PIL库;Pytorch图形库中的torchvision库,以及Python中整理文件和目录最为常用的模块os库。这些库函数很大程度上方便了开发和优化了开发的代码,使软件代码的使用周期更为长久。利用Mardown标记语言,使得软件的代码样式鲜明,增强代码的可读性,便于后续观察、修改、复制。
整体界面设计基于OpenCV计算机视觉库实现的图像处理软件“焊点截取”的功能模块图,见图1。
图1 焊点截取的功能模块图
在实现功能操作前需要将本设计用的Python第三方库全部导入到工程项目中,包括Tkinter、OpenCV、PIL、Os、PIL、numpy、Torchvision等。其中numpy工具包是一个由多维数组对象和用于处理数组的例程集合组成的库,支持大量高维度数组与矩阵运算。而图片正是庞大的二维或者三维矩阵,图像处理涉及对数组的变换和运算。
二值化是图像分割的一种方法,二值化是把灰度图像转换成为二值图像[3]。二值化的过程是,设置一个临界值,把大于这个临界值的像素变成预先设置好的灰度极大值,把小于这个临界值的像素变成预先设置好的灰度极小值,由此达到二值化的效果。用这种方法可以简化数字图像信息,提高处理的速度。
饱和度指色彩的鲜艳程度,在色彩学中,原色饱和度最高,随着饱和度降低,色彩变得暗淡直至成为无彩色,即失去色相的色彩[4]。色彩作为信息的载体,它不仅适用于设计形式,还作为传达信息的主体。可以通过调节饱和度对数字图像中的次要信息进行过滤。
rect核就是一个小的矩阵,在形态学操作过程中,通常是对二值化后的图像进行操作,此过程中的对象一般有两个,一个是原图像,即要进行处理的图像,另一个就是核或者结构化元素。核可以看作是一个矩阵,这个矩阵由数组构成可以自由定义,也可以通过getStructuringElement函数获得指定rect核的大小(Size(a,b)就是a*b大小的矩阵)和形状(方形、圆形等)核。核在图像处理中的作用过程,就是rect核矩阵从原始图像的左上角开始滑动,遍历完整个图像的同时一直进行运算的过程,这个过程中会给每一个点赋予新的值,从而实现不同的形态学处理。
利用核与图像之间进行卷积运算来实现图像处理,在图片模糊、锐化、凹凸、边缘检测等过程中都会用卷积运算实现。
介绍开运算、闭运算前,要先介绍形态学处理操作中的腐蚀、膨胀操作。膨胀操作是根据选择的核的大小对图像进行膨胀处理,连接起来图块的最外围增加相应的图块。腐蚀操作则会根据选择的核的大小对图像进行腐蚀处理,将连接起来图块的最外围的灰度值或者RGB值变为0。
闭运算先膨胀后腐蚀,把中心比较大的块连接为一个整体,填补了空白的缝隙,开运算先腐蚀后膨胀,它对图像轮廓进行平滑操作,可以达到去除了边缘小点,使得焊接点边缘变得圆润的作用。
将一幅拥有RGB三通道的彩色图像转化为只拥有一条灰度通道的图像这一过程称为灰度化处理。这种方法会丢失原始图像的色彩信息,但由于RGB三通道变成了灰度通道后矩阵维数下降,需要处理的数据呈几何级下降,使得图像处理的运算速度大幅度提高。
亮度是图像的明暗程度,对比度是指图像颜色种类的多少,色度划分是为了便于以一定标准指定各式各样的颜色,其实质上是一个标准系统,通过系统中的点来代表每一种颜色。可以对图像的色调范围进行调整,增加亮度或者阴影,将不合适获取焊接点区域的图片进行修正。
高斯滤波[5]是线性平滑滤波的一种,对于那些服从正态分布的噪声有很好的抑制作用,适用于消除高斯噪声。在实际场景中,通常都会假设图像中包含的噪声为高斯白噪声,在许多图像预处理的过程中,都会使用高斯滤波进行降噪。
高斯滤波和均值滤波相似,都是利用一个掩膜和图像进行卷积求解。高斯滤波的模板系数会随着距离模板中心距离的增大而减小并且服从二维高斯分布。所以高斯滤波器相较于均值滤波器而言,对图像模糊程度比较小。本设计为了保持图像的整体细节,使用高斯滤波对图像进行噪点抑制。
本设计通过灰度化将图片变成灰度图,减小图像原始数据量,便于后续处理时计算量更少,以此提高焊接点区域截取的正确性和正确率。使用进行图像分割的二值化方法,用多个阈值和多个二值化方法将焊接区域和背景分离简化,便于后期的处理,选取出最优的二值化方法进一步提高处理速度。在图像的预处理中使用图像增强模块中的其他功能,它们主要用于提取图像中的感兴趣区域[6]、对表达和描绘有意义的区域。感兴趣区域是指图片中蕴含信息量最密集的区域。如软件中的焊接点区域,使后续的识别工作能够抓住图像焊接点区域,提高程序区分形状特征的能力,成为图像增强技术的有力补充。预处理前后对比见图2。
图2 综合对比图
设计图片的选择的功能键需要使用到前文的提到过的tkinter库、os库、Torchvision库和PIL库。
os模块提供Python程序与操作系统进行交互的接口,tkinter库进行窗口视窗设计,Torchvision库中vision.transforms工具库将图片按比例变为长300宽400的图像方便在图像显示区显示、PIL库进行图像的存储和显示。
保存图片的功能键,只需要使用到os模块提供的接口,将程序与操作系统进行交互。在os模块提供的接口前需要定义outfile的路径。
在本文前面提到的选择图片和保存图片,都需要显示路径这项功能将程序与用户操作相连接来实现。显示路径的功能实现只需要用到tkinter库,事实上它就是一种面向对象的GUI工具包TK的Python编程接口,提供了快速便利地创建Python GUI应用程序的方法。
目前的计算机桌面应用程序大多数为图形化的用户界面,结束功能通过鼠标对菜单、按钮等图形化元素触发指令,并从标签、对话框等图形化显示容器中获取人机对话信息。按钮上的信息就是获取人机对话信息,而按钮就是人机对话的重要工具。按钮设计只需要用到tkinter库就可以快速便利地实现,退出功能只需要将tkinter打开的win窗口关掉就可以实现。
焊接直接影响产品质量、可靠性、寿命、生产成本、效率以及市场反应速度。焊接点是金属焊件或者塑料焊件熔焊时,焊件接触的位置。通常情况下焊接的质量通过焊接点的熔接情况判断。焊接点区域获取的功能键需要使用到前文的提到过的findContours函数找出焊接点轮廓,通过OpenCV计算出最大轮廓的旋转边界框,提取出轮廓中面积最大的矩形,最后在原图中进行截取。截取效果见图3。
图3 整体界面图
界面的总体设计如图3所示,分为三大模块:图像增强模块、基础模块、图像分析模块。其中图像分析模块是整个系统的核心模块,它的功能是截取处理加工后图像的焊接点区域。基础模块的功能包括:图像处理前的图片选择功能、图像处理后的保存图片功能、退出功能。图像增强模块的功能包括:分离背景和目标的二值化功能、饱和度功能、rect核运算功能、开运算功能、闭运算功能、随机灰度化功能、亮度、色度、对比度、调节功能。
“焊点截取”进行操作后新的图像立刻呈现,处理速度快,使软件反馈时间短,增强用户体验;图像处理方法可控,处理后的图片结果,更加精确;界面极简,功能界面一目了然,适用于工业应用。
本设计还可以单独使用空间域增强模块对图片目标进行缩小、放大、分离、结合和图片像素修复,使用户可以快速得到自己想要的效果图。“焊点截取”这款软件的应用具有可平移性,“焊点”区域可以根据不同的目标问题修改成“感兴趣区域”。如:在医学成像中,测量肿瘤的边界,判断肿瘤的大小;在评估心脏功能时,测量心内膜边界,判断心动周期的不同阶段;测量2D地图中特殊的多边形区域,录入地理信息系统中。在这些应用中都可以使用“焊点截取”这款软件。
实际的测试的过程中,本设计与运用神经网络的图片截取焊接点区域相比,传统算法实现的图像处理虽然比较方便,但是鲁棒性较差。由于含标签的焊接图片库较小,神经网络算法不适用。这些问题在以后的程序开发中,可以尝试人工添加标签后,结合神经网络或者传统算法和神经网络算法相互结合等方法进行优化,实现全自动焊接点质检,完成软件迭代。