%% 单张图片测试
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);
MATLAB车牌识别
最新推荐文章于 2024-08-09 22:08:49 发布