ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 蓝天630902

[分享] 验证码识别讲座

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-8-9 20:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:图像处理和GDI
参与学习中。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-10 16:12 | 显示全部楼层
cumulonimbus 发表于 2012-8-8 22:03
这段话我看了三遍,还是弄不懂
        For i = 1 To a2 * a3
            arr(i) = 1

7楼有详细说明,


TA的精华主题

TA的得分主题

发表于 2012-8-11 20:17 | 显示全部楼层
本帖最后由 cumulonimbus 于 2012-8-11 20:21 编辑
蓝天630902 发表于 2012-8-8 20:04
其实这个应该是非常简单的事,就是数组里面的数相加:
1、如果是有调色板,就从第bfOffBits字节(其实是第 ...


不好意思又来向您请教,希望得到你的答疑解惑,谢谢。
第一、“调色板实际上是一个数组,共有biClrUsed 个元素,biClrUsed =00 00 01 00=1024。同样得出1024。”,经我用计算器计算,16进制的00 00 01 00=256,而不是1024。
第二、“再比如说1919字节,是图片第1919-1078+1=842个点,位于从下往上数14=13+1行,从从左往右数第10个点,怎么知道是这样呢?因为图像的宽度是63,不是4的倍数,所以每行是64个点,842-13×64=10。它的字节值是2C,2C就是44,就是第44个RGBQUAD ,它的位置=44×4+54=230,就是说:从下往上数14行,从从左往右数第10个点的调色板位置在230字节~233字节共4字节。B=153、G=0、R=0、rgbReserved=0。ts=(153+0+0)/3=51”,通过运行你的程序,发现1919字节,它的字节值是FF,而不是2C,FF就是255,就是255个RGBQUAD,它的位置=255×4+54=1074,
第三、根据你的算法,可以算出无数个ts值,那么
  For i = 1 To a2 * a3
            arr(i) = 1
            ts = 0
            For j = 0 To a5 - 1
                ts = ts + Val(bytClipData((i - 1) * a5 + a1 + j))
            Next j
            ts = ts / a5
            If ts > 200 Then
                arr(i) = ""
            End If
        Next i
这段中ts > 200 ,这个200数字是如何得出来的?究竟这个“200”应该取哪个点的ts值呢?谢谢
同时我上传了附件如下:




桌面.rar

66.2 KB, 下载次数: 34

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-11 21:19 | 显示全部楼层
本帖最后由 蓝天630902 于 2012-8-11 21:42 编辑
cumulonimbus 发表于 2012-8-11 20:17
不好意思又来向您请教,希望得到你的答疑解惑,谢谢。
第一、“调色板实际上是一个数组,共有biClrUse ...


第一、调色板实际上是一个数组,共有biClrUsed 个元素,biClrUsed =00 00 01 00=1024。同样得出1024。
我说的这句话肯定是错了,应该这样子说:“第一、调色板实际上是一个数组,共有biClrUsed 个元素,biClrUsed =00 00 01 00=256。因为每个biClrUsed 占4个字节,所以256×4=1024字节,同样得出1024。”

对于:“第二、再比如说1919字节……”你说:”它的字节值是FF,而不是2C“。
你说得不错,因为你取得的图片和我取得的图片不是同一张,有差别那是肯定的

对于:”第三、根据你的算法,可以算出无数个ts值“。
应该算不出无数个ts值,比如说你上面的附件里面的ValidateCode.bmp,就只有256个ts。
这个200数字是如何得出来的?究竟这个“200”应该取哪个点的ts值呢?
你理解错了,不是“应该取哪个点的ts值”
而是用某个Y值(比如说200)把ts分成两部分,一部分ts大于Y,一部分ts小于Y,
然后留下一部分,丢掉一部分。用术语讲就是“二值化”,留下的部分就让arr(i) = 1,丢掉的部分就让arr(i) = “”
对于If ts > 200 Then 这一句也要理解成:对于不同的问题,也可以写成If ts <= 150 Then
只要这200或者150能够达到“二值化”的效果就可以。这里恐怕要试几次。如果你会操作“photoshop”、“crodraw”什么的那就不必试了,打开来看一看就知道了。这就是对“究竟这个‘200’应该取哪个点的ts值呢?”的回答。

对于:
For j = 0 To a5 - 1
      ts = ts + Val(bytClipData((i - 1) * a5 + a1 + j))
Next j
就是相当于说ts=(B+G+R)/3
这个ts是需要灵活运用的:
有时候不用均值而用单一值反而更有效,这时候就只能用单一的ts=R,或者单一的ts=G,或者单一的ts=B;
有时候用两个值更有效,这时候就只能用ts=(R+G)/2,或者ts=(B+G)/2,或者ts=(R+B)/2。
计算ts的目的就是为了把ts分离。得想尽一切办法把ts分成“政府军”和“反对派”。


点评

你应该给出来一个二值化的自适应算法,不能靠PS和CorelDraw  发表于 2012-8-11 21:41

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-11 22:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liucqa  你应该给出来一个二值化的自适应算法,不能靠PS和CorelDraw  发表于 2012-8-11 21:41

呵呵,变头像啦?
试几次就可以了,不必靠“photoshop”、“crodraw”。

“你应该给出来一个二值化的自适应算法”
这样子的算法,网上搜一搜,应该可以找到。移植到VBA就可以了。

TA的精华主题

TA的得分主题

发表于 2012-8-12 08:16 | 显示全部楼层
cumulonimbus 发表于 2012-8-11 20:17
不好意思又来向您请教,希望得到你的答疑解惑,谢谢。
第一、“调色板实际上是一个数组,共有biClrUse ...

大师对我的评价让我无地自容。谢谢

TA的精华主题

TA的得分主题

发表于 2012-8-12 10:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 cumulonimbus 于 2012-8-12 12:29 编辑

你的验证码识别的1-3代码如下:
        a1 = bytClipData(0)    '第0~3个字节,表示位图信息头大小
        a2 = bytClipData(4)    '第4~7个字节,表示图像宽
        a3 = bytClipData(8)    '第8~12个字节,表示图像高
        a4 = bytClipData(22) * 16 ^ 3 + bytClipData(21) * 16 ^ 2 + bytClipData(20)   
        a5 = a4 / a2 / a3
        If a5 <> Int(a5) Then    '判断有没有调色板,因为读不到图片的文件头,所以用a5是否为整数来判断。
            a1 = lClipSize - a2 * a3    '如果有调色板,就从倒数a2 * a3开始     
            a5 = 1    '并且一个字节表示一个点
        End If
而到了验证码识别4代码如下:
        a1 = bytClipData(0)    '第0~3个字节,表示位图信息头大小
        a2 = bytClipData(4)    '第4~7个字节,表示图像宽
        a3 = bytClipData(8)    '第8~12个字节,表示图像高
        a4 = bytClipData(22) * 16 ^ 3 + bytClipData(21) * 16 ^ 2 + bytClipData(20)   
        a5 = a4 / a2 / a3
        If a5 < 3 Then   '判断有没有调色板,因为读不到图片的文件头,所以用a5是否为整数来判断。
            a1 = lClipSize - a2 * a3    '如果有调色板,就从倒数a2 * a3开始
            a5 = 1    '并且一个字节表示一个点
        Else
            a5 = Int(a5)
        End If
一个是用a5是否是整数来判断有没有调色板,一个是用a5是否小于3来判断有没有调色板。这两个判断法你是根据什么道理来判断有无调色板?调色板不是4个字节吗?按常理应该根据是否等于4来判断有无调色板?谢谢指教

TA的精华主题

TA的得分主题

发表于 2012-8-12 15:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 cumulonimbus 于 2012-8-12 15:09 编辑

我把你的“图形文件 位图信息头 详细解释”改了一下,然后与验证码判断的代码相结合,代码更合理。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-8-12 20:49 | 显示全部楼层
cumulonimbus 发表于 2012-8-12 15:07
我把你的“图形文件 位图信息头 详细解释”改了一下,然后与验证码判断的代码相结合,代码更合理。

恭喜




TA的精华主题

TA的得分主题

发表于 2012-8-12 21:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
蓝天630902 发表于 2012-8-8 08:36
因为只是考虑获得结果,没有考虑效率,慢是很自然的。
下面这个恐怕要快30倍,要是再优化一下恐怕还要快 ...

关于汉字识别有两个问题想请教你,谢谢
第一、你的汉字识别中这么多汉字、英文与数字是如何弄出来的。
陋        d346 a294845a2
醯        c676c276887883
鼷        c6386a16776673
瞅        c44c33c4549332
瞬        c44c2766465b53
眺        c44c243b  d335
眩        c44c 365654451
瞻        c44b393a777932
瞪        c44b3488486932
睚        c44b1b355c5562
颐        c279471a3483b2
醴        b777a178b7b871
酴        b5849c345b3442
眯        b44b2352e24422
是从图中弄出来的吗?还是用什么方法快速弄出来的?
第二、其中有一句代码是算行高的,“c = Int((a(3) + 17) / 18)”,这里a(3)是指 biHeight,那么17、18是如何弄出来的,通过什么计算方法得到17、18这个数据?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-5 02:47 , Processed in 0.059257 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表