© Conmajia 2012
代码在此
(这篇文章没有写完 ,后面的资料我也不知道放哪儿去了 。——Conmajia ,2014)
前言
光学字符识别 (OCR) 是非常有用的技术 。在验证码识别 、车牌号识别 、文字识别方面 ,基于字符的识别技术算是比较容易上手的了 (相比图文识别) 。
闲来看到有朋友研究验证码识别 ,一时手痒 ,野比自己动手来做做验证码识别 。当然 ,肯定只是简单的验证码 。
名为验证码 ,实际上并不限于 ,还可以识别车牌号 、身份证号 、门牌号等各种乱七八糟的内容 。
识别的流程很明确:
1 、预处理图像
2 、做 y 轴的投影
3 、分析直方图分区
4 、根据分区拆分图像为多个字符 (很关键 ,拆得越好 ,后续识别率越高)
5 、丢弃空白或无效字符
6 、自动旋转字符 (如果有倾斜) ,识别字符
如果样本中个图像有粘连 ,则可能造成分区不准确 。这种情况下 ,需要进行旋转 ,但是怎样自动旋转 ,是个难题 。
目前已可拆分出字符 ,下一步准备研究如何识别 。 (如果单个字符比较规范 ,可以利用现成的 OCR 控件)
例子
这里有一些例子 。
普通的验证码 (毫无难度)

带干扰的验证码

较高强度干扰 (目前使用的分区算法不能解决 ,需要更好的算法 ,比如动态阈值)

CSDN 的验证码 (毫无压力)

身份证号码

车牌号

补充个 QQ 验证码 ,用单一阈值方法 ,识别很困难 ,需要结合字符宽度进行判断
这是单一阈值分区的结果 (没有限制宽度) ,可以看到效果很差 。

继续研究如何优化分区算法 ,如何识别单个文字 (可以考虑多重识别+样本训练) 。
附上太平洋网站验证码 。
有些粘连 ,但是可以通过固定字符宽度解决 (宽度基本一致)
参考这张图 (获得整个宽度 ,然后除以字符数得到每个宽度 ,分别提取)

改进的去污算法

污损车牌号拆分字符



参考资料
二值化我用的 Otsu 算法 ,参考文献: "A threshold selection method from gray-level histograms", IEEE Trans. Systems, Man and Cybernetics 9(1), pp. 62–66, 1979
关于验证码 ,这篇论文很不错 ,建议参考: "Text-based CAPTCHA Strengths and Weaknesses", ACM Computer and Communication security 2011 (CSS'2011)
(未完待续)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?