zqmcomputer

统计

积分与排名

最新评论

基于梯度方向图的汽车牌照定位

        经过了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;
                    
             
      }
   }

posted on 2008-06-06 13:28 风林芝 阅读(313) 评论(0)  编辑 收藏 引用 所属分类: 学习区个人日记

只有注册用户登录后才能发表评论。