图像识别中经常会遇到小图比大图的情况,何为“小图比大图”?就是事先截取sourceImg中的一小块图,然后试着在TargetImg中去找;在这个过程中实现所谓的“目标查找”,也就是图像断言。
自动化测试中经常会用到这种手段。下面,介绍一种“快速在大图中找到小图”的算法:TemplateMatching。
TEMPLATE MATCHING(模板匹配)
首先,这在里向OpenCV的研发团队致敬!N年前该公司便开发出了基于C#,Java和Python等语言的图像识别的API出来,快而且好用。后来很多应用程序皆发源于此。
那么何为“模板匹配”:Template matching[1]is a technique indigital image processingfor finding small parts of an image which match a template image. It can be used in manufacturing as a part of quality control,[2]a way to navigate a mobile robot,[3]or as a way to detect edges in images.[4].https://en.wikipedia.org/wiki/Template_matching.
上图是小编用过的最好的Template,下面看看效果:(可见,模板图已经在Target中被识别到了)
Target图样模板匹配失效怎么办
案例中的Template是一副无论你怎么转,始终都中心对称的图标,因此对TemplateMatching来说,有着极强的辨识度;如果遇到下面这种情况,TM就不准了(大家可以自行尝试)
1.直方图区分下面A|B图也是失效的;
图A和图B区分不开2.还有下面这种图TM也会遇到困难(事实上TM是给出了最佳近似解):
直方图分析则不会错3.这时候,一种解决方法就是将TM处理后的两幅图再读进来,进行一次比较。废话少说,上代码:
获取每个像素点的R、G、B值这是一种笨且精确的办法,先将两张“小图”分别读进内存,然后逐点进行比较;遇见相同的就+1,直到算完最后一个点。最后再整体算相似百分比;注意:任何两张“看似”相同的图像,都有可能存在细微差异(有时候就几个像素的差值),因此不必追求相似度达到100%。此处应设置阈值,做最后的判定。
结果600多ms的计算时间的确值得改进,留到以后做进一步优化吧。最后,奉上一副像素值化图帮助大家理解什么是图像的像素矩阵:
网友评论