基于matlab的车牌识别设计程序 下载本文

内容发布更新时间 : 2024/5/16 11:00:36星期一 下面是文章的全部内容请认真阅读。

Main程序

%function [d] = main(jpg)

% ------------------------------------------------------------------------- % - 读取图片, 转化成灰度值, 搜索边缘 clear all; clc; close all;

I = imread('1a.JPG'); %读取图像 I = imresize(I,[300 500]);

figure(1); imshow(I); title('原图'); I1 = rgb2gray(I);

figure(2); subplot(1,2,1); imshow(I1); title('灰度图');

figure(2); subplot(1,2,2); imhist(I1); title('灰度图直方图');

I2 = edge(I1, 'roberts', 0.08, 'both'); %如果图片模糊,比如, 对于 2b.jpg 调小为 0.05,

%如果图片比较清晰1a.jpg, 3c.jpg, 7.jpg, 要用0.08

o.jpg用 0.019 figure(3); imshow(I2); title('robert算子边缘检测'); % --------------------------------------------

% image_process进行图像的分割, 定位处理车牌位置 d = image_process(I, I2);

% -------------------------------------------

% - 根据车牌位置, 进行车牌号码识别

nameRt = license_plate(d); % nameRt是出来的车牌号码 % ------------------------------------------- fprintf('...............................\\n');

fprintf(['识别出来的车牌号是: ', nameRt, '\\n\\n']); % ------------------------------------------

nameRt = regexprep(nameRt, '^yun', ''); if ~isempty(regexp(nameRt, '^A'))

fprintf('这个车牌是: 云A 昆明市\\n'); elseif ~isempty(regexp(nameRt, '^C')) fprintf('这个车牌是: 云C 昭通市\\n'); elseif ~isempty(regexp(nameRt, '^D'))

fprintf('这个车牌是: 云D 曲靖市\\n'); elseif ~isempty(regexp(nameRt, '^E'))

fprintf('这个车牌是: 云E 楚雄彝族自治州\\n'); elseif ~isempty(regexp(nameRt, '^F')) fprintf('这个车牌是: 云F 玉溪市\\n'); elseif ~isempty(regexp(nameRt, '^G'))

fprintf('这个车牌是: 云G 红河哈尼族彝族自治州\\n'); elseif ~isempty(regexp(nameRt, '^H'))

fprintf('这个车牌是: 云H 文山壮族苗族自治州\\n'); elseif ~isempty(regexp(nameRt, '^J')) fprintf('这个车牌是: 云J 普洱市\\n'); elseif ~isempty(regexp(nameRt, '^K'))

fprintf('这个车牌是: 云K 西双版纳傣族自治州\\n'); elseif ~isempty(regexp(nameRt, '^L'))

fprintf('这个车牌是: 云L 大理白族自治州\\n'); elseif ~isempty(regexp(nameRt, '^M'))

fprintf('这个车牌是: 云M 保山市\\n'); elseif ~isempty(regexp(nameRt, '^N'))

fprintf('这个车牌是: 云N 德宏傣族景颇族自治州\\n'); elseif ~isempty(regexp(nameRt, '^P')) fprintf('这个车牌是: 云P 丽江市\\n'); elseif ~isempty(regexp(nameRt, '^Q'))

fprintf('这个车牌是: 云Q 怒江僳僳族自治州\\n'); elseif ~isempty(regexp(nameRt, '^R'))

fprintf('这个车牌是: 云R 迪庆藏族自治州\\n'); elseif ~isempty(regexp(nameRt, '^S')) fprintf('这个车牌是: 云S 临沧市\\n'); else

fprintf('这个车牌不属于云南地区, 或未记录此车牌\\n'); end

fprintf('...............................\\n');

子程序1 getword

function [word, pc, cname] = getword(d)

% - 这个函数用来将字形和模板比对, 识别出号码. 只有相关性> 0.5 才被接受. Ix = find(sum(d,2) > 0); Iy = find(sum(d,1) > 0);

d = d(min(Ix): max(Ix), min(Iy):max(Iy)); d = imresize(d, [100, 100], 'nearest'); dirInfo = dir('字符模板'); templete = struct(); num = 0;

for i = 1:length(dirInfo)

if ~strcmp(dirInfo(i).name, '.') & ~strcmp(dirInfo(i).name, '..') num = num + 1;

C = imread(['字符模板\\', dirInfo(i).name]); templete(num).data = imresize(C, [100, 100]); templete(num).name = dirInfo(i).name; end end P = [];

for i = 1:length(templete)

P(i) = corr2(templete(i).data, d); end

[~, I] = max(P); if P(I) > 0.5

word = templete(I).data; cname = templete(I).name; cname = cname(1:end - 6); else

word = []; cname = ''; end pc = P(I);

子程序2 image_process

function d = image_process(I, I2) se = [1;1;1;1];

I3 = imerode(I2,se);

figure(4); imshow(I3); title('腐蚀后图像');

se = strel('rectangle', [40,40]); %构造结构元素,以长方形构造一个se

I4=imclose(I3,se); %闭运算,平滑图像轮廓,去掉小洞,填补缝隙 figure(5); imshow(I4); title('平滑图像的轮廓');

I5 = bwareaopen(I4,500); %从二进制图像中移除所有少于p像素的连接的组件,产生另一个二进制图像

figure(6); imshow(I5); title('从对象中移除小对象');

[y,x,z] = size(I5);%返回I5各维的尺寸,并储存在变量y、x、z中 myI = double(I5); %换成双精度数值 ?gin横向扫描

tic %计算tic与toc之间程序的运行时间 Blue_y=zeros(y,1); for i=1:y for j=1:x

if(myI(i,j,1)==1)

% 如果myI(i,j,1)即myI图像中坐标为(i,j)的点为蓝色 % 则Blue_y的相应行的元素white_y(i,1)值加1 Blue_y(i,1)= Blue_y(i,1)+1; % 蓝色像素点统计 end end end

[temp, MaxY] = max(Blue_y); %temp为向量white_y的元素中的最大值,MaxY为该值的索引(在向量中的位置) PY1 = MaxY;

while ((Blue_y(PY1,1) >= 120)&&(PY1 > 1)) PY1 = PY1-1; end

PY2 = MaxY;