📄 untitled.m
字号:
close all;
clc
clear all;
[filename, pathname] = uigetfile({'*.bmp;*.tif;*.jpg','MATLAB Files (*.bmp,*.tif,*.jpg)'}, 'Choose a File');
I = imread( strcat(pathname,filename));
I=imresize(I,[256 256]);
Igray=rgb2gray(I);
figure,imshow(Igray);
xlabel('原始图像');
%%%%%%%%%%%%%%%%--------------中值滤波---------------%%%%%%%%%%%%%%%%%
Im=medfilt2(Igray);
figure,imshow(Im);
xlabel('中值滤波');
%%%%%%%%%%%%%%%%--------------sobel---------------%%%%%%%%%%%%%%%%%
[gx,gy]=gradient(double(Im));
I1=abs(gx);
h=[-1,0,1;-2,0,2;-1,0,1];
I1=conv2(I1,h,'same');
figure,imshow(I1,[])
xlabel('水平差分')
% VPro = sum(I1,1);%垂直投影
% figure
% stairs(VPro)
% xlabel('垂直投影');
I2=abs(gy);
h=[-1,0,1;-2,0,2;-1,0,1];
I2=conv2(I2,h,'same');
figure,imshow(I2,[])
xlabel('垂直差分')
I=int8((I1.^2+I2.^2).^0.5);
Is=I;
figure
imshow(I,[])
xlabel('叠加后')
%%%%%%%%%%%%%%%%-------------ostu算法----------------%%%%%%%%%%%%%%%
T=Is;
[m,n]=size(T);
N=m*n;
num=zeros(1,256);
p=zeros(1,256);
for i=1:m
for j=1:n
num(T(i,j)+1)=num(T(i,j)+1)+1;
end
end
for i=0:255;
p(i+1)=num(i+1)/N;
end
totalmean=0;
for i=0:255;
totalmean=totalmean+i*p(i+1);
end
maxvar=0;
for k=0:255
kk=k+1;
zerosth=sum(p(1:kk));
firsth=0;
for h=0:k
firsth=firsth+h*p(h+1);
end
var=totalmean*zerosth-firsth;
var=var*var;
var=var/(zerosth*(1-zerosth)+0.01);
var=sqrt(var);
if(var>maxvar)
maxvar=var;
point=k;
end
end
threshold=point;
Is(find(Is<threshold))=0;
Is(find(Is>=threshold))=1;
figure,imshow(Is,[]);
xlabel('二值化后图像');
%%%%%%%%%%%%%%%%-------------数学形态----------------%%%%%%%%%%%%%%%
SE= strel('square',3);
Is1=imdilate(Is,SE);
Is2=imdilate(Is1,SE);
Is3=imdilate(imerode(Is2,SE),SE);
Is4=imerode(Is3,SE);
Is5=imerode(Is4,SE);
Is6=imerode(Is5,SE);
figure,imshow(Is6,[]);
xlabel('数学形态运算后的联通区域');
%%%%%%%%%%%%%%%%-------------去除噪声&&区域矩形化----------------%%%%%%%%%%%%%%%
[area1,num1] = bwlabel(Is6,4);
if (num1>2) || (num1==2)
for n=1:num1
[x,y]=find(area1==n);
Xmax=max(x);Ymax=max(y);Ymin=min(y);Xmin=min(x);
X = Xmax - Xmin; Y = Ymax - Ymin;
S=X*Y;l=length(x);num=0;
for k = 1:l
if Is6(x(k),y(k)) == 1;
num=num+1;
end
end
if num<=200
for k = 1:l
Is6(x(k),y(k)) = 0;
end
end
% l=length(x);w=length(y);
% for i = 1:l
% for j=1:w
% Is6(x(i),y(j)) = 1;
% end
% end
end
end
figure,imshow(Is6,[]);
xlabel('去除噪声后的矩形化连通区域');
%%%%%%%%%%%%%%%%-------------区域矩形化----------------%%%%%%%%%%%%%%%
% [area2,num2] = bwlabel(Is6,4);
% for n=1:num2
% [x,y]=find(area2==n);
% l=length(x);w=length(y);
% for i = 1:l
% for j=1:w
% Is6(x(i),y(j)) = 1;
% end
% end
% end
% figure,imshow(Is6);
% xlabel('矩形化后的连通区域');
%%%%%%%%%%%%%%%%-------------车牌提取----------------%%%%%%%%%%%%%%%
[area3,num3] = bwlabel(Is6,4); %%车牌宽高比验证
if (num3>2) || (num3==2)
for n=1:num3
[x,y]=find(area3==n);
Xmax=max(x);Ymax=max(y);Ymin=min(y);Xmin=min(x);
X = Xmax - Xmin; Y = Ymax - Ymin;
l=length(x);
if Y/X >=5 | Y/X <=2
for k = 1:l
Is6(x(k),y(k)) = 0;
end
end
end
end
figure,imshow(Is6,[]);
xlabel('宽高比验证后剩余区域');
[area4,num4] = bwlabel(Is6,4);
if (num4>2) || (num4==2)
for n=1:num4
[x,y]=find(area4==n);
Xmax=max(x);Ymax=max(y);Ymin=min(y);Xmin=min(x);
X = Xmax - Xmin; Y = Ymax - Ymin;
S=X*Y;l=length(x);num=0;
for k = 1:l
if Is6(x(k),y(k)) == 1;
num=num+1;
end
end
if num/S<0.25
Is6(x(k),y(k)) = 0;
end
end
end
figure,imshow(Is6,[]);
xlabel('字符与后选区域像素所占比例满足条件的区域');
[area5,num5] = bwlabel(Is6,4);
if (num5>2) || (num5==2)
for n=1:num5
[x,y]=find(area4==n);
Xmax=max(x);Ymax=max(y);Ymin=min(y);Xmin=min(x);
X = Xmax - Xmin; Y = Ymax - Ymin;
II=Is(Xmin:Xmax,Ymin:Ymax); half=floor(X/2);
[height1,width1]=size(II);
if half==0
for k = 1:length(x)
Is6(x(k),y(k)) = 0;
end
else
for h=half:half+2
zero=0;
for k=1:width1-1
if II(h,k) == 0 & II(h,k+1) ==1
zero=zero+1;
end
end
if zero<5 |zero>15
for k=1:width1
Is6(x(k),y(k)) = 0;
end
end
end
end
end
end
[area6,num6] = bwlabel(Is6,4);
[x,y]=find(area6==1);
Xmax=max(x);Ymax=max(y);Ymin=min(y);Xmin=min(x);
card= I(Xmin:Xmax,Ymin:Ymax,:);
figure;
subplot(2,1,1);
imshow(card,[]);
xlabel('提取车牌');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -