前言:
1.为了防止杠精,提前声明此帖意义在于探讨某些颜色算法的可行性,并非是为了一定应用在滑块过验证。
2.只使用了精易模块的位图操作类,模块自备。
3.本帖偏向于颜色底层的算法逻辑,默认观看此帖的均为新手,所以有些部分过于冗长敬请见谅。
4.本源码成品并未实现滑块验证的最终通过成品,仅供学习参考,切勿用作非法用途。
5.算法若有雷同纯属巧合,暂时大胆为此起名ZXL算法。
思路解析:
网上有很多模拟图色滑块的类似实现原理(单指非AI模型的图色),多数思路是通过寻找或判断滑块目标的边界线,有些边界线是个固定颜色的描边,所以可以通过找色或者找图来定位,单多数的滑块阴影是半透明的,边缘十分模糊,应该不是代码实时生成,而是提前存储的背景图,这类背景图的边缘随着图片颜色的变化会有改变,难以通过简单找色实现。
如果我们通过截图函数获取整个区域的图片,然后就可以得到一个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个像素距离的色块是否也为红色,如果前后只要有一个不是红色,我们就把这个点过滤掉。
没有回复内容