⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 untitled.m

📁 基于结构特征的车牌定位算法研究改进算法 改程序简单使用
💻 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 + -