本帖最后由 wxyzyou 于 2019-7-25 17:50 编辑
这里只谈图像分析,不谈JS算法
最近分析某滑块验证图,发现该滑块可以通过简单算法找到位置
先上几组算法找到位置的图正确率在90%以上
下面讲分析心得
该滑块,有两张图,图片的大小,同一固定的
底图.jpg 320X160
滑块.png 60X158
滑块真实部分大小 55X55滑块真实部分的Y和底图中的位置Y是一致的,利用此机制,可以定位一个较小的识别特征范围
X 左边
X1 右边
Y 顶边
Y1 底边
H 高度
W 宽度
按该验证图的呈现方式,知道 底图的左边60宽是不会出现滑块的,因为该位置要放置 滑块.png 的图片
所以 X=60
因为算法的原因,底图.jpg的右边有12个像素点,是不会出现算法需要的特征的
所以 X1=W-12
通过对滑块.png 进行颜色填充处理,可以定位到 Y
通过Y+55获得 Y1 Y1=Y+55
这样拿到了 滑块在底图中的 Y和Y1
这样就定位了一个较小的识别范围
X=60
X1=W-12
Y=滑块顶部颜色定位
Y1=Y+55
在该范围内找我们想要的特征
特征利用,滑块凹陷偏白色,
进行二值化后,会有一个明显的滑块区域
使用特征两个
1.左黑+右白 两列颜色值,像素数量大于15个的时候,判断为 特征1
2.上黑+下白 两行颜色值,像素数量大于15个的时候,判断为 特征2
同时存在两种特征,并且X轴相距较近,准确度在95%
下面是几个关键代码区
|
底图绘制定位坐标 | 整数型 | | |
BMP | 类_位图操作 | | | | C_X | 整数型 | | | | C_Y | 整数型 | | | | C_X1 | 整数型 | | | | C_Y1 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | W | 整数型 | | | H | 整数型 | | | X | 整数型 | | | Y | 整数型 | | | RGB | 字节集 | | | Cont | 整数型 | | | i | 整数型 | | | n | 整数型 | | | OK | 逻辑型 | | | 高 | 整数型 | | 0 | 中 | 整数型 | | 0 | 低 | 整数型 | | 0 |
W = BMP. 取宽度 ()H = BMP. 取高度 () 计次循环首 (H, Y ) 处理事件 () 如果真 (Y ≥ C_Y 且 Y ≤ C_Y1 )  计次循环首 (W, X )   如果真 (X ≥ C_X 且 X ≤ C_X1 )    Cont = 多点找色特征1 (BMP, X, Y, C_X1, C_Y1 )    如果真 (Cont > 14 )    加入成员 (中, X )     计次循环首 (Cont, i )      如果真 (Y + i > C_Y1 )       跳出循环 ()     BMP.置某点颜色 (X, Y + i, #红色 )     计次循环尾 ()     计次循环首 (30, n )      如果真 (Y + n > C_Y + 5 )      跳出循环 ()     Cont = 多点找色特征2 (BMP, X, Y + n, C_X1, C_Y1)      如果 (Cont > 14 )      加入成员 (高, X )       计次循环首 (Cont, i )        如果真 (X + i > C_X1 )         跳出循环 ()                 BMP. 置某点颜色 (X + i, Y + n, #红色 )       计次循环尾 ()                                 计次循环尾 ()         如果真 (Y < C_Y + 6 )     Cont = 多点找色特征2 (BMP, X, Y, C_X1, C_Y1 )     如果 (Cont > 14 )     加入成员 (低, X )      计次循环首 (Cont, i )       如果真 (X + i > C_X1 )        跳出循环 ()      BMP.置某点颜色 (X + i, Y, #蓝色 )      计次循环尾 ()                             计次循环尾 ()  计次循环尾 () 如果真 (取数组成员数 (高 ) > 0 ) 调试输出 (“返回高精度X”, 高 [1 ]) 返回 (高 [1 ]) 计次循环首 (取数组成员数 (中 ), i ) 计次循环首 (取数组成员数 (低 ), n )  如果真 (取绝对值 (中 [i ] - 低 [i ]) < 5 )  调试输出 (“返回模糊匹配的X”, 中 [i ])  返回 (中 [i ])    计次循环尾 () 计次循环尾 () 如果真 (取数组成员数 (中 ) > 0 ) 如果真 (取数组成员数 (低 ) > 0 ) 调试输出 (“返回模糊匹配的 低X ”, 低 [1 ] + 10 ) 返回 (低 [1 ] + 10 )   如果真 (取数组成员数 (中 ) > 0 ) 调试输出 (“返回中精度的X”, 中 [1 ]) 返回 (中 [1 ]) 如果真 (取数组成员数 (低 ) > 0 ) 调试输出 (“返回低精度的X”, 低 [1 ] + 10 ) 返回 (低 [1 ] + 10 ) 返回 (0)
下面是测试DEMO
该验证,首次使用大概率是点击就通过了
刷新使用的多了,才会出现滑块
点测试按钮,会一直刷新
使用到精易模块 7.3以上版本,请自行下载
使用到精易精易Web浏览器,自行下载安装 精易MiniBlink支持库
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14400721&highlight=mini
滑块算法分析.e
(889.79 KB, 下载次数: 1452)
|