关于图像处理之“车牌识别”

车牌识别

1、车牌识别流程

1.1 车牌提取

Created with Raphaël 2.1.0 开始 (1)读取图像 (2)灰度化 (3)灰度拉伸 (4)腐蚀 (5)拉伸减去腐蚀 (6)二值化 (7)中值滤波 (8)腐蚀去噪 (9)膨胀恢复车牌位置 (10)水平投影 (11)分割ROI 结束

(3)灰度拉伸

Created with Raphaël 2.1.0 开始 统计直方图 计算概率 结束

OpenCV2.1.0
直方图统计后,除以图像总像素即为概率,根据灰度值大小(0~255),对灰度值进行变上限积分,求取概率分布函数。取得分布函数后,以10%和90%概率区间的位置作为上下阈值,高于90%阈值为255,低于10%,设置为0,位于该区域之间,则以255的总大小进行拉伸y=(x-low)/(high-low)*255

        //求存放图象各个灰度级出现的次数
        for(int y=0;yheight;y++)
        {
            uchar * ptr=(uchar*)(src->imageData +y*src->widthStep);
            for(int x=0;xwidth;x++)
            {
                stretch_num[ptr[x]]++;
            }
        }
        //求存放图像各个灰度级的出现概率
        for(int i=0;i<256;i++)
            {
                stretch_p[i]=stretch_num[i]/(src->width*src->height);
            }

        //求存放各个灰度级之前的概率和
        for(int i=0;i<256;i++)
            {
                for(int k=0;k<=i;k++)
                    stretch_p1[i]+=stretch_p[k];
            }
            //统计出两个阈值点的值
        for(int i=0;i<256;i++)
            {
                if(stretch_p1[i]<0.1) //low_value 取接近10%的总像素的灰度值
                {
                  low_value=i;
                 }
                if(stretch_p1[i]>0.9) //high_value取接近90%的总像素的灰度值
                {
                   high_value=i;
                   break;
                }
            }
        rate=(float)255/(high_value-low_value+1);
      //进行灰度拉伸
          for(int y=0;yheight;y++)
            {
                uchar * ptr_src=(uchar *)(src->imageData+y*src->widthStep);
                uchar * ptr_dst=(uchar *)(dst->imageData+y*dst->widthStep);
                for(int x=0;xwidth;x++)
                {
                    if(ptr_src[x]0;
                    }
                    else if(ptr_src[x]uchar)((ptr_src[x]-low_value)*rate+0.5);
                            if(ptr_dst[x]>255)
                                ptr_dst[x]=high_value;
                    }
                    else if(ptr_src[x]>=high_value)
                    {
                        ptr_dst[x]=255;
                    }
                }
          }

中值滤波
从第二行到倒数第二行,每个元素取5*1窗口,元素分别来自于相邻5行同一列,取中值作为中间像素值

//中值滤波
    for(int j=2;jheight-2;j++)
    {  
        uchar *ptr_dst=(uchar*)(dst->imageData+j*dst->widthStep);
        for(int i=0;iwidth;i++)
        {
            //把5*1屏蔽窗口的所有像素值放入pFilter_Image_Pixel[m]
            int m=0;
            for(int y=j-2;y<=j+2;y++)
            {
                uchar *ptr_src=(uchar*)(src->imageData+y*src->widthStep);
                for(int x=i;x<=i;x++)
                {
                    pFilter_Image_Pixel[m]=ptr_src[i];
                    m++;
                }
            }
            //把pFilter_Image_Pixel[m]中的值按降序排列
            do{
                    flag=0;
                    for(int m=0;m<4;m++)
                    {
                        if(pFilter_Image_Pixel[m]1])
                        {
                            temp=pFilter_Image_Pixel[m];
                            pFilter_Image_Pixel[m]=pFilter_Image_Pixel[m+1];
                            pFilter_Image_Pixel[m+1]=temp;
                            flag=1;
                        }
                     }
               }while(flag==1);
            mid_pixel_value=pFilter_Image_Pixel[2];//求中值mid_pixel_value
            ptr_dst[i]=mid_pixel_value;//将中值赋给目标图像的当前点
        }
    }

1.2 车牌校正

第三步

1.3 车牌字符提取

第四步

1.4 车牌字符识别

第五步

你可能感兴趣的:(关于图像处理之“车牌识别”)