51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3122|回复: 3
打印 上一主题 下一主题

[原创] 借助开源OCR和图片处理工具做验证码识别

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2013-8-17 16:24:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wuxue107 于 2013-8-17 21:14 编辑

orc命令行工具:tesseract
图片处理命令行工具:nconvert(好东西)
可以做一些简单的验证码识别。但有时候颜色问题tesseract不能直接识别,就可以用nconvert做一些简单的处理。


用nconvert做下面处理:
色调分离 8
锐化 99
高斯模糊 3
颜色深度 2 无抖动
执行命令:nconvert -posterize 8 -sharpen 99 -gauss 3 -binary nodither 1.png 2.png

将转换为下面图片


再执行:tesseract -psm 6 2.png text
就可以得到需要的文字:BXAR

还有时候图片图片有些干扰的线条在里面,这时候就可以用到我之前提到过的WIA组件做一些处理了。
昨天用51的验证码试了下。


先用:nconvert -colors 16 66224.png 66224_1.png将图片降为16色,这样图片背景渐变色就分开了。
降颜色深度后:
再读取图片第一个行的颜色做背景色(去除,干扰线的颜色)
去完背景和干扰线条后:(其实处理后识别率也相当低约8~10%)
在用命令tesseract -psm 6 66224_1.png text
从text.txt文件里可看到要识别的文本。


vbs利用WIA组件写了段去背景色和线条的代码。

  1. Dim fso
  2. Set fso = WScript.CreateObject("Scripting.Filesystemobject")
  3. Set f=fso.GetFolder("D:\文件夹转移\desktop\d")

  4. For Each n In f.Files
  5.         clearX n.Path,n.Path & ".clear.png"
  6. next

  7. Sub clearX(sfile,ofile)
  8.         Dim pic
  9.         Set pic = CreateObject("WIA.ImageFile.1")
  10.         Set IP = CreateObject("WIA.ImageProcess")
  11.         
  12.         pic.LoadFile sfile
  13.         pw = pic.Width
  14.         ph = pic.Height
  15.         Set cl=pic.ARGBData
  16.         Dim bitarr()
  17.         ReDim bitarr(cl.Count)
  18.         

  19.         ''获取背景色
  20.         Set oDic = CreateObject("scripting.dictionary")
  21.         oDic.RemoveAll
  22.         For j=1 To pw
  23.                 If not odic.Exists(cl.Item(j)) Then
  24.                         odic.Add cl.Item(j),1
  25.                 Else
  26.                         odic.Item(cl.Item(j))=odic.Item(cl.Item(j))+1
  27.                 End if
  28.                 index=index+1
  29.         Next
  30.         
  31.         For Each n In odic.Keys
  32.                 '' 排除背景中的干扰线条色
  33.                 If odic.Item(n)/pw < 0.03 Then
  34.                         odic.Remove n
  35.                 End If
  36.         Next
  37.         
  38.         For i=1 To cl.Count
  39.                 bitarr(i) = cl.Item(i)
  40.         Next
  41.         
  42.         For index=pw+1 To pw * (ph - 1)
  43.                         If odic.Exists(bitarr(index)) Then
  44.                                 ''去背景色
  45.                                 cl.Item(index) = &HFFFFFF
  46.                         else
  47.                                 samecount = 0
  48.                                 If bitarr(index) = bitarr(index - 1 ) Then samecount = samecount + 1
  49.                                 If bitarr(index) = bitarr(index + 1 ) Then samecount = samecount + 1
  50.                                 If bitarr(index) = bitarr(index - pw ) Then samecount = samecount + 1
  51.                                 If bitarr(index) = bitarr(index + pw ) Then samecount = samecount + 1
  52.                                 If samecount < 3 Then
  53.                                         ''去干扰线条
  54.                                         cl.Item(index) =  &HFFFFFF
  55.                                 Else
  56.                                         cl.Item(index) =  -16777216
  57.                                 End if
  58.                         End If
  59.         Next


  60.         ''去上下边缘色
  61.         For i=1 To pw
  62.                 cl.Item(i) =  &HFFFFFF
  63.         Next
  64.         For i=pw * (ph - 1) + 1 To pw * ph
  65.                 cl.Item(i) =  &HFFFFFF
  66.         Next
  67.         
  68.         ''另存修改后的图片
  69.         IP.Filters.Add IP.FilterInfos("ARGB").FilterID
  70.         IP.Filters(1).Properties("ARGBData") = cl
  71.         Set pic = IP.Apply(pic)
  72.         pic.SaveFile ofile
  73. End Sub
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-10-4 10:34
  • 签到天数: 1208 天

    连续签到: 1 天

    [LV.10]测试总司令

    2#
    发表于 2013-8-17 17:36:52 | 只看该作者
    高手啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-9-27 10:05
  • 签到天数: 36 天

    连续签到: 1 天

    [LV.5]测试团长

    3#
    发表于 2013-8-20 12:14:32 | 只看该作者
    虽然不常用,不过方法值得学习。
    顶上~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2024-10-20 14:47
  • 签到天数: 564 天

    连续签到: 1 天

    [LV.9]测试副司令

    4#
    发表于 2014-1-21 13:53:04 | 只看该作者
    真的看到了...比PS还要牛!
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-22 02:23 , Processed in 0.071660 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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