MATLAB车牌识别

%% 单张图片测试
clc;clear;
close all;
%% 读图
x_path='15.jpg';
x=imread(x_path);  %原图
xg=rgb2gray(x); 
imshow(xg),title('灰度图');
%% 直方图均衡(对比度拉伸)
xeq=histeq(xg);
imshow(xeq),title('直方图均衡')
%% 边缘检测
xeq1=imfilter(xeq,fspecial('average',3)); % 3*3均值平滑
xed=edge(xeq1,'prewitt');  % 3*3 sobel边缘检测
figure,imshow(xed),title('边缘检测');
%% 去除杂点
se1=[1;1;1];
xe=imerode(xed,se1);
figure,imshow(xe),title('腐蚀');
se2=strel('rectangle',[25,25]);  %25*25的全1结构元素
xeo=imclose(xe,se2);
figure,imshow(xeo),title('腐蚀+开运算');
%% 筛选
xcut=bwareaopen(xeo,1000);  %切去面积小于1000的区域
figure,imshow(xcut),title('除去小面积');
info=regionprops(xcut,'area','boundingbox');  %获取连通区域信息,内部结构体
yes=0;
rects=cat(1,info.BoundingBox);  %把各个区域的位置信息存放在rects中
l_rects=size(rects,1);  %连通区域个数
new=[];
m=1;
for i=1:l_rects   %计算区域高/宽的比例,二次筛选区域
    if (rects(i,4)/rects(i,3))<0.3 
        new(m,:)=rects(i,:);
        m=m+1;
    end
end
l_new=size(new,1);  %
%% 蓝色检测
blue_pixel=0;
last=[];
for a=1:l_new   %l_new为区域个数
    for b=ceil(new(a,2)):(ceil(new(a,2))+new(a,4))   %行,从上到下
        for c=ceil(new(a,1)):(ceil(new(a,1))+new(a,3))  %列,从左到右
            if x(b,c,1)<=50 && x(b,c,2)>=50 && x(b,c,2)<=200 && x(b,c,3)>=150  %蓝色像素判断
                blue_pixel=blue_pixel+1;
            end
            
            if blue_pixel/(new(a,3)*new(a,4))>0.1  %蓝色像素占比>0.5,就把区域信息放入最终的last矩阵
                last=cat(1,new(a,:));
            end
        end
    end
end

for j=1:size(last,1)     %在图上画红框
    rectangle('position',last(j,:),'EdgeColor','r');
end
%% 裁剪
toal_cut=[];
cut=[];
for d=1:size(last,1)
    cut=imcrop(xg,last(d,:));
end
imshow(cut);

猜你喜欢

转载自blog.csdn.net/qq_34440148/article/details/84321692
今日推荐