资源描述
题目:BMP图像的数字识别
学号:
姓名:
BMP图像的数字识别
一、实验目的
(1)了解模版匹配算法;
(2)实现bmp格式图像印刷体数字的识别。
二、实验环境
(1)软件:WindowsXp、VisualDSP++5.0
(2)硬件:仿真器、EBF-561实验平台
三、算法描述
本实验采用模版匹配中最简单的像素点重合的方法,将待测图像中的数字与模板库中德各个数字进行对比,认为待测数字就是模板库中与其重合像素点最多的数字。当bmp图像读入实验板存储空间之后,imgbuf指针指向其像素点数据的首地址。
(1)模板库的建立
将包含0—9十个数字的十张bmp图像读入,将其像素信息分别存入十个50*50的二维数组中。实验中规定灰度值低于50的为有效像素点,其对应的二维数组中的数值定义为1,灰度值大于50的认为是无效点,其对应的二维数组中的数值定义为0.
(2)待检测图像中的数字分离
如输入图像包含n*m个数字,则需要将n*m个数字分离开之后,分别于模板库匹配并分别识别,将识别结果存入result[m*n]的数组中。
(3)模版的匹配与识别
依次识别每一位数字。将每一位数字的像素点信息存入50*50的名为t二维数组中,有效像素点定义为1,无效像素点定义为0.将得到的分离后的数字的二维数组t与各个模版进行匹配。由于模版和待测数字中德有效像素点在数组中均表示为1,可通过对应点相加之后对2 取余数再相加得到结果sum,比较待检测图像与十个模版得到的sum值,sum最小的表示重合点最多,即认为待检测数字为该数字。
四、实验步骤
(1)上机完善BMP图像的数字识别程序;
(2)搭建实验硬件环境;
(3)打开VisualDSP++集成开发环境,建立Session状态;
(4)打开并运行工程;
(5)调试程序;
(6)在实验板上检查识别效果。
五、实验结果
将程序下载到板子上,可以看到讲图片中的数字进行了正确了识别,结果稳定可靠。
六、主要程序及解释
char * ImageNumReg( int ContW,int ContH)
{
for( i=1; i<=ContH; i++)
{
for( j=1; j<=ContW; j++)
{
for( kk=0; kk<q; kk++)
{
for( mm=0; mm<q; mm++)
{
t[kk][mm] = 0;//初始化t数组
}
}
for( ii=H[i].Up; ii<H[i].Down; ii++)
{
for( jj=W[j].Left; jj<W[j].Right; jj++){
if(*(bmpimage.imgbuf+ii*bmpimage.infohead.biWidth+jj) < 50)
t[ii-H[i].Up][jj-W[j].Left] = 1;//小于50,有效置1
else
t[ii-H[i].Up][jj-W[j].Left] = 0//大于50,无效置0
}
}
for ( kk=0; kk<10; kk++)
{
ss[kk] = 0;
}
for( kk=0; kk<q; kk++)
{
for( mm=0; mm<q; mm++)//求sum值
{
ss[0] += ( a0[kk][mm]+t[kk][mm])%2;
ss[1] += ( a1[kk][mm]+t[kk][mm])%2;
ss[2] += ( a2[kk][mm]+t[kk][mm])%2;
ss[3] += ( a3[kk][mm]+t[kk][mm])%2;
ss[4] += ( a4[kk][mm]+t[kk][mm])%2;
ss[5] += ( a5[kk][mm]+t[kk][mm])%2;
ss[6] += ( a6[kk][mm]+t[kk][mm])%2;
ss[7] += ( a7[kk][mm]+t[kk][mm])%2;
ss[8] += ( a8[kk][mm]+t[kk][mm])%2;
ss[9] += ( a9[kk][mm]+t[kk][mm])%2;
}
}
for( k=0; k<9; k++)//找到最小的sum对应的数字
{
if ( ss[k]>ss[k+1])
result[(i-1)*ContW+j-1] = k+1;
else
ss[k+1] = ss[k];
}
}
}
return result;
}
七、实验总结
这次实验用到的算法在编程实现上并没有什么难度,主要是对算法和数字识别过程的理解。刚开始编程的时候走了很多弯路,主要是因为对算法实现的过程不是特别的明白,后来经过自己的仔细推敲,在做了深入理解之后,很轻松的就完成了任务。
展开阅读全文