【印刷字符识别】基于matlab特征匹配英文印刷字符识别【含Matlab源码 310期】
一、获取代码方式
获取代码方式1:
完整代码已上传我的资源: 【印刷字符识别】基于matlab特征匹配英文印刷字符识别【含Matlab源码 310期】
获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。
备注:订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);
二、简介
基于matlab的特征匹配的英文印刷字符识别,研究灰度转换、中值滤波、二值化处理、形态学滤波、图像与字符分隔等算法,形成了一套效果明显的字符图像识别算法。采用字符的归一化和细化处理方法,通过二值化和字体类型特征相结合的处理方法完成特征提取,建立了字符标准特征库,合理的模版匹配算法实现了印刷体字符的识别,matlab仿真代码亲测可用。
1 案例背景
在日常学习和生活中,人眼是人们接受信息最常用的通道之一。据统计,人们日常处理的信息有75%~85%属于视觉信息范畴,文字信息则占据着重要的位置,几乎涵盖了人类生活的方方面面。如对各种报纸期刊的阅读、查找、批注;对各种文档报表的填写、修订;对各种快递文件的分拣、传送、签收等。因此,为了实现文字信息解析过程的智能化、自动化,就需要借助于计算机图像处理来对这些文字信息进行识别。早在20世纪50年代初期,欧美就开始对文字识别技术进行研究。特别是1955年印刷体数字OCR产品的出现, 推动了英文和数字识别技术的发展。美国IBM公司的Casey和Nagy最早开始了对汉字识别的研究, 并于1966年发表了第一篇关于汉字识别的论文,采用模板匹配法识别1000个印刷体汉字,从此在世界范围内拉开了汉字识别研究的序幕。日本于20世纪70年代中期开始进行手写体汉字识别的研究,我国于20世纪80年代初期开始进行手写体汉字识别的研究。本案例重点研究了印刷体图像的灰度转换、中值滤波、二值化处理、形态学滤波、图像与字符分割等算法,形成了一套效果明显、简便易行的印刷体字符图像识别算法。在印刷体字符的识别过程中,采用字符的归一化和细化处理方法,通过二值化和字体类型特征相结合的处理方式完成特征提取,建立了字符标准特征库。运用合理的模板匹配算法实现了印刷体字符的识别。
2 理论基础
2.1图像预处理
为了提高图像识别等模块的处理速度,需要将彩色图像转换为灰度图像,减少图像矩阵占用的内存空间。由彩色图像转换为灰度图像的过程叫作灰度化处理,灰度图像就是只有亮度信息而没有颜色信息的图像,且存储灰度图像只需要一个数据矩阵,矩阵中的每个元素表示对应位置像素的灰度值。通过拍摄、扫描等方式采集印刷体图像可能会受局部区域模糊、对比度偏低等因素的影响,而图像增强可应用于图像对比度的调整,突出图像的重要细节,改善视觉质量。因此,采用图像灰度变换等方法可有效地增强图像对比度,提高图像中字符的清晰度,突出不同区域的差异性。对比度增强是典型的空域图像增强算法,这种处理只是逐点修改原印刷体图像每个像素的灰度值,不会改变图像中各像素的位置,在输入与输出像素之间是一对一的映射关系。
二值图像是指图像数值矩阵中只保留0、1数值来代表黑、白两种颜色。在实际的印刷体图像处理实验中,选择合适的阈值是进行图像二值变换的关键步骤,二值化能分割字符与背景,突出字符目标。对于印刷体图像而言,其二值变换的输出必须具备良好的保形性,不会改变有用的形状信息,不会产生额外的孔洞等噪声。其中,二值化的阈值选取有很多方法,主要分为三类:全局阈值法、局部阈值法和动态阈值法,本案例结合印刷体字符图像的特点,采用全局阈值来进行二值化处理。
印刷体图像可能在扫描或者传输过程中受到噪声干扰,为了提高识别模块的准确率,通常采用用平滑滤波的方法进行去噪,如中值滤波、均值滤波。在本案例中,通过对字符图像的特征分析,采用在二值化图像的形态学变换滤波来进行去噪处理,保留有用的字符区域图像,消除杂点、标点符号等干扰内容。在经扫描得到的印刷体图像中,不同位置的字符类型或尺寸可能也存在较大差异,为了提高字符识别的效率,需要将字符统一尺寸得到标准字符图像,这就是字符的标准化过程。为了将原来各不相同的字符统一尺寸,可以在实验过程中先统一高度,然后根据原始字符宽高比例来调整字符的宽度,得到标准字符。
此外,输入的印刷体字符图像可能需要进行倾斜校正,使得同属一行的字符也都处于同一水平位置,这样既有利于字符的分割,也可以提高字符识别的准确率。倾斜校正的思想为主要根据图像左右两边的黑色像素做积分投影所得到的平均高度来进行,字符组成的图像其左右两边的字符像素高度一般处于水平位置附近,如果两边字符像素经积分投影得到的平均位置有较大差异,则说明图像存在倾斜,需要进行校正。
2.2图像识别技术
字符识别是印刷字符图像识别的核心步骤,主要包括以下内容:首先,识别模块学习、存储将要判别的字符特征,将这些特征汇总成识别系统的先验知识:然后,选择合适的判别准则来基于先验知识对输入的字符进行研判;最后,存储字符的识别结果并输出。在实验过程中,字符的特征具有不同的来源,如空间域的点阵位置信息,在频域空间、小波空间等领域也都有各自的特征,而且不同的特征在识别字符时具有各自的特点及优势。根据字符识别模块所选择特征类型的不同,可以将其分为不同的识别技术。一般情况下,根据所采用的技术策略,字符识别技术可以分为如下三类:统计特征字符识别技术、结构特征字符识别技术和基于机器学习的识别技术。
(1)统计特征字符识别
统计特征识别技术一般选择同类字符所共有的相对稳定且具有良好分类性的统计特征作为特征向量。统计特征常用的有字符所处二维空间的位置特征、字符所处水平或者垂直方向的投影直方图特征、字符区域矩特征、字符纹理特征或经过频域等变换后的特征。通过对大量字符的统计特征进行提取、学习、训练形成字符先验知识,构成字符库的模板信息,并将其存储到识别模块。待识别图像在输入后首先提取相同的统计特征向量,然后与识别模块中存储的字符先验知识根据指定匹配程度算法进行比较,最后根据比较结果确定字符最终类别,实现识别的目的。其中,匹配程度算法通常采用向量间的距离计算,如欧式距离、绝对值距离、汉明距离等,为了便于后续的模式判别,可以将这些距离作为输入进行归一化,进而得到归一化的匹配程度。在实际应用中,基于字符像素点平面分布的识别算法是最常用的匹配方法之一,具有简捷高效、易于实现的优点。该算法首先将字符图像归一化为标准的维数大小,然后根据像素点的位置进行扫描匹配,最后计算模板和图像的某种距离值。但是,算法要对每个像素点进行扫描匹配,可能会造成算法实现计算量大,且对噪声、字符畸变等因素较为敏感,因此对待识别图像的质量要求较高。
(2)结构特征字符识别
在现实生活中,人们往往更关心相近字符的识别和手写体字符识别等功能,一般具有字体不同、场景多变的特点,因此基于结构特征的字符识别技术就应运而生,该技术以字符结构特征作为处理对象,可根据识别策略的不同,选择不同的结构,具有灵活多变的优点。在实际应用中,可以选择字根、笔划、细微笔段等特征,一般称作字符的子模式、组件、基元,将所有基元按照某种顺序排列、存储就形成了字符的结构特征。因此,基于结构的字符识别实际上是将字符在基元组成的结构空间进行映射,然后进行识别。其中,识别过程一般是在基元组成的结构空间上利用建模语言和自动机理论,采取语法分析、图匹配、树匹配和知识推理等方法分析字符结构的过程。该技术常用的结构特征有:笔划走向、孤立点、闭合笔画等。如果应用于汉字识别,则可结合汉字自身明显的结构性,利用汉字
的结构特点进行识别,也可以达到较好的效果。传统识别方法一般对输入图像采取统一分辨率变换处理,其分辨率大小取决于算法复杂度和资源存储条件,往往会造成系统资源的浪费和识别效率的降低。
(3)基于机器学习识别
人类对文字的识别能力远远胜过计算机,以常见的验证码为例,无论是对字符进行变形、模糊,还是损坏部分区域,人类都能很好地识别。基于机器学习的字符识别技术其目的就是力图通过对人脑学习和识别的模拟来实现对字符的高效识别。经过近几年的迅速发展, 机器学习在字符识别方面得到了广泛的应用。特别是在OCR系统中, 机器学习已经得到了更充分的应用。通过将字符的特征向量作为输入,机器学习模块输出的是字符的分类结果,即识别结果。在实际应用中,如果只是进行字符图像处理和识别流程,则得到的特征向量可能包含某些冗余甚至矛盾的信息,往往需要对其进行进一步的优化处理。机器学习模块经过反复训练,可以智能地将特征向量优化,去除冗余、矛盾的信息,突出类间的差异。同时,借助于机器学习成熟的架构模式及运行结构,可以应用并行计算到运行过程中,所以可以加快大规模问题的求解速度。
备注:简介部分摘自互联网,若有侵权,请联系删除。
三、部分源代码
function MainForm
global bw;
global bl;
global bll;
global s;
global fontSize;
global charpic;
global hMainFig;
global pic;
global hText;
clc; close all; warning off all;
if ~exist(fullfile(pwd, 'pic'), 'dir')
mkdir(fullfile(pwd, 'pic'));
end
picname = fullfile(pwd, 'image.jpg');
pic = imread(picname);
s = size(pic);
if length(s) == 3
pic = rgb2gray(pic);
end
bw = im2bw(pic, 0.7);
bw = ~bw;
for i = 1 : s(1)
if sum(bw(i,:) ~=0) > 0
FontSize_s = i;
break;
end
end
for i = FontSize_s : s(1)
if sum(bw(i,:) ~=0) == 0
FontSize_e = i;
break;
end
end
FontSizeT = FontSize_e - FontSize_s;
fontName = '宋体';
fontSize = FontSizeT;
bw1 = imclose(bw, strel('line', 4, 90));
bw2 = bwareaopen(bw1, 20);
bwi2 = bwselect(bw2, 368, 483, 4);
bw2(bwi2) = 0;
bw3 = bw .* bw2;
bw4 = imclose(bw3, strel('square', 4));
[Lbw4, numbw4] = bwlabel(bw4);
stats = regionprops(Lbw4);
for i = 1 : numbw4
tempBound = stats(i).BoundingBox;
tempPic = imcrop(pic, tempBound);
tempStr = fullfile(pwd, sprintf('pic\\%03d.jpg', i));
imwrite(tempPic, tempStr);
end
[bl, num] = bwlabel(bw1, 4);
chars = [char(uint8('A'):uint8('Z')), uint8('a'):uint8('z'), uint8('0'):uint8('9')];
eleLen = length(chars);
charpic = cell(1,eleLen);
hf1 = figure('Visible', 'Off');
imshow(zeros(32,32));
h = text(15, 15, 'a', 'Color', 'w', 'Fontname', fontName, 'FontSize', fontSize);
for p = 1 : eleLen
set(h, 'String', chars(p));
fh = getframe(hf1, [85, 58, 30, 30]);
temp = fh.cdata;
temp = im2bw(temp, 0.2);
[r, c] = find(temp == 0);
rect = [min(c) min(r) max(c)-min(c) max(r)-min(r)];
temp = imcrop(temp, rect);
[f1, f2] = find(temp == 1);
sz = size(temp);
temp = temp(max(1, min(f1)-1):min(max(f1)+1, sz(1)),max(1, min(f2)-1):min(max(f2)+1, sz(2)));
charpic{p} = temp;
end
delete(hf1);
bll = zeros(size(bl));
for i = 1:num
[f1, f2] = find(bl == i);
bll(min(f1):max(f1), min(f2):max(f2)) = i;
end
hMainFig = figure(1);
imshow(picname, 'Border', 'loose'); hold on;
for i = 1 : numbw4
tempBound = stats(i).BoundingBox;
rectangle('Position', tempBound, 'EdgeColor', 'r');
end
hText = axes('Units', 'Normalized', 'Position', [0 0 0.1 0.1]); axis off;
set(hMainFig, 'WindowButtonMotionFcn', @ShowPointData);
end
function ShowPointData(hObject, eventdata, handles)
global bw;
global bl;
global bll;
global s;
global charpic;
global hMainFig;
global pic;
global hText;
p = get(gca,'currentpoint');
x = p(3);
y = p(1);
if x<1 || x>s(1) || y<1 || y>s(2)
return;
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/113824835
- 点赞
- 收藏
- 关注作者
评论(0)