由于车牌号码多为垂直数字,而车身引入的干扰在水平方向,进行垂直边缘检测,即可去除水平方向上颜色区别较大的干扰。该算法核心之处在于利用了车牌号码与车身干扰正好垂直的特点,仅在垂直方向检测边缘,而对水平的边缘则不予理会。垂直边缘检测,可用roberts算子、sobel算子、prewitt算子,但这些算子在这里使用效果都不好。于是作者[1]提出了采用改进后的边缘检测算子,其实也很简单,实现起来也不复杂,但效果却比较理想的,从图中就可以看出来。算法流程如下, 我这里在原文的基础上加入了中值滤波与闭运算,并采用自适应直方图均衡处理,才能达到下面的效果。算法流程如下
这是改进后的边缘检测算子,其中d为字符的像素宽度,我这里设为2。
得到二值图后,就能看到车牌的区域轮廓了,这时通过扫描即可得到车牌的具体位置。剩下的就是字符识别工作了。
今天看在文章上看到这个算法,那么简单却能剔除背景定位车牌,有点不可思议,按照作者的方法写程序试了一下,效果还是挺不错的,不过仅对这幅图有效,对其他的图片是没有效果的。在这里也要感谢作者能提出这种方法,这样的思路对于强干扰背景下的特征定位也是很有价值的。这里给出matlab代码,具体定位与识别方法见参考[1],车牌图片也是从原文中复制过来的。
- f=imread('CAR1.JPG');%f为原图
- I1=rgb2gray(f);%I1灰度图
- I2=histeq(I1);%I2进行直方图均衡化后的图
- %下面进行边缘检测,用改进的roberts算法
- %g(i,j)=sqrt( (f(i,j)-f(i-d,j))^2 + (f(i+d,j)-f(i,j))^2 )
- % d设为车牌字符像素宽度
- % ------------------------edge-----------------------------
- [M, N]=size(I2);
- I3=zeros(M,N);
- I2=double(I2);
- I3=double(I3);
- d=2;
- for i=1:M
- for j=1:N-d
- if(j<=d)
- %I3(i,j)=sqrt( (I2(i,j)-0)^2+(I2(i,j+d)-I2(i,j))^2 );
- I3(i,j)=0;
- else
- I3(i,j)=sqrt( (I2(i,j)-I2(i,j-d))^2+(I2(i,j+d)-I2(i,j))^2 );
- end
- end
- end
- %进行归一化处理,防止处理后数据超过255
- maxI3 = max(max(I3));
- for i=1:M
- for j=1:N
- I3(i,j)=I3(i,j)*255/maxI3;
- end
- end
- I2=uint8(I2);
- I3=uint8(I3);%I3为边缘检测后的图
- % ------------------------edge-----------------------------
- I3=medfilt2(I3,[3,3]);%对I3进行中值滤波
- %I4为自适应直方图均衡化
- t4=graythresh(I3);
- I4=im2bw(I3,t4);
- I4=1-I4;%I4取反色
- se4=strel('rectangle',[5,5]);
- I5=imclose(I4,se4);%I5为闭运算后的图
- %-------------------find the boundary---------------------
- By1=255-zeros(N,1);%垂直上边界
- By2=zeros(N,1);%垂直下边界
- Bx1=255-zeros(M,1);%水平左边界
- Bx2=zeros(M,1);%水平右边界
- for i=2:M-1
- for j=2:N-1
- if( (I5(i-1,j)==1)&&(I5(i,j)==1)&&(I5(i+1,j)==0) )% h up
- By1(j)=i;
- end
- if( (I5(i-1,j)==0)&&(I5(i,j)==0)&&(I5(i+1,j)==1) )% h down
- By2(j)=i;
- end
- if( (I5(i,j)==1)&&(I5(i,j+1)==0) )% v left
- Bx1(i)=j;
- end
- if( (I5(i,j)==0)&&(I5(i,j+1)==1) )% v right
- Bx2(i)=j;
- end
- end
- end
- min(By1);%车牌上边界
- max(By2);%车牌下边界
- min(Bx1);%车牌左边界
- max(Bx2);%车牌右边界
- I6 = zeros( (max(By2)-min(By1)), (max(Bx2)-min(Bx1)) );%存放车牌
- for i=min(By1):max(By2)
- for j=min(Bx1):max(Bx2)
- I6(i-min(By1)+1,j-min(Bx1)+1) = I2(i,j);
- end
- end
- I6=uint8(I6);%I6为车牌图像
- figure(1);
- subplot(331);imshow(f);title('original');
- subplot(332);imshow(I1);title('gray');
- subplot(333);imshow(I2);title('histeq');
- subplot(334);imshow(I3);title('Edge+medfilt');
- subplot(335);imshow(I4);title('2ValueImg');
- subplot(336);imshow(I5);title('close');
- subplot(337);imshow(I1);title('position');rectangle('Position',[min(Bx1),min(By1),max(Bx2)-min(Bx1),max(By2)-min(By1)],'EdgeColor',[1,0,0]);
- subplot(338);imshow(I6);title('car');
参考:
[1]周开军,陈三宝,徐江陵.复杂背景下的车牌定位和字符分割研究.计算机工程,2007.33(4):198-200.