本人在科创发表的最后一系列文章
自从网络被应用,验证码也应运而生。验证码一般是由字母+数字+随机干扰组成的一幅图片。
人们在WEB或其他地方执行一些如注册、发表文章等操作时,往往要输入验证码,这是为了防止恶意行为。
本文章仅探讨验证码的识别作学习用途前景与背景的分离方法
这是一幅验证码,我们可以观察到,背景十分杂乱,而且有干扰线。
这是为了防止程序去识别它,但是 “凭着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的总和。
然后我们可以调用这个函数
XXXXXXXXXXXsXXXXXXXXXXXsDim 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)就判断为前景。
这样,前景就被完美地分离出来了。
前景与背景分离到此结束干扰线的去除但是,问题又来了。我们看到验证码中有随机的线段,这回严重影响验证码的识别工作
我们当然有办法应对。
注意观察两幅图片(线段的局部放大)
看到了吗?这是单像素的,我们也可以简单地解决掉。
我们再创建一个函数
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
如图
这样,干扰线也被完美地去除了。
未完待续
200字以内,仅用于支线交流,主线讨论请采用回复功能。