经过了4个月的努力,终于把我的毕业设计做完了,也顺利的毕业了,心里即为自己的设计高兴的同时也开始为找工作而发愁了!我是用VC++开发平台做的数字图象处理,我现在把我的设计的实现和方法给大家看看。好了,废话不多说了,开始转入正题吧,首先说明我的方法也没有实现100%的精确定位,其算法还有待于进一步的改进,如哪位高手知道如何改,请回复我哦!
我是借鉴求指纹纹理方向图的方法来实现的,我想做图象处理和识别的friend都应该知道方向图是个什么东东了吧,我在这里就不多解释了。实现方法如下:
由梯度公式获取梯度纹理方向图
用Sobel算子分别求取水平方向、垂直方向、倾斜方向(包括45度和135度)的梯度分量,分别用Gx、Gy、Gxy、Gyx表示。
将车牌灰度图分成若干块WxW(5x5)进行分块处理,其计算量减少为对整幅图象的25倍,速度快、计算少能满足系统的实时性要求。
再分别对分块的灰度图利用已求取的Gx、Gy、Gxy、Gyx求取每块的局部方向vx、vy。
•根据反正切函数求取车牌图象的方向角度值。
a=atan(Vx(i,j)/ Vy(i,j))/2
以上步骤已经求取了图象的纹理梯度方向,主要代码如下:
CClientDC dc(this);
CPlateDoc *pDoc=GetDocument();
CPen mypen(PS_SOLID,0,RGB(0,100,126));
dc.SelectObject(&mypen);
Image *im;
im=pDoc->m_dib.DibToImage();
//---------------------------------------------
Field *im_x,*im_y,*im_jd,*im_vx,*im_vy;
Field *im_wenli;
Field *im_xy,*im_yx;
im_x=new Field(im->width,im->height);
im_y=new Field(im->width,im->height);
im_xy=new Field(im->width,im->height);
im_yx=new Field(im->width,im->height);
im_vx=new Field(im->width,im->height);
im_vy=new Field(im->width,im->height);
im_jd=new Field(im->width/W,im->height/W);
im_wenli=new Field(im->width/W,im->height/W);
//-----------------------------求取方向图------
int i,j,u,v,k,l;
for(j=0,l=1;j<im->height-W;j+=W,l++)
{
for(i=0,k=1;i<im->width-W;i+=W,k++)
{
im_x->field[k][l]=(im->ng[k-1][l+1]+2*im->ng[k][l+1]+im->ng[k+1][l+1])-
(im->ng[k-1][l-1]+2*im->ng[k][l-1]+im->ng[k+1][l-1]);//水平方向的梯度
im_y->field[k][l]=(im->ng[k-1][l-1]+2*im->ng[k-1][l]+im->ng[k-1][l+1])-
(im->ng[k+1][l-1]+2*im->ng[k+1][l]+im->ng[k+1][l+1]);//垂直方向的梯度
im_xy->field[k][l]=(im->ng[k+2][l]+2*im->ng[k+1][l+1]+im->ng[k][l+2])-
(im->ng[k-1][l+1]+2*im->ng[k][l]+im->ng[k+1][l-1]);//45方向的梯度
im_yx->field[k][l]=(im->ng[k][l-1]+2*im->ng[k+1][l]+im->ng[k+2][l+1])-
(im->ng[k-1][l]+2*im->ng[k][l+1]+im->ng[k+1][l+2]);//135方向的梯度
}
}
//---------------------------------------------
for(j=0,l=0;j<im->height-W;j+=W,l++)
{
for(i=0,k=0;i<im->width-W;i+=W,k++)
{
for(v=j;v<j+W;v++)
{
for(u=i;u<i+W;u++)
{
im_vx->field[u][v]=(2*im_x->field[u][v]*im_y->field[u][v])/(fabs(im_x->field[u][v])+fabs(im_y->field[u][v]))+(im_xy->field[u][v]*
im_xy->field[u][v]-im_yx->field[u][v]*im_yx->field[u][v])/(fabs(im_xy->field[u][v])+fabs(im_yx->field[u][v]));
im_vy->field[u][v]=(im_x->field[u][v]*im_x->field[u][v]-im_y->field[u][v]*im_y->field[u][v])/(fabs(im_x->field[u][v])+
fabs(im_y->field[u][v])) -(2*im_xy->field[u][v]*im_yx->field[u][v])/(fabs(im_xy->field[u][v])+fabs(im_yx->field[u][v]));
}
}
im_jd->field[k][l]=(atan2(-im_vx->field[k][l],-im_vy->field[k][l]))/2;
if(im_jd->field[k][l]<0)
im_wenli->field[k][l]=(im_jd->field[k][l]+2*PI)/2;
else
im_wenli->field[k][l]=im_jd->field[k][l]/2;
if(fabs(im_x->field[k][l]-im_y->field[k][l])<16 && fabs(im_xy->field[k][l]-im_yx->field[k][l])<21)
im_wenli->field[k][l]=0;
}
}
•