基于OpenCV 的物体图像边缘缺陷识别研究

2021-04-23 05:51张启轩袁明辉
软件导刊 2021年4期
关键词:角点轮廓灰度

张启轩,袁明辉

(上海理工大学光电信息与计算机工程学院,上海 200093)

0 引言

如今,安全已成为社会各行各业首要关注的问题,尤其在人流密集且流动性大的场所,安全保障尤为重要,如飞机场、火车站、汽车站、地铁站等。为了保证安全,防止乘客携带易燃易爆等违禁物品[1],太赫兹安检系统发挥着重要作用。太赫兹安检系统是基于太赫兹成像技术构建的,太赫兹成像以太赫兹波(0.1~10THz)为信号源[2]。太赫兹(Terahertz)波是一种新的、介于毫米波与红外光之间的辐射源,具有光子能量低、载波频率高等优点[3],因此相比传统的X 射线安检仪,大大降低了射线对人体的伤害[4-5]。另外,太赫兹波处在特殊波段,对许多电介质和非极性物质,如塑料、陶瓷、纸张、布料等具有良好的穿透性,可用于此类材料的隐蔽物检测,弥补了X 射线检测的不足[2],因此在安检领域得到了广泛应用。

虽然太赫兹波检测有着X 射线检测没有的优点,但太赫兹图像质量会受到太赫兹安检系统硬件及外界环境的影响,使得检测的图像质量降低,图像背景噪点多[3,5]。对于人体这一检测目标来说,要想检测出人体异物并构建完整的人体轮廓,除对硬件系统要求较高外,还要对采集的图像进行后期处理。张馨等[6]采用Lucy-Richardson 算法、针孔像分析法、阈值分割和边缘检测方法对扫描图像进行图像重构,以提高图像质量以及对图像目标的分辨能力。目前国内外研究主要针对目标物内部缺陷检测,而针对物体边缘轮廓缺陷检测并绘制完整物体轮廓的相关研究很少,基于OpenCV 库的C++语言算法进行人体边缘缺陷识别的研究更是寥寥无几。本文基于现有的OpenCV 计算机视觉库,其具有开源、轻量化、高效等优点,同时OpenCV 由C++语言编写[7],主要接口也是C++,易读性强,工程兼容性好,此外还提供了Python、MATLAB 等语言接口,使得算法可移植性强,能在Linux、Windows、Android 等操作系统上运行。根据OpenCV 提供的视觉算法,本文提出一套完整的图像处理算法体系,通过对太赫兹安检系统采集的图像进行预处理,检测人体边缘缺陷并绘制完整轮廓,以提高图像质量和检测准确率。

1 图像预处理

图像预处理是对采集的图像正式处理前进行的一种处理,主要目的是消除图像中的无关信息,如背景噪声等,并增强有用信息特征,以便于特征提取,提高识别和匹配度。图1 为扫描系统采集的原始人体图像,人体右腿分别绑有两块异物G。从图像上可以看出,异物边缘位于人体边缘上,并且与背景连通,使得异物边缘与人体边缘在识别上存在难度,即很难分辨人体边缘是否存在异物。

对采集的原始图像首先进行灰度处理,然后进行阈值分割实现图像二值化处理,采用大津阈值处理法(OSTU),如图2 所示。图像二值化处理是指将图像上的每个像素点根据阈值分割设定合适的阈值,将低于该阈值的像素点全部设为黑,将高于该阈值的像素点全部设为白。通过图像的二值化处理,可使原始图像特征点突出,将人体轮廓从背景中分离出来[8],并能大幅减少后期图像处理数据。尽管经过OSTU 处理后的人体轮廓从背景中分离了出来,且更加清晰,但是人体边缘轮廓细节有所缺失,呈现为不连续性轮廓,异物边缘也不太清晰,人体内部噪点也被保留了下来,使得在分辨人体异物G 时出现了严重干扰。

因此经过二值化处理以后,要对图像进行小孔洞填充/小区域去除,以减少特征数量,避免与目标特征冲突。本文采用区域生长法与四邻域探测方法[9],相比八邻域,四邻域探测范围减小,可以更好地消除小孔洞,避免因过度消除导致目标特征也被填充[7]。本文采用OpenCV 库中的RemoveSmallRegion 算法,小孔洞填充后的二值化图像如图3 所示。相比图2,图3 的人体边缘轮廓更加清晰,且具有较好的连续性,人体内部的小孔洞也减少了很多,右腿的异物轮廓也更加清晰明了。

Fig.1 Acquisition of the original image图1 采集原始图像

Fig.2 Binarization processing effect图2 二值化处理效果

形态学处理还包括腐蚀、膨胀等算法[10-12],通过合理运用形态学处理算法,可进一步提高图像质量。经过二值化、小孔洞填充后,虽然人体边缘轮廓有了很大改善,但仍然存在背景噪声,人体边缘有明显毛刺,这些毛刺可能会在之后的人体边缘缺陷识别中被误认为特征点,从而影响识别准确性。开运算是指先腐蚀后膨胀,如公式(1)所示。

开运算算法具有消除灰度值较高的小区域,把连在一起的两区域分开的功能,对于较大物体,能够在基本不改变其面积的情况下平滑边界。闭运算是指先膨胀后腐蚀,如公式(2)所示。

闭运算算法能够填充物体内部的小空洞区域,连接相邻区域[10-16]。经膨胀算法处理后,可去除人体内部孔洞,如图4 所示。

Fig.3 Binarization treatment effect of small hole filling图3 小孔洞填充二值化处理效果

Fig.4 Processing effect of expansion algorithm图4 膨胀算法处理效果

但是人体异物膨胀后显得不清晰,背景噪声也被放大;反之,经过腐蚀算法处理后的图像如图5 所示,腐蚀处理可将人体异物边缘剥离出来,消除人体边缘的毛刺,使得边缘轮廓锐化。合理使用开闭运算及其使用次数可以有效改善图像质量,本文通过一次闭运算和开运算,极大地提高了图像质量,消除了毛刺和背景噪声,突出了目标特征,如图6 所示。

Fig.5 Corrosion algorithm processing effect图5 腐蚀算法处理效果

Fig.6 Image effect after closing operation图6 闭开运算后图像效果

2 人体边缘缺陷识别

2.1 人体边缘角点检测

人体边缘轮廓的缺陷识别可采用边缘轮廓角点检测方法实现[17-19],物体在人体边缘,经过图像扫描呈现出物体角点与人体边缘轮廓重叠,因此根据预先设定好的符合物体直径的阈值,检测出符合物体直径的两个角点,再对两个角点进行连线,即可完成对人体边缘缺陷的识别。为了检测到符合阈值设定的物体两个角点,需要遍历人体边缘轮廓上的所有角点,记录每个角点的像素信息。检测角点前要先扫描出人体边缘轮廓,使得人体边缘轮廓的角点特征突出。一幅图像上有很多像素,每个像素都有自己明确的位置,即像素坐标。经过二值化处理后的图像,每个像素色彩值只有0 和255,因此呈现出黑白交替的效果。当图像在各个方向上有明显的灰度变化时,该处即为角点。角点检测即利用一个固定尺寸的区域窗口模型在图像上进行滑动扫描,比较滑动扫描前后灰度值的梯度变化,若在该点处梯度变化较大,则认为在该点处存在角点。当一个窗口在图像各个方向上移动时,如图7 所示,窗口在任意方向上没有灰度变化,则认为该区域平滑,不存在角点;当窗口移动到边缘轮廓上时,如图8 所示,其中边缘方向不存在灰度变化,则认为此处为边缘轮廓;当窗口移动到边缘轮廓角点上时,窗口各个方向存在较大的灰度值变化,则确定该点为角点[20],如图9 所示。

当窗口发生[u,v]移动时,滑动前后产生的灰度变化为E(u,v),如式(3)所示。

其中,[u,v]是窗口w 的偏移量,代表窗口移动距离,(x,y)是窗口w 对应的像素坐标位置,I(x,y)是像素坐标(x,y)的灰度值。通过对4 个方向进行加权求和确定灰度变化大小,根据设定的阈值进一步确定角点。在角点检测前,还要先对图像进行平滑处理,因为经过闭开运算后,图像边缘轮廓更加清晰,同时也使非物体边缘的特征角点突出。经过一次平滑处理后,使得极小的角点被平滑掉,减少了特征角点,为筛选物体角点减小了干扰项。平滑一次后的图像效果如图10 所示。

Fig.7 Smooth area图7 平滑区域

Fig.8 Edge area图8 边缘区域

Fig.9 Corner area图9 角点区域

使用C++语言创建vector<Point2f>corners 二维数组,用来保存边缘轮廓上的角点精确坐标。通过角点检测算法将检测的角点信息存储在二维数组中,利用circle 语句将检测到的角点全部标注在人体轮廓上,如图11 所示,角点坐标信息如图12 所示。通过遍历人体轮廓,检测到特征突出的角点个数为73 个,其中包含物体G 的角点信息。

Fig.10 Image effect after smoothing once图10 平滑一次后图像效果

Fig.11 Corner annotation图11 角点标注

Fig.12 Corner coordinate information图12 角点坐标信息

2.2 实验结果

提取边缘轮廓所有角点坐标,为了在众多角点中定位到物体G 边缘的两个特征角点并将其连线,绘制完整的人体轮廓,本文采用迭代方法。分别定义两个变量p、q 代表任意两个角点坐标,p=(corners[i].x,corners[i].y),q=(corners[j].x,corners[j].y)。坐标corners[i].()表示第i个角点坐标为(x,y),同理,corners[j].()表示第j个角点坐标为(x,y)。一个物体两个角点的直线距离是固定的,因此两直线之间距离的平方和为D2=p2+q2。通过循环嵌套语句遍历每一个角点坐标,将第一个角点坐标设为起始坐标,即p=(corners[1].x,corners[1].y),i=1,以此类推:(x1,y1),(x2,y2),(x3,y3)…(xi-2,yi-2),(xi-1,yi-1),(xi,yi)。此时第一个角点坐标将在循环语句中依次与第二个角点坐标、第三个角点坐标……第j个角点坐标进行距离平方和Dij2的计算,这里的j将从第二个角点坐标开始计数,如式(4)所示。遍历人体边缘轮廓所有角点,根据推导公式计算任意两个角点的直线距离平方和D2,分别见式(5)-式(7)。

对物体G 两个角点的直线距离平方和D2设定合适的阈值范围,符合该阈值的角点坐标则被保留下来,即物体G的两个特征角点坐标。利用line 语句对保留的两个角点坐标进行线连接,如图13 所示。本次实验共采集了115张图片用于算法验证,实验结果表明,该算法对115 张图片的误判率在2.2% 以下,并能去除99% 以上的图片背景噪声,说明该算法应用于物体边缘缺陷识别是完全可行的。

Fig.13 The connection effect of characteristic corner points meeting the threshold图13 满足阈值的特征角点连线效果

3 结语

本文提出一种基于OpenCV 与C++的物体图像边缘缺陷识别算法。首先对原始扫描图像进行二值化、小孔洞填充,并进行初步降噪,填充了人体内部的极小孔洞,消除了对人体异物检测的干扰。经过二值化处理后,人体边缘轮廓更加清晰,边缘轮廓的连续性得到改善,异物边缘轮廓更加突出。通过的先膨胀腐蚀、后腐蚀膨胀的两次形态学处理,消除了二值图像的边缘毛刺以及人体内部和背景噪点,使人体边缘轮廓更具有连续性,突出了目标特征。经过形态学处理后,虽然边缘轮廓更加清晰明了,但也使物体G 以外的边缘特征角点突出,通过平滑处理可使极小的角点被平滑掉,减少了特征角点,为筛选物体G 的角点减少了干扰项。之后遍历边缘轮廓所有角点,记录并保存角点坐标。最后迭代计算所有角点之间的距离平方和,根据设置好的阈值进行物体G 的角点筛选,并对其进行连线,绘制完整的人体轮廓。

本文通过对物体图像边缘缺陷的研究,得出了当物体图像边缘存在缺陷时的特征规律。由于缺陷的存在,该点处灰度值产生了很大的梯度变化,所以对边缘轮廓角点检测的研究,对于未来物体图像边缘缺陷识别与轮廓拟合等相关研究具有重要意义。

猜你喜欢
角点轮廓灰度
采用改进导重法的拓扑结构灰度单元过滤技术
基于灰度拉伸的图像水位识别方法研究
OPENCV轮廓识别研究与实践
基于实时轮廓误差估算的数控系统轮廓控制
基于最大加权投影求解的彩色图像灰度化对比度保留算法
基于边缘的角点分类和描述算法
基于灰度线性建模的亚像素图像抖动量计算
基于圆环模板的改进Harris角点检测算法
在线学习机制下的Snake轮廓跟踪
基于Harris角点和质量评价的图像篡改检测