因为团队考核遇到题目,费了不少时间完成,将学习的过程记录下来吧。车牌识别分为4个步骤,第一是定位蓝色车牌区域;第二是旋转图像;第三是剪切蓝色车牌图像;第四是分割字符并输出到屏幕。
第一步:定位蓝色车牌区域
%% 定位蓝色车牌区域 f=imread('D:\Myron\个人\照片\5.jpg'); fg=rgb2gray(f); gray=3*f(:,:,3)-f(:,:,1)-f(:,:,2); figure,imshow(gray),title('保留蓝色色域'); level=graythresh(gray); %利用Ostu法获取图像的阈值 bw=im2bw(gray,level); %根据Ostu法分割车牌图像 % figure,imshow(bw),title('二值化后的图像'); bw1=bwareaopen(bw,500);%删除面积小于500的区域 % figure,imshow (bw1),title ('删除小面积区域后的图像') ; se=strel('cube',15);%创建一个边长为15的正方形 bw2=imclose(bw1,se);%闭运算连使整个车牌区域连接在一起 % figure,imshow(bw2),title('进行闭运算后的车牌');`
第二步:旋转图像
在此步骤中我们使用radon变换,具体如何实现可查看其他大牛的详细解释,在这里就不详细描述了,毕竟学习是一个自己探索真理的过程,fighting!
%% 车牌矫正(利用radon变换) theta=0:179; r=radon(bw2,theta); [m,n]=size(r); c=0; for i=1:m for j=1:n if r(1,1)<r(i,j) r(1,1)=r(i,j); c=j; end end end rot=90-c; fx=imrotate(f,rot,'crop'); % figure;imshow(fx);title('旋转后的图像');
第三步:剪切蓝色车牌图像
在实现过程中遇到了regionprops函数,真是非常的友好。下面的字符分割我也是使用了这个函数,非常的简洁。
%% 剪切定位车牌区域 s1=regionprops(bw2,'BoundingBox','Centroid') ; %获取车牌矩形区域,即二值图中值为1的矩形框 xy=s1(1).BoundingBox;%获取车牌矩形区域左上角坐标及矩形的长和宽, xy(1)为矩形框左上角的y坐标,xy(2)为矩形框左上角的x坐标 fcrop=f(round(xy(2)):round(xy(2) xy(4)),round(xy(1)):round(xy(1) xy(3)),:) ; % figure,imshow (fcrop),title('定位剪切后的蓝色车牌图像');
第四步:分割字符并输出到屏幕
想用利用regionprops函数进行字符分割,就必须保证每一个车牌字符通过形态学处理后都分别为单独的连通区域,由于我的车牌干扰因素比较多,形态学处理也略微复杂了一些,对于其他干扰因素较少的图像来说,简单处理后就可以使用此函数。然后通过for循环挨个输出。
%% 分割字符 fgray=rgb2gray(fcrop); level2=graythresh(fgray); bw3=im2bw(fgray,level2); % figure;imshow(bw3);title('定位剪切后的二值图像'); se2=strel('line',2,90); se3=strel('cube',4); se4=strel('disk',1); bw3o=bwareaopen(bw3,30); figure;imshow(bw3o);title('删除小于20面积后的图像'); bw3oe=imerode(bw3o,se4); figure;imshow(bw3oe);title('二值图像腐蚀后') bw3oc =imclose(bw3oe,se2); figure;imshow(bw3oc);title('二值图像闭运算后'); bw4=imclearborder(bw3oc); figure;imshow(bw4); bw4d=imdilate(bw4,se3); bw4d=imdilate(bw4d,se3); figure;imshow(bw4d);title('膨胀后的图像'); bw5=bwareaopen(bw4d,400); figure;imshow(bw5);title('删除小于400后的图像'); s2=regionprops(bw5,'BoundingBox','Centroid'); for i=1:length(s2) xy=s2(i).BoundingBox; bw6=fcrop(floor(xy(2)):floor(xy(2) xy(4)),floor(xy(1)):floor(xy(1) xy(3)),:); subplot(1,7,i);imshow(bw6);title(num2str(i)); end
#偷个懒,直接全部一起奉上。嘻嘻
#原图像
这次的考核也算是侥幸过关,加入团队,接下来的日子里多多努力吧!希望在看的你们也可以为了选择想要的生活而不断前进,披荆斩棘,最终到达山巅。
#最后附上旅游时拍下的美丽重庆夜景图
联系客服