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

📄 mycarlocal.m

📁 matlab车牌识别程序 我找了好久才找的 觉得好顶一个
💻 M
字号:
%程序功能:实现车牌自动定位
%作者:重庆大学 田建国 QQ:363966533
%编写时间:2007.04.10    016 021
%修改时间:2007.07.06;修改内容:增加合并区域操作,第88行开始
%修改时间:2007.12.21;修改内容:77,84行 对车牌长宽比阈值进行修改,
%     同时对候选车牌区域增加长宽限制,即该区域不能占整个图像的比例不能太小和太大
%     对检测出来无车牌的情况进行提示
% 可修改阈值如下:threshold1, threshold2, 功能: 区域合并的条件 函数mycombine的参数
%              threshold3,  功能:候选车牌区域长宽比阈值
%              threshold4   功能:车牌区域占整个图像比列阈值

clear;clc;close all
%%%%%% 阈值设置,可修改 查看阈值具体最用"Ctrl+F" 查找相关阈值名 %%%%%%%%
%%%%%%%%%%%%%%可根据实际情况修改

threshold1=0.5;     threshold2=1/20;
threshold3=2.5;     threshold4=[1/7,1/3,1/12,1/6];  %顺序为宽的最小最大,高的最小最大

filename='0003.bmp';
I=im2gray(filename);%调用自编函数读取图像,并转化为灰度图象;

tic   %计时开始

[height,width]=size(I);
%预处理
I_edge=zeros(height,width);
for i=1:width-1
    I_edge(:,i)=abs(I(:,i+1)-I(:,i));
end

I_edge=(255/(max(max(I_edge))-min(min(I_edge))))*(I_edge-min(min(I_edge)));

[I_edge,y1]=select(I_edge,height,width);   %%%%%%调用select函数
BW2 = I_edge;%

%%%%%%%%%%%%%%%%一些形态学处理
SE=strel('rectangle',[6,6]);
IM2=bwareaopen(BW2,20);%开运算,消除细小物体
IM2=imerode(IM2,SE);%腐蚀
IM3=imdilate(IM2,SE);%膨胀
SE=strel('rectangle',[5,5]);
IM3=imdilate(IM3,SE);%膨胀

%%%%%%%%%%%%%%计算区域的外接矩形
boundaries = bwboundaries(IM3);            %调用函数 bwboundaries
k=length(boundaries);
kkk=k;
rectange=cell(1,k);
for i=1:k
   b = boundaries{i};
   rectange{i}(1)=min(b(:,1));rectange{i}(2)=max(b(:,1));%矩形的行起点与终点
   rectange{i}(3)=min(b(:,2));rectange{i}(4)=max(b(:,2));%矩形的列起点与终点
   rec_center{i}=[fix((rectange{i}(1)+rectange{i}(2))/2),fix((rectange{i}(3)+rectange{i}(4))/2)];%矩形中心
   rec_ratio(i)=(rectange{i}(4)-rectange{i}(3))/(rectange{i}(2)-rectange{i}(1));%矩形长宽比
end
bp=rectange;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%对上面参数和变量的说明:rectange为一胞元,用于存放每个图像块的左上和右下两个点的坐标;
%存放格式为:rectange{k}=[x1,x2,y1,y2];x1,x2分别为行坐标,y1,y2为列坐标
%rec_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];x,y分别为行,列坐标
%rec_ratio为一矩阵,用来存放图像块的长宽比例
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%合并临近区域%%%%%%%%%%%%%

[rectange,rec_center,rec_ratio]=mycombine(rectange,height,width,threshold1,threshold2);

%调用自编函数mycombine,其中最后两个为阈值,需要调整

k=length(rectange); %更新区域个数
bp=rectange;
kkk=k;
%%%%%%%%%%%%%%合并结束%%%%%%%%%%%%%%%%%%%%%



%%%%%%%%根据区域比例判断是否为车牌区域%%%%%%%%%%%%
m=1;T=0.6*max(rec_ratio);%0.8参数需要调整
T=min(T,threshold3);   %阈值选取
for i=1:k
   % imshow(I(rectange{i}(1):rectange{i}(2),rectange{i}(3):rectange{i}(4)))
    if(rec_ratio(i)>=T&rec_ratio(i)<15)
        disw=rectange{i}(4)-rectange{i}(3);
        dish=rectange{i}(2)-rectange{i}(1);
        if((disw>=width*threshold4(1) & disw<=width*threshold4(2))...
            &(dish>=height*threshold4(3) & dish<=height*threshold4(4)))  
            
            %参数可修改
            %车牌区域宽度各高度占整个图像的大小必能太大也不能太小
            
            p1{m}=rectange{i};
            m=m+1;
        end
    end
end

%判断是否检测到车牌
if(m==1)
    toc;
    disp('检测无车牌........!');
    figure
    subplot(221);imshow(I);
    subplot(222);imshow(BW2);
    subplot(223);imshow(IM2);
    subplot(224);imshow(IM3);
    
else
    rectange=p1;clear p1;
    k=m-1;   %更新区域
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%根据颜色比判定是否为车牌%
    %%%%%需要改进
    
    l=1;
    for i=1:k
        index=rectange{i};
        if(isplate(I(index(1):index(2),index(3):index(4))))
            plate{l}=index;
            l=l+1;
        end
    end
    if(l>1)
        rectange=plate;
        k=l-1;
    end
    %%%%%%%%%%%判定结束%%%%%%%%%%%%%%%%%%%%%
    
    toc                                  %计时结束
    clear edge_IM3;clear x; clear y;     % 清空部分变量
    if(k==1)
        imwrite(I(index(1)-2:index(2),index(3):index(4)),'cp.jpg');
    end
    %%%%%%%%%%%%%%%%显示
    figure;
%     I(rectange{1}(1)-2:rectange{1}(1),rectange{1}(3)-2:rectange{1}(4)+2)=255;
%     I(rectange{1}(2):rectange{1}(2)+2,rectange{1}(3)-2:rectange{1}(4)+2)=255;
%     I(rectange{1}(1)-2:rectange{1}(2)+2,rectange{1}(3)-2:rectange{1}(3))=255;
%     I(rectange{1}(1)-2:rectange{1}(2)+2,rectange{1}(4):rectange{1}(4)+2)=255;
    imshow(I);
    imwrite(I,'I.jpg')
    subplot(221);imshow(I);
    I(rectange{1}(1),rectange{1}(3):rectange{1}(4))=255;
    I(rectange{1}(2),rectange{1}(3):rectange{1}(4))=255;
    subplot(222);imshow(BW2);
    subplot(223);imshow(IM2);
    subplot(224);imshow(IM3);
    hold on
    for i=1:kkk
        plot(bp{i}(3):bp{i}(4),bp{i}(1)*ones(1,bp{i}(4)+1-bp{i}(3)),'g');
        plot(bp{i}(3):bp{i}(4),bp{i}(2)*ones(1,bp{i}(4)+1-bp{i}(3)),'g');
        
        plot(bp{i}(3)*ones(1,bp{i}(2)+1-bp{i}(1)),bp{i}(1):bp{i}(2),'g');
        plot(bp{i}(4)*ones(1,bp{i}(2)+1-bp{i}(1)),bp{i}(1):bp{i}(2),'g')
    end
    %%%%%%%%%%%%%%%%%显示
    figure
    for i=1:k
        subplot(k,1,i)
        index=rectange{i};
        imshow(I(index(1):index(2),index(3):index(4)));
    end
end
%%%%%%%%%%%%%%%%

%figure;
%I1=I.*uint8(IM3);imshow(I1)



%plot(b(:,2),b(:,1),'g','LineWidth',3);
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -