作者:瓦尔登湖 | 来源:互联网 | 2023-10-10 11:37
一、OCR简介 1 什么是OCR技术? OCR英文全称是Optical Character Recognition,中文叫做光学字符识别。它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接受、人又可以理解的格式。文字识别是计算机视觉研究领域的分支之一,而且这个课题已经是比较成熟了,并且在商业中已经有很多落地项目了。
2 OCR技术的分类: 2.1 按主题划分:手写体识别和印刷体识别。
(1)印刷体大多都是规则的字体,技术上的难点是,在印刷过程中字体很可能变得断裂或者墨水粘连,使得OCR识别异常困难。当然这些都可以通过一些图像处理的技术帮他尽可能的还原,进而提高识别率。总的来说,单纯的印刷体识别在业界已经能做到很不错了,但说100%识别是肯定不可能的,但是说识别得不错那是没毛病。
(2)手写体识别一直是OCR界一直想攻克的难关,但是时至今天,识别难度还是很大。为什么手写体识别这么难识别?因为人类手写的字往往带有个人特色,每个人写字的风格基本不一样,虽然人类可以读懂你写的文字,但是机器缺很难。印刷体一般都比较规则,字体都基本就那几十种,机器学习这几十种字体并不是一件难事,但是手写体,每个人都有一种字体的话,那机器该学习多少字体啊?这就是难度所在。
2.2 按识别的内容来分类 对于我们国人来说主要分成三类:汉字、英文字母、阿拉伯数字。识别数字是最简单了,毕竟要识别的字符只有0~9,而英文字母识别要识别的字符有26个(如果算上大小写的话那就52个),而中文识别,要识别的字符高达数千个因为汉字的字形各不相同,结构非常复杂(比如带偏旁的汉字)如果要将这些字符都比较准确地识别出来,是一件相当具有挑战性的事情。但是,并不是所有应用都需要识别如此庞大的汉字集,比如车牌识别,我们的识别目标仅仅是数十个中国各省和直辖市的简称,难度就大大减少了。当然,在一些文档自动识别的应用是需要识别整个汉字集的,所以要保证识别的整体的识别还是很困难的。
2.3 OCR流程 判断页面上的文本朝向,因为我们得到的这页文档往往都不是很完美的,很可能带有倾斜或者污渍,那么我们要做的第一件事就是进行图像预处理,做角度矫正和去噪。 对文档版面进行分析,进每一行进行行分割,把每一行的文字切割下来,最后再对每一行文本进行列分割,切割出每个字符,将该字符送入训练好的OCR识别模型进行字符识别,得到结果。 对其进行识别结果的矫正和优化,比如我们可以设计一个语法检测器,去检测字符的组合逻辑是否合理。比如,考虑单词Because,我们设计的识别模型把它识别为8ecause,那么我们就可以用语法检测器去纠正这种拼写错误,并用B代替8并完成识别矫正。这样子,
整个OCR流程就走完了。从大的模块总结而言,一套OCR流程可以分为: 版面分析 -> 预处理-> 行列切割 -> 字符识别 -> 后处理识别矫正 从上面的流程图可以看出,要做字符识别并不是单纯一个OCR模块就能实现的(如果单纯的OCR模块,识别率相当低),都要各个模块的组合来保证较高的识别率。
二、部分源代码 clc clear all close all Symbols &#61; [ &#39;0&#39; &#39;1&#39; &#39;2&#39; &#39;3&#39; &#39;4&#39; &#39;5&#39; &#39;6&#39; &#39;7&#39; &#39;8&#39; &#39;9&#39; &#39;-&#39; ] ; P3 &#61; [ ] ; Result &#61; [ ] ; path &#61; &#39;C: \Users\lenovo\Desktop\23149049 ocr\&#39;; % working Path ext &#61; &#39;_bold.bmp&#39; ; % Train Data Files Extension name P &#61; zeros ( 16 , 12 , 11 ) ; % Read 0 - 9 digits datafor i &#61; 0 : 9 file &#61; [ path, char ( 48 &#43; i) , ext] ; % char ( 48 ) &#61; > &#39;0&#39; P ( : , : , i &#43; 1 ) &#61; imread ( file) ; P3 &#61; [ P3, P ( : , : , i &#43; 1 ) &#39;] ; end% imshow ( P ( : , : , 1 ) ) ; i &#61; i &#43; 1 ; % read other symbolsfile &#61; [ path, &#39;dash&#39; , ext] ; P ( : , : , i &#43; 1 ) &#61; imread ( file) ; P3 &#61; [ P3, P ( : , : , i &#43; 1 ) &#39;] ; % figure% for i &#61; 1 : 11 % subplot ( 11 , 1 , i ) ; % imshow ( P ( : , : , i) ) ; % endP1 &#61; reshape ( P3, 12 * 16 , 11 ) ; T &#61; zeros ( 11 , 11 ) ; for i &#61; 1 : 11 T ( i, i) &#61; 1 ; end[ R, Q] &#61; size ( P1) ; [ S2, Q] &#61; size ( T) ; S1 &#61; 25 ; net &#61; newff ( minmax ( P1) , [ S1 S1 S2] , { &#39;logsig&#39; &#39;logsig&#39; , &#39;logsig&#39; } , &#39;traingdx&#39; ) ; net. performFcn &#61; &#39;sse&#39; ; net. trainParam. goal &#61; 0.05 ; net. trainParam. show &#61; 100 ; net. trainParam. epochs &#61; 5000 ; net. trainParam. mc &#61; 0.95 ; [ net, tr] &#61; train ( net, P1, T) ; sept2 &#61; [ ] ; % character segment start- end pos Test1 &#61; [ ] ; file &#61; [ path, &#39;test_bold2.bmp&#39; ] ; a &#61; imread ( file) ; figure; subplot ( 3 , 24 , 1 : 24 ) ; imshow ( a) ; j &#61; 1 ; seg1 &#61; a; b &#61; sum ( seg1) ; % character segment, if the vertical projection is zero, means the space between characters. b ( find ( b < 1 ) ) &#61; 0 ; c &#61; find ( b &#61;&#61; 0 ) ; d&#61; find ( b > 0 ) ; e &#61; find ( c > d ( 1 ) ) ; sept2 &#61; [ ] ; for k &#61; 1 : size ( e, 2 ) - 1 % delete repeated zero positionif ( c ( e ( k &#43; 1 ) ) - c ( e ( k) ) > 1 ) sept2 &#61; [ sept2, c ( e ( k ) ) ] ; sept2 &#61; [ sept2, c ( e ( k &#43; 1 ) ) ] ; end end% figuresept2 &#61; [ 1 , sept2] ; chCount &#61; size ( sept2) ; for k &#61; 1 : chCount ( 2 ) - 1 Test1 &#61; [ ] ; tmp &#61; zeros ( 16 , 1 ) ; z &#61; a ( : , sept2 ( k) &#43; 1 : sept2 ( k&#43; 1 ) ) ; t1 &#61; size ( z) ; if ( t1 ( 2 ) > 2 ) tt1 &#61; size ( z) ; % if ( tt1 ( 2 ) < 11 ) % z &#61; [ z, tmp] ; % endtt1 &#61; size ( z) ; % if ( tt1 ( 2 ) < 11 ) % z &#61; [ tmp, z, tmp] ; % endz2 &#61; imresize ( z, [ 16 , 12 ] , &#39;bilinear&#39; ) ; % z2 &#61; ~ z2; % z2 &#61; ~ z2; % z2 &#61; double ( z2) ; % z2 &#61; imnoise ( z2, &#39;salt & pepper&#39; , 0.4 ) ; z2 &#61; ~ z2; z2 &#61; ~ z2; subplot ( 3 , 24 , 24 &#43; k) ; imshow ( z2) ; z2 &#61; z2&#39;; z3 &#61; reshape ( z2, 16 * 12 , 1 ) ; Test1 &#61; [ Test1, z3] ; % figure; % imshow ( z2) ; % title ( &#39;TRUE&#39; ) ; % end
三、运行结果
四、matlab版本及参考文献 1 matlab版本 2014a
2 参考文献 [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社&#xff0c;2020. [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社&#xff0c;2013. [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社&#xff0c;2013. [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社&#xff0c;2015.