【RF】验证码的分析与识别[1]
93°2009/02/11软件综合 IP:广东
本人在科创发表的最后一系列文章

自从网络被应用,验证码也应运而生。验证码一般是由字母+数字+随机干扰组成的一幅图片。
人们在WEB或其他地方执行一些如注册、发表文章等操作时,往往要输入验证码,这是为了防止恶意行为。

本文章仅探讨验证码的识别作学习用途

前景与背景的分离方法

58_1_1264512711.png

这是一幅验证码,我们可以观察到,背景十分杂乱,而且有干扰线。
这是为了防止程序去识别它,但是 “凭着RF工作室的智慧” 可以说是轻而易举的

我们还可以观察到,背景与前景的颜色深度不一样——对,这就是关键。
这也就是说,背景的RGB值加起来肯定比前景的要小,这就好办了,我们先创建一个函数

Public Function ColorRGB(ByVal Color As Long) As Long
If Color = -1 Then ColorRGB = 999: Exit Function
Const ByN As Integer = 256
Const ByN2 As Long = 65536
Dim A(2) As Byte
A(0) = (Color Mod ByN)
A(1) = ((Color Mod ByN2) \ ByN)
A(2) = (Color \ ByN2)

ColorRGB = (Color Mod ByN) + ((Color Mod ByN2) \ ByN) + (Color \ ByN2)
End Function

好,我们看到,输入的是VB的颜色值,输出则是该颜色值RGB的总和。

然后我们可以调用这个函数

XXXXXXXXXXXs
XXXXXXXXXXXs
Dim l As Long
For i = 1 To 140 * 15 Step 15
    For j = 1 To 50 * 15 Step 15
    If ColorRGB(Picture1.Point(i, j)) < 560 Then
        l = l + 15
        XXXXXXXXXXXet (i, Picture2.Height - l)
        XXXXXXXXXXXet (i, j)
    End If
    Next
    l = 0
Next

我们看到,这个过程中有两个for循环,不断扫描图片,如果RGB值的总和小于560(180x3)就判断为前景。

这样,前景就被完美地分离出来了。

58_1_1139671021.png

前景与背景分离到此结束

干扰线的去除

但是,问题又来了。我们看到验证码中有随机的线段,这回严重影响验证码的识别工作
我们当然有办法应对。

注意观察两幅图片(线段的局部放大)

58_1_1302318119.png    58_1_1019096673.png

看到了吗?这是单像素的,我们也可以简单地解决掉。

我们再创建一个函数

Public Function ClearLine(ByVal iX As Long, ByVal iY As Long, picInput As PictureBox) As Boolean

Const W_VALUE As Long = 16777215

Dim tmp1, tmp2, tmp3, tmp4 As Long
Dim tmp As Long

If picInput.Point(iX, iY) = W_VALUE Then
    ClearLine = False
    Exit Function
End If

tmp1 = picInput.Point(iX + 15, iY)
tmp2 = picInput.Point(iX - 15, iY)
tmp3 = picInput.Point(iX, iY + 15)
tmp4 = picInput.Point(iX, iY - 15)

If tmp1 = W_VALUE Then tmp = tmp + 1
If tmp2 = W_VALUE Then tmp = tmp + 1
If tmp3 = W_VALUE Then tmp = tmp + 1
If tmp4 = W_VALUE Then tmp = tmp + 1

If tmp > 2 Then
    ClearLine = True
End If

If tmp3 = W_VALUE And tmp4 = W_VALUE Then
    ClearLine = True
End If

End Function

这段代码的作用是,扫描一个像素的上下左右,如果有3个点是白色的,就判断为线段的一部分。

然后我们调用它

Dim i, j As Long

For i = 1 To 140 * 15 Step 15
    For j = 1 To 50 * 15 Step 15

    If ClearLine(i, j, Picture3) Then
        XXXXXXXXXXXet (i, j), 16777215
    End If
    
    Next
Next


如图
58_1_1190603827.png

这样,干扰线也被完美地去除了。

未完待续
+1000  科创币    delete    2009/02/11
+1000  科创币    彼岸江山    2009/02/11 很好,谢老
+1000  科创币    chiataimakro    2009/02/11
+1000  科创币    虎哥    2009/02/11 思路不错。
来自:计算机科学 / 软件综合
35
 
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
93° 作者
16年0个月前 IP:未同步
74579
有没有搞错,这是我发过的最正经的帖子啊
+1
科创币
彼岸江山
2009-02-12
ding
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
16年0个月前 IP:未同步
74628
楼上正确

正在转向delphi中。客户要求

58_3212_1114129532.png
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
16年0个月前 IP:未同步
74639
参见旋转卡壳算法,迟一些我再介绍。

delphi的兼容性无敌啊。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
16年0个月前 IP:未同步
74992
唉唉 。。都没啥人看
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年10个月前 IP:未同步
88250
LS错误
在.NET里是没有point函数的,.NET里的point是一个类型,不会连这都不知道吧
.NET里用getpixel()
而delphi里用pixels[];
C/CPP我更偏向于直接读取BMP文件,因为BMP的结构直接就是RGB

PS 这个项目400块钱到手
+80
科创币
delete
2009-04-05
干什么
-80
科创币
chiataimakro
2009-04-05
个人所得税
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年10个月前 IP:未同步
88259
日飞破chia,pia!,您又不是ZF收个毛税啊……那天中午M记还是我用着400块请您吃的呢
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年10个月前 IP:未同步
88264
我啥时候说过不是VB,VB跟XXXXXT不是一种东西
VB的代码不能直接放到XXXXXT上运行
XXXXXT完全面向对象,所以不能像VB那样随便写
我用的是VB98开发的

PS:收钱的时候给的是delphi写的DLL
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年10个月前 IP:未同步
88268
我啥时候说过那400块钱全部用来吃MCD了?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年10个月前 IP:未同步
88269
引用第22楼phpskycn于2009-04-05 12:05发表的  :
要知道你开发出的东西有巨大危害……
都出现Dim……
AS……了,还不是VB?

是的,用小括号代替大括号的编译器危害更大
引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年10个月前 IP:未同步
88279
看来您连图形的基本算法都不懂吧
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年10个月前 IP:未同步
88293
引用第30楼phpskycn于2009-04-05 12:20发表的  :
的确,每次看到这个我都认没用又不会考,就忽略了。

为什么而学习?这是算法问题,经典算法存在就有它的价值
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
93°
学者 笔友
文章
651
回复
6032
学术分
30
2007/04/10注册,6年11个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}