MAAB大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于M A T L A B识别图片中的文字知识点:图像识别图像处理计算机视觉
实验目的:以MATLAB为工具,识别图片中的文字。
问题描述:
交通是一个十分重要的问题,红绿灯上的摄像头可以辨别车主的身份。现在,我们是否能够用matlab设计一个图像识别的系统,通过车牌号的来识别相应的数字。问题分析及模型建立:
第一步:确定车牌号的区域
对于一张图像
在matlab中,在处理图像元素时用(x,y,z)三坐标的形式表达的灰度集时,其中,x和y是空间坐标,z是f 在坐标(x,y)处的值,就可以表达图像在该坐标轴上的点。再将,将f(x,y)的数值简单地显示为一个矩阵,就可以定量地表达了一幅数值图像。
矩阵中的每个元素称为像素。
所以,如果我们想要截取一段车牌号的图像,我们就可以扫描图像每一个点的像素。然后我们进行恢复处理,算子边缘检测,腐蚀,闭操作,删除小对象得到
我们就可以利用RGB的值找到白色区域的边界,然后我们利用边界,截取我们的原图像就可以得到我们所需要的车牌号的区域了。
第二步:进行文字的分割
在进行分割之前,就需要将我们所获得的车牌号的区域的图像进行进一步的处理,突出我们需要的文字部分。
灰度处理
彩色的图片占用的空间比较大,处理会花费很长的时间,先将图片进行灰度处理二值化
再将图片二值化,将图片的256个灰度级强制减少到只有{0,255}2个灰度级,更加方便了后续的
文字识别识别。
均值滤波
均值滤波是对是对图像进行局部平均, 以平均值来代表该像素点的灰度值。矩形滤波器对这个二维矢量的每一个分量进行独立的平滑处理。获得一张比较干净清晰的图像。
腐蚀和膨胀
腐蚀可以分割独立的图像元素,膨胀用于连接相邻的元素,更加利于图像的分割进行完图像的预处理,就可以开始图像的切割了
首先进行边缘的切割,处理完后的图像为黑底白字。其中黑色为0,白色1为。这样我们就可以从四个边缘进行扫描,若行或者列像素之和0的话,就为背景,这样就可以继续向内推移,直到和不为0的位置为止。这样就进行了边缘的切割。接下来,先进行文字的切割,文字和字母、数字在长度和宽度上有较大的差别,所以需要单独的拿出来。因为号码是平铺过来的,所以我们进行列的扫描。先从最左边进行扫描,若列像素之和不为0的话,则说明有文字,直到和为0的时候停止。但是如果扫描出来的宽度太小的话就说明背景可能有白色区域干扰。这时,应该将刚刚扫描出来的区域置黑,再次进行扫描,截取图像。同理,数字和字母可同样按着上面的方式扫描,截取。
截取后的图像
模板的配对
所有的文字数字和字母都截取下来后,我们需要将所得的图片统一的量化为同样大小的图像方便比对。
统一量化后的图像
完成了这部的操作之后,就需要建立一个小型的模板库。将车牌号常见的文字、十个数字和26个英文字母存储为上面同样大小的二值化图片,并且以对应字符的名称命名。
将所有的模板放在一起,按照一定的顺序排列。然后,我们就可以调用我们已经切割好的图片和模板内部的图片进行相减,寻找差别最小的图片进行匹配,这样就可以识别出车牌号上的字符了。
问题求解:
matlab代码:
主函数
function [d]=main(jpg)
close all
clc
I=imread('Car.jpg');%读入车牌图像Car.jpg
I1=rgb2gray(I);
I2=edge(I1,'roberts',0.15,'both');
se=[1;1;1];
I3=imerode(I2,se);
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
I5=bwareaopen(I4,2000);
figure(1),imshow(I5);title('从对象中移除小对象');
[y,x,z]=size(I5);%图像以(y,x,z)表达灰度集,x,y为坐标,z为对应位置的
值
myI=double(I5);%转化为双精度,便于确定范围
tic % 测定算法执行的时间,开始计时
Blue_y=zeros(y,1);
for i=1:y
for j=1:x
if(myI(i,j,1)==1)
% 寻找y轴方向的白色区域
Blue_y(i,1)= Blue_y(i,1)+1; % 是蓝色区域的则进行计数
end
end
end
[temp MaxY]=max(Blue_y);%Y方向车牌区域确定 temp(最多点数):所有行中,最多的累积
PY1=MaxY;
while ((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end %Y轴方向的上限
PY2=MaxY;
while ((Blue_y(PY2,1)>=5)&&(PY2 PY2=PY2+1; end %Y轴方向的的下限 IY=I(PY1:PY2,:,:); %%%%%% X方向 %%%%%%%%% Blue_x=zeros(1,x);%进一步确定x方向的车牌区域 for j=1:x for i=PY1:PY2 %只需要扫描PY1:PY2 的部分,简化程序 if(myI(i,j,1)==1) Blue_x(1,j)= Blue_x(1,j)+1; end end end PX1=1; while ((Blue_x(1,PX1)<3)&&(PX1 PX1=PX1+1; end %确定x轴的右边界 PX2=x; while ((Blue_x(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end %确定x轴的左边界 PX1=PX1-1;%对车牌区域的校正 PX2=PX2+1; dw=I(PY1:PY2-8,PX1:PX2,:); %确定图片的截取区域 t=toc; % 读取程序的运行时间