适用于车牌在图像中的比例较大的情况。
车牌区域的字符颜色与底色在灰度上变化剧烈,导致这部分有丰富的边缘。因此,对图像进行边缘检测时可以有效凸显车牌区域。
首先,通过对图像进行灰度处理后利用sobel算子提取图像垂直边缘(车牌的垂直边缘比水平边缘更丰富,车身的水平边缘比垂直边缘更丰富),使车牌的区域在图片中的特征变得明显。然后对图像进行二值化处理,之后再对图像进行膨胀操作。根据预知知识(我国普通车牌宽度为:440mm,高度为:140mm),通过对膨胀后的图像进行连通域分析(MATLAB:bwboundaries函数),找到符合车牌特征的连通域后便可定位出车牌的位置。
连通域分析:原理:https://blog.csdn.net/qq_37059483/article/details/78018539
clc;clear;
A1=imread('car.jpg');
A=rgb2gray(A1);%灰度处理
%进行垂直边缘检测
B1=[-1 0 1;-2 0 2;-1 0 1]; %vertical
A=double(A);
B1=double(B1);
C1=conv2(A,B1);
C1=uint8(C1);
[m,n]=size(C1);
%膨胀处理(strel函数的参数可根据处理图像调节);
se=strel('square',30);
D1=imdilate(C1,se);
%计算联通域
for i=1:m
for j=1:n
if D1(i,j)~=255
D1(i,j)=0;
end
end
end
B = bwboundaries(D1,4);
%找到车牌所在的位置;
num=length(B);
for k=1:num
[data1,loc1]=max(B{k,1}(:,1));
[data2,loc2]=min(B{k,1}(:,1));
[data3,loc3]=max(B{k,1}(:,2));
[data4,loc4]=min(B{k,1}(:,2));
x1(k,1)=data2;
x1(k,2)=data4;
wid(k)=data1-data2;
high(k)=data3-data4;
end
%在原图中圈出车牌
figure
imshow(A1);hold on;
for k=1:num
if high(k)/wid(k)>=440/140*0.8
if high(k)/wid(k)<=440/140*1.2
rectangle('Position',[x1(k,2),x1(k,1),high(k),wid(k)],...
'LineWidth',1,'EdgeColor','r');hold on;
z=k;
end
end
end
%将车牌分割出来
for i=x1(z,1):x1(z,1)+wid(z)
for j=x1(z,2):x1(z,2)+high(z)
new(i-x1(z,1)+1,j-x1(z,2)+1,1)=A1(i,j,1);
new(i-x1(z,1)+1,j-x1(z,2)+1,2)=A1(i,j,2);
new(i-x1(z,1)+1,j-x1(z,2)+1,3)=A1(i,j,3);
end
end
figure
imshow(new);