基于模板匹配的螺母检测(计算机视觉实验)


更新日期:2021/6/26


前言

模板匹配是将模板图像与目标图像中每一处做比较,得出一个相似度(或距离)值,如果模板图与目标图像的某一位置的相似度较高,则该位置可能是目标位置。

本次实验给出几张图片,图片中有大小、角度等不同的多个螺母,要求从图片中检测出这些螺母(详细实验内容及要求请见下文)。

由于某些图片存在较大噪声干扰,实验中基于传统的模板匹配方法,尝试过各种手段,有些螺母始终不能很好地响应出亮点,仅两张图片中的螺母能在不出错的情况下完全检测出。要想实现更佳的效果,可以尝试使用机器学习的方法。


提示:博主正在学习《计算机视觉》(本科)课程,此博文原为本人实验课程技术报告,经整理后发布,欢迎大家相互交流学习。本人才疏学浅,如果有不到位的地方,欢迎大家提出意见和建议。
文章除特别注明处外,均为博主原创,转载请附原文出处。以下是本文正文内容。

实验任务与要求

图像01~05.jpg中是几个螺母的照片,请设计并实现一个方法,正确地检测出其中的螺母,注意:有一个是圆形的不要检测,只检测六边形螺母。可以从其中一幅图像中截取模板。

01.jpg-05.jpg:
(实验材料图片为课程老师原创,已得到同意发布,请勿盗用)

1 实验情况概述:

实验过程中,曾尝试过模板匹配、边缘匹配、高斯滤波处理、双边滤波处理等各种方法,均没有取得良好的效果:“03.jpg”中的三个螺母和“04.jpg”中的一个螺母在响应图中,亮点不够明显,不能很好地检测出;在“05.jpg”中,只有1个螺母能被成功响应。只有在“01.jpg”“02.jpg”两张图像上,经过不断地调整,得到了完全正确的识别结果。

2 算法流程

最终算法的流程如下:

第一步:模板库建立①截取模板。在“01.jpg”中找出有代表性的螺母,截取作为模板;②模板旋转。每个模板以步长13°旋转,旋转到60°的位置。旋转到60°是因为螺母是中心对称图形,每旋转30°就和原图相同。实际上,由于螺母上的锈纹等原因,螺母最好旋转360°,但这样会大大增多模板数量,降低检测速度,故不采用。旋转得到的模板分别建立图像金字塔,分别得到大小不同的模板。经过以上三个步骤,得到了每个原始模板不同朝向、不同大小的模板,用于下一步检测。实验中截取的原始模板图有6个,如图1所示:

图1 截取的原始模板

第二步:待检测图像预处理。载入待检测图像,将其进行高斯模糊预处理,目的是去除图像的噪声。

第三步:模板匹配。将第一步得到的模板库中每个模板分别与图像进行匹配,得到最大响应图。

第四步:找出螺母位置①响应图高斯模糊预处理。此步骤的目的是消除由于匹配时噪声引起的响应图中的小亮点。比如,圆形零件位置处会产生小而亮的点,使用高斯模糊可以减弱其亮度。而六边形螺母位置的亮点一般较大,受高斯模糊影响较小;②阈值处理。相应最大值乘以特定的系数,得到阈值亮度,对响应图进行阈值;③获得每一个连通分量的质心位置,得到每个点的坐标,即为检测结果。

3 实验结果与分析

对每个图像分别进行实验。

需要调整的参数主要是阈值系数(最大响应要乘的数)和响应图预处理的高斯滤波核大小。其中,阈值系数每个图像各不相同,高斯滤波核大小除“02.jpg”外均设置为15*15,“02.jpg”设置为15*15,“02.jpg”设置为35*35。在调整参数的过程中,首先确保的是正确性,在不出错的基础上再尽量识别更多的螺母。

以下为5张图像的检测结果和对结果的分析。

3.1 “01.jpg”和“02.jpg”检测结果

“01.jpg”“02.jpg”两张图像上,经过不断地调整,得到了完全正确的识别结果。其中,“01.jpg”识别良好,是因为模板都是从这张图像上截取的;在“02.jpg”,采用了35*35的滤波核对响应图进行滤波,而不是其它图像的15*15,原因是能更好地消除圆形零件小而亮的响应点,而15*15不能做到。

“01.jpg”“02.jpg”两张图像的识别结果分别如图2和图3所示,左为识别结果,右为对应模糊处理过的响应图:

图2 01.jpg识别结果和15*15高斯滤波后的响应图
图3 02.jpg识别结果和35*35高斯滤波后的响应图

3.2 “03.jpg”和“04.jpg”检测结果

“03.jpg”中的三个螺母和“04.jpg”中的一个螺母不能良好的检测出。原因是响应图中的亮点不够明显,如果阈值设置太低,又会使圆形零件被错误识别。“03.jpg”“04.jpg”两张图像的识别结果分别如图4和图5所示,左为识别结果,右为对应模糊处理过的响应图:

图4 03.jpg识别结果和15*15高斯滤波后的响应图
图5 04.jpg识别结果和15*15高斯滤波后的响应图

3.3 “05.jpg”检测结果

“05.jpg”识别结果最差,原因在于背景图像部分的匹配结果差。在模板中,除了有模板部分,在四角和中心还有一部分的背景。在“05.jpg”中,由于背景相较前几张图像变化较大,故模板在螺母位置不能很好地匹配,响应很弱。“05.jpg”的识别结果如图6所示,左为识别结果,右为对应模糊处理过的响应图:

图6 05.jpg识别结果和15*15高斯滤波后的响应图

针对“05.jpg”的问题,一个可能的解决思路是:对opencv模板匹配函数进行改进,改进方案为:可以指定一张和待匹配图像同尺寸的二值图像,用于表示哪些像素参与匹配,哪些像素不参与匹配。这样,就可以在匹配时略去背景图像部分,仅螺母的部分参与匹配。

3.4 其它问题

问题1:实验中建立的模板库中的模板多达120个,检测效率低下,通常要等待5秒到10秒才得出检测结果;

问题2:不同的图像需要不同的阈值和响应图高斯滤波核大小设置,无法做到自适应。

猜你喜欢

转载自blog.csdn.net/u010393510/article/details/117737782