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;