0

    [按键精灵]提供这个验证图片的一个本地识别思路

    2023.05.30 | admin | 202次围观

    大家好,我是公众号3分钟学堂的郭立员,如果你喜欢我的文章,欢迎进入我主页查看更多内容~

    前言

    不知道大家有没有看过我之前写的图色命令原理的两篇文章,那里面我讲到找图的实现过程以及相似度的计算方法,我通过举例说了一下可能对相似度的误区:

    比如使用找图命令找一张10*10的图片,通过计算我们知道这张图有100个像素点,如果在找图命令中设置0.9的相似度,也就是90%相似。

    误区:这100个像素点,只要有90个以上的像素点一样,找图命令就能找到这张图的坐标

    正确:相似度是针对每一个像素点的颜色值,也就是颜色值在10%的误差范围,就是符合要求的颜色值,当然有一点需要注意必须是100个像素点都是在误差范围内,只要有1个点不满足,找图命令都无法找到图。

    关于这点其实找图命令还是挺严苛的本地图片查看器,这也是为啥我们总会觉得明明图片没啥变化,为啥找不到的原因,对于人眼来说更换1个像素或者几个像素的颜色值,会自动脑补认为是一样的。

    这次我想重构一个“相似度”,能够满足90%就是100个像素点有90个一样的。

    一、实际应用

    这几天有人在问这个验证码图怎么识别,如下图所示:

    这个图主要完成的验证是在下面3个道具中找到和右上角那个图一样的道具,如果下面3个道具图上没有随机划线,完全可以用找图命令确定位置坐标,但是有了随机线的干扰,找图命令就失效了。

    这个图虽然加了干扰线,对于道具来说除了干扰线以外的部分其实是一样的,也就是图片部分相同,那么我们重构相似度如果可以的话,就能找到部分像素点相同的图片。

    二、重构相似度的思路

    依然沿用找图命令原理,先单点定位,再逐个像素点匹配

    ①获取右上角图的所有像素点的颜色值,并把颜色值存入一个二维数组,方便之后颜色匹配。

    为了提高运算速度,截图不能太大

    ②获取上一步截图的第一个像素点的颜色值,然后遍历下面的3个道具所在范围,找到所有和第一个像素点的颜色值相同(相近)的点的坐标。

    ③上一步获取的坐标可能会有多个,每一个坐标都有可能是我们想要的坐标值,所以需要逐个比对,比对方法是以获得的坐标作为起始点,比对我们要找截图的大小范围的颜色点,也就是我们第一步中存下来的所有颜色值。

    如果没有干扰线,理论上应该是会有100%一样的坐标,但是现在只能是部分像素点颜色值一样。

    上图是放大像素点的示意图,左侧是正常图片,右侧是有干扰线的图片,通过遍历每一个像素点的颜色值对比两张图,除干扰线以外的像素点颜色值是相同(相近),我们记录一下相同颜色值像素点的数量,如果数量较大,就认为它们可能是同一张图。

    这里也可以算个比例:相同颜色像素数/总的像素数=相似度比例

    三、代码运行结果

    可以看到这个输出结果:

    当前脚本第33行:38 288 560

    38代表相同颜色的像素数

    288,560是它对应的坐标值

    这里选择38是因为它比别的数字都大很多,也就是图片更加接近。

    然后通过抓抓验证图片上的坐标,可以确认(288,560)这个坐标是在靴子道具上本地图片查看器,是我们想要的坐标值。

    四、可能存在的Bug

    当我们定位像素(第一个像素点)正好被干扰线覆盖掉,那么下方整个区域都可能找不到和定位像素相同的颜色值,从而无法进行后续的比对像素操作。

    解决方法:

    ①设置多个定位像素,比如截图的四个角点,当第一个像素找不到的情况,使用其他角点作为定位点。

    ②修改截图范围,重新截图,也就是换一张图,总会有不被干扰线覆盖的定位点。

    我觉得第二种方法更好一些,因为它还能解决另外一个问题:

    比如定位点像素的颜色值是和背景色一样的,那么在下方范围找定位点相同像素点会非常的多,这也增加了脚本运算的时间,如果通过换图的方法,可以在截图后,先判断第一个点是不是背景图的颜色值,如果相同就重新截图。

    =正文完=

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论