数字图像处理实习报告.docx
《数字图像处理实习报告.docx》由会员分享,可在线阅读,更多相关《数字图像处理实习报告.docx(15页珍藏版)》请在冰豆网上搜索。
数字图像处理实习报告
数字图像处理实习报告
实习项目名称:
OCR-车牌号码识别
所属课程名称:
数字图像处理
班级:
信息10-2
学号:
0221
姓名:
王铎
指导教师:
邢砾云
一、实习目的
(1)掌握数字图像处理的相关知识及算法。
(2)学习在VC环境下编写车牌定位与识别程序。
(3)了解车牌定位方法,如边缘检测法,基于矢量量化的车牌定位法等。
(4)了解车牌字符分割方法,如,投影法,基于车牌字符先验知识的字符分割方法等。
(5)了解车牌字符识别方法,如字符归一化,投影法,基于数字和字母特征的模板匹配法。
(6)运用编写的车牌定位与识别程序实现在各种环境下车牌的识别。
二、实习原理
基于VC++图像处理的汽车牌照识别系统主要包括车牌定位,字符车牌分割和车牌字符识别三个关键环节其识别流程图如图1所示。
图1识别流程图
其中,
(1)原始图像:
原始的汽车图像;
(2)图像预处理:
对采集到的图像进行滤波等处理以克服图像干扰;
(3)车牌定位:
计算边缘图像的投影面积,寻找峰谷点,大致确定车牌位置,再计算此连通域内的宽高比,剔除不在域值范围内的连通域,最后得到的便为车牌区域;
(4)字符分割:
利用投影检测的字符定位分割方法得到车牌的字符;
(5)字符数据库:
为第6步的字符识别建立字符模板数据库;
(6)字符识别:
通过基于模板匹配的人工神经网络算法,通过特征对比或训练识别出相关的字符,得到最后的汽车牌照,包括英文字母和数字。
三、实习步骤
请打开一个BMP格式的位图文件:
标示图象的坐标标示算子的坐标标识区域的地点
完成车牌定位的整个过程
程序流程:
1.产生副本
2.水平差分提取边缘,寻找横向的车牌带状区域
3.垂直差分提取边缘,寻找纵向的车牌带状区域
4.利用先验知识标识车牌区域,进行车牌带状区域的选择,(横纵向)
5.构造出车牌矩形域;
6.再次利用利用跳变数选择车牌矩形区域,进行车牌区域的最终选择;
7.精确定位车牌,即削弱车牌横向宽度;
8.更新图象;
水平差分提取图象边缘
程序流程:
1.逐行扫描,sub=|f(x,y)-f(x,y+1)|;
2.若差值小于20,则g(x,y)=0;
若差值大于30,则增强原图象,令g(x,y)=g(x,y)+30;
3.另最后一列全部为0,即黑色;
完成图象车牌区域的初步定位。
程序流程:
1.利用间行扫描的方式找出跳变数最大的前10行;
2.对Top10行进行区域细粒度增长选择;
其相似度的选取为:
~倍的该行跳变总数;
3.二值化,threshold=255;
4.任意选择一列,最好不要边缘列,可能有干扰(本程序选择为第十列),搜索出各个带状候选域,存入标志;
利用先验知识标识车牌区域,进行车牌区域的选择
函数说明:
特定应用条件,拍摄所得车牌的区域高度、宽度均有一定的范围,其大小可以分析图象后可得
根据统计得到:
车牌的顶部极少出现在高度小于100个像素的区域;
车牌高度也一般大于20个像素。
程序的最终结果为满足条件的经过扩展了的带状区域
程序流程:
1.舍弃区域顶部小于100的待选域
2.选择区域高度大于20的待选域
3.区域扩展,上下各增大5个像素。
若顶部小于5,则顶部坐标不变,高度加5;
若底部大于图象的底部,则底部坐标不变,高度加5;
水平查找后,纵向查找。
完成图象车牌区域的初步定位。
程序流程:
1.利用间行扫描的方式找出跳变数最大的前30行;
2.对Top30行进行区域增长;
其相似度的选取为:
~倍的该行跳变总数;
3.二值化,threshold=255;
4.任意选择一列,(本程序选择为第十行),搜索出各个带状候选域,存入标志;
利用先验知识标识车牌区域,进行车牌区域的选择,(横纵向)
函数说明:
国家标准:
车牌的宽高比近似为3:
1;
程序流程:
1.初始化存储数组
2.选择区域高宽比大于3的待选域
函数功能:
再次利用利用跳变数选择车牌区域,进行车牌区域的最终选择,(横纵向)
程序流程:
1.初始化存储数组
2.计算每个伪车牌区域的跳变数
3.选择具有最大跳变数的区域为车牌区
计算伪车牌区的跳变平均数
程序流程:
1.初始化;
2.水平差分,边缘提取;
3.选择车牌的中间1/3行来计算每个伪车牌区域的跳变平均数;
找出所有伪车牌区域中具有最大跳变平均数的区域号,精确定位车牌
程序说明:
选择排序,由于水平分割出的伪车牌区域已经比较准确,故仅作垂直方向的进一步定位(缩小宽度)
找出车牌的左右边缘
程序流程:
1.水平差分,二值化;
2.垂直方向投影,统计各列的投影值;
3.去除噪声点;
4.找出左右边缘
5.计算车牌宽度
6.车牌精确定位赋值
二值化图象
程序说明:
threshold=average+delt;
程序流程:
1.计算图象均值;
2.计算图象方差;
3.二值化
车牌字符分割
程序流程:
1.区域扩展;
2.投影分割;
3.字符区域的获取;
水平方向投影,分割出字符
程序流程;1.统计各列白象素个数;
2.平滑投影曲线;
3.寻找波谷(trough)进行分割;
四、实验程序
车牌识别
计各列白象素个数;
滑投影曲线;
找波谷(trough)进行分割;
eature[j]);
}
for(j=9;j<13;j++)
{
diff+=fabs(feature[j]-sa[num].feature[j])*9;
}
if(diff{
min=diff;
("%s",sa[num].trueClass);
}
}
returnResult;
}*/
>0)
;
;
;
;
/cDatas[k].w>4)
{
if(recgpos!
=1&&recgpos<8)
{
classResult=classResult+"1";
recgpos++;
}
continue;
}
for(intx=0;x{
for(inty=0;y{
[y][x]=cDatas[k].Img[x*cDatas[k].w+y];
}
}
=cDatas[k].h;
=cDatas[k].w;
();
();
;x++)
{
for(inty=0;y{
[y][x]=cDatas[k].Img[x*cDatas[k].w+y];
}
}
=cDatas[k].h;
=cDatas[k].w;
();
();
();
pchview->(0,-1);
pchview->("");
CStringstrInfo,strTemp;
("");
inti,j;
for(i=0;i<;i++)
{
for(j=0;j<;j++)
{
if[j][i]==1)
strInfo+="■";
else
strInfo+="";
}
strInfo+="\r\n";
}
pchview->(0,-1);
pchview->(strInfo);
if()==IDOK)
{
CStringclassResult;
m_class=;
();
();
();
Sampletemp;
for(i=0;i<13;i++)
[i]=[i];
memcpy,(constchar*)m_class,3*sizeof(char));
if[1]=='\0')
{
if[0]>='0'&&[0]<='9')
{
=();
(temp);
}
if[0]>='A'&&[0]<='Z')
{
=();
(temp);
}
}
elseif[2]=='\0')
{
=();
(temp);
}
}
}
五、实习结果
原始图像
车牌识别
中值:
因为把AT2205变成AT2202,2有毛刺现象,所以中值使其变平滑。
车牌号的定位,二值化,归一化,细化
车牌号定位二值化归一化细化
车牌号识别结果
结果正确:
结果错误:
六、实习心得
一周的数字图像处理实习很快就结束了,总的来说收货很大,实习以分组形式,我们四人一组合作完成。
通过一周以来我们共同的努力以及老师的的细心指导,终于完成了设计要求。
开始时是设计阶段也没太在意,后来到动手的时候觉得遇见了好多没想到的问题,然后一个一个的解决,我想这也是最吸引我们的地方,让我深深领会到我们课程的乐趣。
这周的实习让我收获颇多。
使我对图像处理的原理有了一个更加深我们对数字图形处理课程理论知识的认识和理解,使我找到了理论与实践的最佳结合点。
以前可能只是简单的了解记住课本一些原理,通过自己编写程序将理论付诸实践后。
但这次实习又不同于以往做的实验,以前做实验的时候都使用MATLAB软件,这次用的是C++,所以这次实习对我来说又是一个新的挑战。
我必须重新翻阅有关C++的书籍,那些知识更加使我真正明白并深记着,尤其能找到一些以前会忽略的细节。
这为我们以后做有关图像处理方面的工作打下了一个很好的基础。
这次实习虽然短暂,但是我们自主合作完成的劳动成果,将理论的内容完完全全的在实际中实现。
在设计的过程中,遇到了书本中不曾学到的情况。
同时,由于是两个人合作,让我知道团队协作是多么的重要。
最后,感谢老师为我们提供这次实习机会和悉心的指导。