图像识别,这个领域放在我们测试界内,其实应用无非以下几个地方:
1. 验证码识别
2. ui自动化的断言和执行过程
3. 人工智能通过图像控制方法
不过第三种ai技术我们可能绝大部分测试者暂时接触不到,第一个验证码识别我们接触的也不多。
应用最多的就是第二种,ui自动化中。比如我们常见的airtest。
当然,我们本文不讨论airtest是怎么进行图像相似比对的,毕竟其实很多测开同学都自己在实际自动化测试中,写过图片相似度的算法,毕竟测开面临的需求总是各种各样的,难免会碰到需要在图片上下手的需求。
其实,一张图片上,我们要做的通常无非就是要找到目标物而已,比如一个按钮,一串文案,或者识别出某个物体。
这就要从图片的本质上下手,图片是什么?其实就是密集的纯色小色块组成的,一个小色块就是俗称的一个像素。
一个小像素的颜色和坐标,就是它的全部,坐标我们通过x和y轴很好计算,颜色呢?颜色其实无非就是RGB三个数组成而已。
比如(255,255,255)就是白色...
RGB就是red,green,blue 的简写,红绿蓝,理论上,用他们三元色进行不同比例混合,可以兑出所有颜色。所以任何颜色都可以分解成 RGB三个值。
那么我们要一下确认这么大范围的一张图片上是否存在某个小按钮,要具体怎么操作呢?
当然要进行切割滑块处理,按仿生学来说,就是相当于你的眼睛视角,在一张大图上找到自己要的那个小按钮,应该是一块区域 一块区域,平滑的移动,搜索全图,直到找到要的按钮。这个区域,就是我们的滑块,不断的按某个顺序进行搜索。这样可以大幅减轻我们的算法压力,每次只判断小部分框内的像素点即可。
那么我们行业内通用的图片处理各种算法上来说,这个滑块并不是杂乱无章的移动顺序,而是固定的从左到右,从上到下,
也就是从左上角查到右下角。
-> -> -> ->
-> -> -> ->
所以,到现在为止,你的图像算法的第一步就算完成了。
也就是:给图片进行切割
然后说说,怎么来判断是否搜索正确结果:
毕竟图像受到的影响太多了,不可能rgb值都非常精准,比如光线明暗,分辨率,画质等等影响。所以大多数情况下,都会存在一个误差,只要误差在合理范围内,即可算是找到目标物。
一旦找到目标物,你是拿来点击,还是拿来断言 都随你。
但是这个误差要怎么具体的求出来呢?比如俩个很相似的小方块内,都存在很像目标物的情况,所以大佬们想了很久,决定用一些标准来判定,哪个更像,谁的可能性更高。
比如:
查准率,查全率,F1分数等,通俗来说,就是查找到的正确目标物的情况占总体尝试次数的比例或者说概率。
大家也不用太仔细深究这几个标准概念的具体什么含义,只知道他们存在且在行业内很流行即可。不然你和别人开会撕x的时候,人家问你:凭什么这么写,根据在哪,你不知道说啥。
抽象一点的牛x公司,会用这些比例的点,来绘制一条曲线图,曲线图下面的面积就是正相关的面积,越大说明算法越秀...当然,我们暂时还不用考虑那么多。
到此,你就知道了,如何去判断一个分割的小块内是否存在目标物的基本判断思路了。
接下来 要细细说一下,要怎么确定那些所谓的 正相关,负相关,真正目标等细节。
技巧 一:灰度
比如为了降低各种影响,你可以简化五颜六色的图片,不用一个像素一个像素的RGB颜色去解析。用一个更简单的办法:用灰度。
用过photoshop的人应该都知道,一张图除了颜色之外,还有灰度这个属性,比较类似于把图片变成纯黑白的样子,这样你的算法解析会大大减轻压力,而如何拿到一个像素的灰度,这种问题python的第三方库早都有多个现成的库让你调用了。
技巧 二:其他特征
比如边缘特征,目标物的边缘是不是纯黑色的线条勾勒等等。还有其他很多,比如梯度特征,梯度统计直方图等。而且这些对比算法,一般都有自己的规定,比如平方差,标准平方差 ,他们越小越好。相关匹配度,标准相关匹配度他们越大越好等。虽然我们现在还听不懂这些概念,但是起码知道有这个东西,等真正去做的时候现查即可。
技巧 三:特征点
放弃找到目标物的整个外形,而是专注于某个特殊的点,只要这个特殊的点找到,即代表目标物被找到。
一般特征点可能不是一个点,而是一个点带着周围的一小块区域。这块区域的灰度平方差啊等等如果结果好,就代表找到了。
反正特征点最好是那种独一无二的,比如某个按钮的颜色是红色,全页面就它带红色,所以你就找这小块红色区域即可。
比如下图的嘴唇~显然通过外形或灰度都不好判断,反而是红色一目了然。
对这个红唇是不是很感兴趣?所以特征点也被人叫做兴趣点,关键点。
好了,今天就说到这了,饭佬催着交稿了。