m基于MATLAB的发票数字信息识别算法仿真,通过形态学处理进行字符分割,通过模板匹配实现数字字母识别
1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
形态学是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别。
计算机和电子信息技术的高速发展,使得数据处理加工能力逐步增强,为图像处理、计算机视觉和模式识别技术应用于智能交通信息采集提供了强有力的保障。该系统通过摄像机对交通信息流进行摄像,利用图像处理和模式识别技术对连续的交通信息流进行处理,以此达到监测交通信息流的目的。同时,现场的交通视频信号也能够为电视监控共用。近年来,该系统得到快速发展,作为一种检测手段,视频检测技术所提供的丰富交通信息,以及所具有的各种优点,都是其他方法难以比拟的。
形态学处理
腐蚀:对核范围内的像素,只要有一个是非前景,则设置为背景;比如对于3*3的核函数,如果当前像素的3*3邻域内像素全是前景则保留,否者设置为背景;常用于去除较小噪声,分离物体。
膨胀:对核范围内的像素,只要有一个是前景,则设置为前景;比如对于3*3的核函数,如果当前像素的3*3邻域内像素有一个是前景则当前像素设置为前景,否者设置为背景;通常膨胀会用在腐蚀之后,腐蚀会去除小的噪声,但也会把前景变瘦,而膨胀则会再变胖。
开运算:先腐蚀,再膨胀;主要处理噪点在前景外的图像。
闭运算:先膨胀,再腐蚀;主要处理噪点在前景内的图像。
如果图像前景内外都有噪点,先开再闭 或 先闭再开 都可以得到前景图像。
形态学梯度:膨胀-腐蚀;可以得到前景轮廓。
顶帽运算:原图-开运算;可以得到前景外的噪点。
黑帽运算:闭运算-原图;可以得到前景内的噪点。
1、图像输入、预处理:
图像输入:对于不同的图像格式,有着不同的存储格式,不同的压缩方式。预处理:主要包括二值化,噪声去除,倾斜较正等
2、二值化:
对摄像头拍摄的图片,大多数是彩色图像,彩色图像所含信息量巨大,对于图片的内容,我们可以简单的分为前景与背景,为了让计算机更快的,更好的识别文字,我们需要先对彩色图进行处理,使图片只前景信息与背景信息,可以简单的定义前景信息为黑色,背景信息为白色,这就是二值化图了。
3、噪声去除:
对于不同的文档,我们对噪声的定义可以不同,根据噪声的特征进行去噪,就叫做噪声去除
4、倾斜较正:
由于一般用户,在拍照文档时,都比较随意,因此拍照出来的图片不可避免的产生倾斜,这就需要文字识别软件进行较正。
5、版面分析:
将文档图片分段落,分行的过程就叫做版面分析,由于实际文档的多样性,复杂性,因此,还没有一个固定的,最优的切割模型。
6、字符切割:
由于拍照条件的限制,经常造成字符粘连,断笔,因此极大限制了识别系统的性能,这就需要文字识别软件有字符切割功能。
7、字符识别:
这一研究,已经是很早的事情了,比较早有模板匹配,后来以特征提取为主,由于文字的位移,笔画的粗细,断笔,粘连,旋转等因素的影响,极大影响特征的提取的难度。
3.MATLAB核心程序
function [Car_Nums,DATEs,DONE_Nums] = func_segment(Car_Num,DATE,DONE_Num,LEN,LL); alpha = 0.85; [r,c] = size(Car_Num); Car_Num = imresize(Car_Num,[100 c]); [r,c] = size(DATE); DATE = imresize(DATE,[100 c]); [r,c] = size(DONE_Num); DONE_Num = imresize(DONE_Num,[100 c]); I7 = ~im2bw(Car_Num ,alpha*graythresh(Car_Num)); VI7 = sum(I7,1); tmp7 = find(VI7 > 5); Ind7 = tmp7(end); Car_Num7 = Car_Num(:,Ind7-1*LEN+1+LL:Ind7-0*LEN+LL); Car_Num6 = Car_Num(:,Ind7-2*LEN+1+LL:Ind7-1*LEN+LL); Car_Num5 = Car_Num(:,Ind7-3*LEN+1+LL:Ind7-2*LEN+LL); Car_Num4 = Car_Num(:,Ind7-4*LEN+1+LL:Ind7-3*LEN+LL); Car_Num3 = Car_Num(:,Ind7-5*LEN+1+LL:Ind7-4*LEN+LL); Car_Num2 = Car_Num(:,Ind7-6*LEN+1+LL:Ind7-5*LEN+LL); Car_Num1 = Car_Num(:,Ind7-7*LEN+1:Ind7-6*LEN+LL); Car_Nums{7} = Car_Num7; Car_Nums{6} = Car_Num6; Car_Nums{5} = Car_Num5; Car_Nums{4} = Car_Num4; Car_Nums{3} = Car_Num3; Car_Nums{2} = Car_Num2; Car_Nums{1} = Car_Num1; I8 = ~im2bw(DATE ,alpha*graythresh(DATE)); VI8 = sum(I8,1); tmp8 = find(VI8 > 5); Ind8 = tmp8(end); DATE11= DATE(:,Ind8-1*LEN+1+LL:Ind8-0*LEN+LL); DATE10= DATE(:,Ind8-2*LEN+1+LL:Ind8-1*LEN+LL); DATE9 = DATE(:,Ind8-3*LEN+1+LL:Ind8-2*LEN+LL); DATE8 = DATE(:,Ind8-4*LEN+1+LL:Ind8-3*LEN+LL); DATE7 = DATE(:,Ind8-5*LEN+1+LL:Ind8-4*LEN+LL); DATE6 = DATE(:,Ind8-6*LEN+1+LL:Ind8-5*LEN+LL); DATE5 = DATE(:,Ind8-7*LEN+1+LL:Ind8-6*LEN+LL); DATE4 = DATE(:,Ind8-8*LEN+1+LL:Ind8-7*LEN+LL); DATE3 = DATE(:,Ind8-9*LEN+1+LL:Ind8-8*LEN+LL); DATE2 = DATE(:,Ind8-10*LEN+1+LL:Ind8-9*LEN+LL); DATE1 = DATE(:,Ind8-11*LEN+1:Ind8-10*LEN+LL); DATEs{11} = DATE11; DATEs{10} = DATE10; DATEs{9} = DATE9; DATEs{8} = DATE8; DATEs{7} = DATE7; DATEs{6} = DATE6; DATEs{5} = DATE5; DATEs{4} = DATE4; DATEs{3} = DATE3; DATEs{2} = DATE2; DATEs{1} = DATE1; I9 = ~im2bw(DONE_Num,alpha*graythresh(DONE_Num)); VI9 = sum(I9,1); tmp9 = find(VI9 > 5); Ind9 = tmp9(end); DONE_Num5 = DONE_Num(:,Ind9-1*LEN+1+LL:Ind9-0*LEN+LL); DONE_Num4 = DONE_Num(:,Ind9-2*LEN+1+LL:Ind9-1*LEN+LL); DONE_Num3 = DONE_Num(:,Ind9-3*LEN+1+LL:Ind9-2*LEN+LL); DONE_Num2 = DONE_Num(:,Ind9-4*LEN+1+LL:Ind9-3*LEN+LL); DONE_Num1 = DONE_Num(:,Ind9-5*LEN+1:Ind9-4*LEN+LL); DONE_Nums{5} = DONE_Num5; DONE_Nums{4} = DONE_Num4; DONE_Nums{3} = DONE_Num3; DONE_Nums{2} = DONE_Num2; DONE_Nums{1} = DONE_Num1; figure; subplot(3,11,1); imshow(Car_Nums{1},[]); subplot(3,11,2); imshow(Car_Nums{2},[]); subplot(3,11,3); imshow(Car_Nums{3},[]); subplot(3,11,4); imshow(Car_Nums{4},[]); subplot(3,11,5); imshow(Car_Nums{5},[]); subplot(3,11,6); imshow(Car_Nums{6},[]); subplot(3,11,7); imshow(Car_Nums{7},[]); subplot(3,11,12); imshow(DATEs{1},[]); subplot(3,11,13); imshow(DATEs{2},[]); subplot(3,11,14); imshow(DATEs{3},[]); subplot(3,11,15); imshow(DATEs{4},[]); subplot(3,11,16); imshow(DATEs{5},[]); subplot(3,11,17); imshow(DATEs{6},[]); subplot(3,11,18); imshow(DATEs{7},[]); subplot(3,11,19); imshow(DATEs{8},[]); subplot(3,11,20); imshow(DATEs{9},[]); subplot(3,11,21); imshow(DATEs{10},[]); subplot(3,11,22); imshow(DATEs{11},[]); subplot(3,11,23); imshow(DONE_Nums{1},[]); subplot(3,11,24); imshow(DONE_Nums{2},[]); subplot(3,11,25); imshow(DONE_Nums{3},[]); subplot(3,11,26); imshow(DONE_Nums{4},[]); subplot(3,11,27); imshow(DONE_Nums{5},[]);