如果我们通过截图函数获取整个区域的图片,然后就可以得到一个X宽Y长的颜色点阵,我们小学二年级就学过,
24位BMP图片如果以RGB模式打开,
每个颜色的表达式是颜色=(0-255,0-255,0-255)
如果有学过设计的童鞋就会知道,当R(红色分量)G(绿色分量)B(蓝色分量)光的三原色混合,得到该点的颜色成像,
如果三个值均为0(H000000)则为黑色,如果均为最大值255(HFFFFFF)则为纯白色,
如果三个值相同或者相近,则这个像素更偏向于灰色,且数字越小颜色越深
根据这个原则,精易模块可以取出每个点的颜色数据,也可以单独对某个像素点进行更改
我们可不可以做一个遍历,把所有RGB相近(在一定绝对值误差区间)、且颜色数值偏小的标注出来?
(为什么要区分大小呢?因为验证码的目标偏深灰色,有些值很大的颜色,即使分量接近,也不可能是需要的区域)
代码实现:
设像素的RGB三个值,任意两值的最大差值不超过[偏差=55]
设像素的RGB三个值, 每个值均不超过[最大值=96]
(以上的参数是这个网站图片比较适合的参数,通过测试得出)
则有以下代码:
效果:
到了这一步,能看到这里的大佬基本都理解了帖子的目的和意义,不过还有两个问题需要优化:
1.目标验证区域不会出现在X轴的左半边以及太靠上或者靠下的位置,这些区域可以通过判断代码屏蔽掉
2.有些区域个别像素和我们预设的条件相同,这种情况灰色调的图更为严重,我想到个简单的优化方法,那就是第一遍计算过后,所有符合条件的像素均被涂成红色时,我们可以紧接着进行第二次遍历,假设一个像素为纯红色,则判断他的前后5个像素距离的色块是否也为红色,如果前后只要有一个不是红色,我们就把这个点过滤掉。
最终结果展示:
代码在附件里,有兴趣的可以继续试试调整下参数或者做其他判断条件,
这个主要是用来算法思路学习,至于能不能用找色块或者找形状识别成功我并没有做测试。
希望抛砖引玉,有更好的思路或者算法也希望大佬们踊跃分享。
1.95 MB, 下载次数: 30, 下载积分: 精币 -2 枚
欢迎光临 精易论坛 (https://125.confly.eu.org/) | Powered by Discuz! X3.4 |