|
本帖最后由 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组件写了段去背景色和线条的代码。
- Dim fso
- Set fso = WScript.CreateObject("Scripting.Filesystemobject")
- Set f=fso.GetFolder("D:\文件夹转移\desktop\d")
- For Each n In f.Files
- clearX n.Path,n.Path & ".clear.png"
- next
- Sub clearX(sfile,ofile)
- Dim pic
- Set pic = CreateObject("WIA.ImageFile.1")
- Set IP = CreateObject("WIA.ImageProcess")
-
- pic.LoadFile sfile
- pw = pic.Width
- ph = pic.Height
- Set cl=pic.ARGBData
- Dim bitarr()
- ReDim bitarr(cl.Count)
-
- ''获取背景色
- Set oDic = CreateObject("scripting.dictionary")
- oDic.RemoveAll
- For j=1 To pw
- If not odic.Exists(cl.Item(j)) Then
- odic.Add cl.Item(j),1
- Else
- odic.Item(cl.Item(j))=odic.Item(cl.Item(j))+1
- End if
- index=index+1
- Next
-
- For Each n In odic.Keys
- '' 排除背景中的干扰线条色
- If odic.Item(n)/pw < 0.03 Then
- odic.Remove n
- End If
- Next
-
- For i=1 To cl.Count
- bitarr(i) = cl.Item(i)
- Next
-
- For index=pw+1 To pw * (ph - 1)
- If odic.Exists(bitarr(index)) Then
- ''去背景色
- cl.Item(index) = &HFFFFFF
- else
- samecount = 0
- If bitarr(index) = bitarr(index - 1 ) Then samecount = samecount + 1
- If bitarr(index) = bitarr(index + 1 ) Then samecount = samecount + 1
- If bitarr(index) = bitarr(index - pw ) Then samecount = samecount + 1
- If bitarr(index) = bitarr(index + pw ) Then samecount = samecount + 1
- If samecount < 3 Then
- ''去干扰线条
- cl.Item(index) = &HFFFFFF
- Else
- cl.Item(index) = -16777216
- End if
- End If
- Next
- ''去上下边缘色
- For i=1 To pw
- cl.Item(i) = &HFFFFFF
- Next
- For i=pw * (ph - 1) + 1 To pw * ph
- cl.Item(i) = &HFFFFFF
- Next
-
- ''另存修改后的图片
- IP.Filters.Add IP.FilterInfos("ARGB").FilterID
- IP.Filters(1).Properties("ARGBData") = cl
- Set pic = IP.Apply(pic)
- pic.SaveFile ofile
- End Sub
复制代码
|
|