由于车牌号码多为垂直数字,而车身引入的干扰在水平方向,进行垂直边缘检测,即可去除水平方向上颜色区别较大的干扰。该算法核心之处在于利用了车牌号码与车身干扰正好垂直的特点,仅在垂直方向检测边缘,而对水平的边缘则不予理会。垂直边缘检测,可用roberts算子、sobel算子、prewitt算子,但这些算子在这里使用效果都不好。于是作者[1]提出了采用改进后的边缘检测算子,其实也很简单,实现起来也不复杂,但效果却比较理想的,从图中就可以看出来。算法流程如下, 我这里在原文的基础上加入了中值滤波与闭运算,并采用自适应直方图均衡处理,才能达到下面的效果。算法流程如下

 

    这是改进后的边缘检测算子,其中d为字符的像素宽度,我这里设为2

得到二值图后,就能看到车牌的区域轮廓了,这时通过扫描即可得到车牌的具体位置。剩下的就是字符识别工作了。

今天看在文章上看到这个算法,那么简单却能剔除背景定位车牌,有点不可思议,按照作者的方法写程序试了一下,效果还是挺不错的,不过仅对这幅图有效,对其他的图片是没有效果的。在这里也要感谢作者能提出这种方法,这样的思路对于强干扰背景下的特征定位也是很有价值的。这里给出matlab代码,具体定位与识别方法见参考[1],车牌图片也是从原文中复制过来的。

 

  1. f=imread('CAR1.JPG');%f为原图  
  2. I1=rgb2gray(f);%I1灰度图  
  3. I2=histeq(I1);%I2进行直方图均衡化后的图  
  4. %下面进行边缘检测,用改进的roberts算法  
  5. %g(i,j)=sqrt( (f(i,j)-f(i-d,j))^2 + (f(i+d,j)-f(i,j))^2 )  
  6. % d设为车牌字符像素宽度  
  7. % ------------------------edge-----------------------------  
  8. [M, N]=size(I2);  
  9. I3=zeros(M,N);  
  10. I2=double(I2);   
  11. I3=double(I3);  
  12. d=2;  
  13. for i=1:M  
  14.     for j=1:N-d  
  15.         if(j<=d)  
  16.             %I3(i,j)=sqrt( (I2(i,j)-0)^2+(I2(i,j+d)-I2(i,j))^2 );  
  17.             I3(i,j)=0;  
  18.         else  
  19.             I3(i,j)=sqrt( (I2(i,j)-I2(i,j-d))^2+(I2(i,j+d)-I2(i,j))^2 );  
  20.         end  
  21.     end  
  22. end  
  23. %进行归一化处理,防止处理后数据超过255  
  24. maxI3 = max(max(I3));  
  25. for i=1:M  
  26.     for j=1:N  
  27.        I3(i,j)=I3(i,j)*255/maxI3;  
  28.     end  
  29. end  
  30. I2=uint8(I2);  
  31. I3=uint8(I3);%I3为边缘检测后的图  
  32. % ------------------------edge-----------------------------  
  33. I3=medfilt2(I3,[3,3]);%对I3进行中值滤波  
  34. %I4为自适应直方图均衡化  
  35. t4=graythresh(I3);  
  36. I4=im2bw(I3,t4);  
  37. I4=1-I4;%I4取反色  
  38. se4=strel('rectangle',[5,5]);  
  39. I5=imclose(I4,se4);%I5为闭运算后的图  
  40. %-------------------find the boundary---------------------  
  41. By1=255-zeros(N,1);%垂直上边界  
  42. By2=zeros(N,1);%垂直下边界  
  43. Bx1=255-zeros(M,1);%水平左边界  
  44. Bx2=zeros(M,1);%水平右边界  
  45. for i=2:M-1  
  46.     for j=2:N-1  
  47.         if( (I5(i-1,j)==1)&&(I5(i,j)==1)&&(I5(i+1,j)==0) )% h up  
  48.             By1(j)=i;  
  49.         end  
  50.         if( (I5(i-1,j)==0)&&(I5(i,j)==0)&&(I5(i+1,j)==1) )% h down  
  51.             By2(j)=i;  
  52.         end  
  53.         if( (I5(i,j)==1)&&(I5(i,j+1)==0) )% v left  
  54.             Bx1(i)=j;  
  55.         end  
  56.         if( (I5(i,j)==0)&&(I5(i,j+1)==1) )% v right  
  57.             Bx2(i)=j;  
  58.         end  
  59.     end  
  60. end  
  61. min(By1);%车牌上边界  
  62. max(By2);%车牌下边界  
  63. min(Bx1);%车牌左边界  
  64. max(Bx2);%车牌右边界  
  65. I6 = zeros( (max(By2)-min(By1)), (max(Bx2)-min(Bx1)) );%存放车牌  
  66. for i=min(By1):max(By2)  
  67.     for j=min(Bx1):max(Bx2)  
  68.         I6(i-min(By1)+1,j-min(Bx1)+1) = I2(i,j);  
  69.     end  
  70. end  
  71. I6=uint8(I6);%I6为车牌图像  
  72. figure(1);  
  73. subplot(331);imshow(f);title('original');   
  74. subplot(332);imshow(I1);title('gray');   
  75. subplot(333);imshow(I2);title('histeq');   
  76. subplot(334);imshow(I3);title('Edge+medfilt');   
  77. subplot(335);imshow(I4);title('2ValueImg');  
  78. subplot(336);imshow(I5);title('close');  
  79. subplot(337);imshow(I1);title('position');rectangle('Position',[min(Bx1),min(By1),max(Bx2)-min(Bx1),max(By2)-min(By1)],'EdgeColor',[1,0,0]);   
  80. subplot(338);imshow(I6);title('car');  

 

参考:

[1]周开军,陈三宝,徐江陵.复杂背景下的车牌定位和字符分割研究.计算机工程,2007.33(4):198-200.

 

 

 

 

分享到:
  • 上一篇:SendMessage()两程序通信与MFC手动添加用户需要的新消息及其反汇编注解
  • 下一篇:Windows编程使用__declspec(dllimport)的意义
  • posted on 2011-09-06 16:24  qqhfeng16  阅读(1259)  评论(0编辑  收藏  举报