clc; clear all; close all;
[filename, pathname, filterindex] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
'*.*','All Files' }, '选择待处理图像', ...
'images\01.jpg');
file = fullfile(pathname, filename);%文件路径和文件名创建合成完整文件名
id = Get_Id(file);%得到file中的所有对象
Img = imread(file);%根据路径和文件名读取图片到Img
[Plate, bw, Loc] = Pre_Process(Img); % 车牌区域预处理
result = Plate_Process(Plate, id); % 车牌区域二值化处理
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割bw = Segmation(result);
words = Main_Process(bw); % 主流程处理
Write_Mask(words, id); % 写出到模板库
str = Pattern_Recognition(words); % 识别
function id = Get_Id(file)
% 获取图像id信息
% 输入参数:
% file——图像路径
% 输出参数:
% id——图像id信息
info = imfinfo(file);
FS = [422227 354169 293184 235413 214202 ...
130938 490061 120297 98686 137193 ...
80558 46208 69947 58110 62115 ...
59072 52168 60457 53979 50223];
id = find(FS == info.FileSize);
if isempty(id)
warndlg('未建立该图像模板库,可能运行出错!', '警告');
id = 1;
end
function R = Cubic_Spline(P)
% 三次样条插值
% 输入参数:
% P——节点矩阵
% 输出参数:
% R——样条节点矩阵
% 计算相邻插值点之间的弦长
chordlen = sqrt(sum(diff(P, [], 1).^2,2));
% 将弦长参数归一化到[0,1]上
chordlen = chordlen/sum(chordlen);
% 计算每个插值节点处的累加弦长,作为给点处的参数
cumarc = [0; cumsum(chordlen)];
x = cumarc;
N = size(P, 1);
R = [];
% 以下部分为一元三次样条插值的程序,对于空间三维数据,以同样的累加
% 弦长作为参数,对x,y,z分量做三次一元样条插值得到的结果便是对三维数据% 做三次样条插值
for k = 1 : size(P, 2)
y = P(:, k);
m = zeros(1, N);
M = zeros(1, N);
n = m;
d = m;
A = eye(N);
A = 2*A;
m(1) = 1;
n(N) = 1;
m(N) = 1;
n(1) = 1;
for i = 2:N-1
m(i) = (x(i+1)-x(i))/(x(i+1)-x(i-1));
n(i) = 1 - m(i);
d(i) = 6*((y(i+1) - y(i))/(x(i+1) - x(i)) - (y(i) - y(i-1))/(x(i) - x(i-1)))/(x(i+1)-x(i-1));
end
for j = 1 : N-1
A(j, j+1) = m(j);
A(j+1, j) = n(j+1);
end
p = A(2:N-1, 2:N-1);
q = d(2:N-1);
Q = inv(p)*q';
M = zeros(1,N);
M(1,1) = 0;
M(1,N) = 0;
M(1,2:N-1)= Q;
S = [];
temp = [];
for i = 1:N-1
% 对每一个分量计算出来的插值曲线进行采样,以便将其画出。
s = 50;% 采样点个数
z = linspace(x(i),x(i+1),s);
h = x(i+1)-x(i);
for j = 1:length(z)
S(j) = M(i)*((x(i+1)-z(j))^3)/(6*h)+M(i+1)*((z(j)-x(i))^3)/(6*h)+(y(i)-M(i)*(h^2)/6)*((x(i+1)-z(j))/h)+( y(i+1)-M(i+1)*h^2/6)*((z(j)-x(i))/h);
end
temp = [temp S];
end
R(:, k) = temp;
end
function mask = Get_PointSplineMask(Img, Ptn)
% 获取封闭有序节点的蒙板图像
% Img——图像矩阵
% Ptn——封闭有序节点
% 输出参数:
% mask——蒙板图像
if ndims(Img) == 3
I = rgb2gray(Img);
else
I = Img;
end
mask = zeros(size(I));
Ptn = Cubic_Spline(Ptn); % 样条插值
for i = 1 : size(Ptn, 1)-1
pt1 = Ptn(i, :); % 线段起点
pt2 = Ptn(i+1, :); % 线段终点
x1 = pt1(1); y1 = pt1(2);
x2 = pt2(1); y2 = pt2(2);
% 直线段参数
A = (y1 - y2)/(x1*y2 - x2*y1);
B = (-x1 + x2)/(x1*y2 - x2*y1);
% 直线段取点
xk = linspace(min(x1, x2), max(x1, x2));
if B == 0
yk = linspace(min(y1, y2), max(y1, y2));
else
yk = (-1 - A*xk)/B;
end
% 赋值操作
for j = 1 : length(xk)
if ~isnan(round(yk(j))) && ~isnan(round(xk(j))) && ...
~isinf(round(yk(j))) && ~isinf(round(xk(j))) && ...
round(yk(j)) > 0 && round(xk(j)) > 0
mask(round(yk(j)), round(xk(j))) = 1;
end
end
end
mask = logical(mask); % 类型转换
mask = bwmorph(mask, 'bridge'); % 桥接操作
mask = imfill(mask, 'hole'); % 补洞操作
function Im = Image_Rotate(Img, num, flag)
% 旋转校正函数
% 输入函数:
% Img——图像矩阵
% num——图像序号
% flag——显示图像窗口
% 输出函数:
% Im——结果图像
if nargin < 3
flag = 0;
end
role = [6 0 0 -13 5 10 0 10 0 -5 2 -1 2 2 0 -5 -2 0 6 2];
Im = imrotate(Img, role(num), 'bilinear');
if flag
figure(2);
subplot(1, 2, 1); imshow(Img); title('原图像');
subplot(1, 2, 2); imshow(Im); title('旋转图像');
end
function words = Main_Process(bw, flag_display)
% 主流程处理,分割字符并获取
% 输入参数:
% bw——车牌区域图像
% flag_display——显示图像标记
% 输出参数:
% words——车牌字符数据
if nargin < 2
flag_display = 1;
end
[m, n] = size(bw);
k1 = 1;
k2 = 1;
s = sum(bw); % 列积分投影
j = 1; % 列游标
while j ~= n
% 寻找车牌图像左侧边界
while s(j) == 0 && j <= n-1
j = j + 1;
end
k1 = j-1; % 车牌图像左侧边界
% 寻找车牌图像右侧边界
while s(j) ~= 0 && j <= n-1
j = j + 1;
end
k2 = j-1; % 车牌图像右侧边界
Tol = round(n/6.5); % 字符区域宽度约束
if k2-k1 > Tol
[val, num] = min(sum(bw(:, [k1+5:k2-5])));
bw(:, k1+num+5)=0; % 抹去该字符end
end
% 再切割
bw = Segmation(bw);
% 切割出7 个字符
[m, n] = size(bw);
wideTol = round(n/20); % 区域宽度最小约束rateTol = 0.25; % 中心区域比值约束
flag = 0;
word1 = [];
while flag == 0
[m, n] = size(bw);
left = 1;
wide = 0;
% 找到空隙位置
while sum(bw(:,wide+1)) ~= 0
wide = wide+1;
end
if wide < wideTol
% 认为是左侧干扰
bw(:, 1:wide) = 0; % 抹去干扰区域
bw = Segmation(bw);
else
% 提取字符区域
temp = Segmation(imcrop(bw, [1 1 wide m]));
[m, n] = size(temp);
tall = sum(temp(:)); % 该字符所有像素之和
% 该字符图像2/3图像区域像素和
two_thirds = sum(sum( temp(round(m/3):2*round(m/3), :) ));
rate = two_thirds/tall; % 中间区域像素/全局区域像素
if rate > rateTol
flag = 1;
word1 = temp; %提取WORD 1
end
bw(:, 1:wide) = 0; % 抹去已处理的区域
bw = Segmation(bw);
end
end
% 分割出第二个字符
[word2, bw] = Word_Segmation(bw);
% 分割出第三个字符
[word3, bw] = Word_Segmation(bw);
% 分割出第四个字符
[word4, bw] = Word_Segmation(bw);
% 分割出第五个字符
[word5, bw] = Word_Segmation(bw);
% 分割出第六个字符
[word6, bw] = Word_Segmation(bw);
% 分割出第七个字符
[word7, bw] = Word_Segmation(bw);
wid = [size(word1, 2) size(word2, 2) size(word3, 2) ...
size(word4, 2) size(word5, 2) size(word6, 2) size(word7, 2)];
[maxwid, indmax] = max(wid);
maxwid = maxwid + 10;
wordi = word1;
wordi = [zeros(size(wordi, 1), round((maxwid-size(word1, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word1, 2))/2))];
word1 = wordi;
wordi = word2;
wordi = [zeros(size(wordi, 1), round((maxwid-size(word2, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word2, 2))/2))];
word2 = wordi;
wordi = word3;
wordi = [zeros(size(wordi, 1), round((maxwid-size(word3, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word3, 2))/2))];
word3 = wordi;
wordi = word4;
wordi = [zeros(size(wordi, 1), round((maxwid-size(word4, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word4, 2))/2))];
word4 = wordi;
wordi = word5;
wordi = [zeros(size(wordi, 1), round((maxwid-size(word5, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word5, 2))/2))];
word5 = wordi;
wordi = word6;
wordi = [zeros(size(wordi, 1), round((maxwid-size(word6, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word6, 2))/2))];
word6 = wordi;
wordi = word7;
wordi = [zeros(size(wordi, 1), round((maxwid-size(word7, 2))/2)) wordi zeros(size(wordi, 1), round((maxwid-size(word7, 2))/2))];
word7 = wordi;
% figure(1);
% subplot(2, 7, 1); imshow(word1); title('字符1');
% subplot(2, 7, 2); imshow(word2); title('字符2');
% subplot(2, 7, 3); imshow(word3); title('字符3');
% subplot(2, 7, 4); imshow(word4); title('字符4');
% subplot(2, 7, 5); imshow(word5); title('字符5');
% subplot(2, 7, 6); imshow(word6); title('字符6');
% subplot(2, 7, 7); imshow(word7); title('字符7');
% 切割出的字符归一化大小为40*20,此处演示
word11 = imresize(word1, [40 20]);
word21 = imresize(word2, [40 20]);
word31 = imresize(word3, [40 20]);
word41 = imresize(word4, [40 20]);
word51 = imresize(word5, [40 20]);
word61 = imresize(word6, [40 20]);
word71 = imresize(word7, [40 20]);
% subplot(2, 7, 8); imshow(word11); title('字符1');
% subplot(2, 7, 9); imshow(word21); title('字符2');
% subplot(2, 7, 10); imshow(word31); title('字符3');
% subplot(2, 7, 11); imshow(word41); title('字符4');
% subplot(2, 7, 12); imshow(word51); title('字符5');
% subplot(2, 7, 13); imshow(word61); title('字符6');
% subplot(2, 7, 14); imshow(word71); title('字符7');
% 赋值操作
words.word1 = word11;
words.word2 = word21;
words.word3 = word31;
words.word4 = word41;
words.word5 = word51;
words.word6 = word61;
words.word7 = word71;
if flag_display
figure;
subplot(2, 7, 1); imshow(word1); title('字符1', 'FontWeight', 'Bold');
subplot(2, 7, 2); imshow(word2); title('字符2', 'FontWeight', 'Bold');
subplot(2, 7, 3); imshow(word3); title('字符3', 'FontWeight', 'Bold');
subplot(2, 7, 4); imshow(word4); title('字符4', 'FontWeight', 'Bold');
subplot(2, 7, 5); imshow(word5); title('字符5', 'FontWeight', 'Bold');
subplot(2, 7, 6); imshow(word6); title('字符6', 'FontWeight', 'Bold');
subplot(2, 7, 7); imshow(word7); title('字符7', 'FontWeight', 'Bold');
subplot(2, 7, 8); imshow(word11); title('字符1', 'FontWeight', 'Bold');
subplot(2, 7, 9); imshow(word21); title('字符2', 'FontWeight', 'Bold');
subplot(2, 7, 10); imshow(word31); title('字符3', 'FontWeight', 'Bold');
subplot(2, 7, 11); imshow(word41); title('字符4', 'FontWeight', 'Bold');
subplot(2, 7, 12); imshow(word51); title('字符5', 'FontWeight', 'Bold');
subplot(2, 7, 13); imshow(word61); title('字符6', 'FontWeight', 'Bold');
subplot(2, 7, 14); imshow(word71); title('字符7', 'FontWeight', 'Bold'); end
function mask = Mask_Process(Img, id)
% 图像蒙版处理函数
% 输入参数:
% Img——图像矩阵
% id——图像序号
% 输出参数:
% mask——模板图像
% 如果已经存在模板图像则不再取模板
filename = sprintf('mask\\mask%d.jpg', id);
if exist(filename, 'file')
mask = imread(filename);
if ~isa(mask, 'logical')
mask = im2bw(mask);
end
sz = size(Img);
if ~isequal(sz(1:2), size(mask))
mask = imresize(mask, sz(1:2));
mask = logical(mask);
end
return;
end
I = Img;
Ptn = [];
figure;
subplot(1, 3, 1); imshow(I);
title('取点_{左键取点,右键退出}', 'Color', 'r', ...
'FontWeight', 'Bold');
hold on;
set(gcf, 'units', 'normalized', 'position', [0 0 1 1]);
[x, y, button] = ginput(1); % 点击
while button == 1
plot(x, y, 'r+', 'LineWidth', 2); % 绘制节点
Ptn = [Ptn; x y]; % 存储节点
[x, y, button] = ginput(1); % 点击
end
if size(Ptn, 1) < 2
return;
end
Ptn = [Ptn; Ptn(1, :)];
plot(Ptn(:, 1), Ptn(:, 2), 'ro-', 'LineWidth', 2, 'MarkerFaceColor', 'k'); title('原图像', 'Color', 'k', ...
'FontWeight', 'Bold');
mask = Get_PointSplineMask(I, Ptn); % 获取蒙板图像
subplot(1, 3, 2); imshow(mask);
title('蒙板图像', 'Color', 'k', ...
'FontWeight', 'Bold');
if ndims(I) == 3
I1 = I .* uint8(cat(3, mask, mask, mask));
else
if ~isequal(size(I), size(mask))
mask = imresize(mask, size(I));
mask = logical(mask);
end
I1 = I .* mask;
end
subplot(1, 3, 3); imshow(I1);
title('蒙板分割结果', 'Color', 'k', ...
'FontWeight', 'Bold');
imwrite(mask, filename);
function str = Pattern_Recognition(words)
% 车牌字符识别
% 输入参数:
% words——车牌字符图像
% 输出参数:
% str——识别结果
pattern = [];
dirpath = './标准库/';
%读取所有样本文件
files = ls([dirpath '*.jpg']);
for t = 1 : length(files)
imagedata = imread([dirpath, files(t,:)]); %读取样本文件imagedata = im2bw(imagedata, 0.5);
pattern(t).feature = imagedata;
end
% 字符库列表
chepaiword=[...
'沪' 'C' 'E' 'N' '2' '6' '7' '浙' 'B' 'T' '2' '0' '0' '8' ...
'皖' 'N' '6' '9' '3' '3' '5' '皖' 'A' 'M' '3' '7' '6' '7' ...
'沪' 'B' '9' '1' '2' '1' '3' '沪' 'F' 'S' '2' '6' '9' '5' ...
'吉' 'A' 'E' '3' '1' '2' '7' '沪' 'B' 'B' '3' '3' '9' '3' ...
'沪' 'J' 'B' '7' '7' '7' '8' '京' 'H' 'Z' '9' '1' '3' '9' ...
'晋' 'K' 'C' '3' '8' '4' '1' '苏' 'D' 'V' '0' '0' '0' '1' ...
'苏' 'A' 'V' '8' '8' '8' '8' '浙' 'B' '8' '8' '8' '8' '8' ...
'沪' 'F' 'Q' '1' '2' '7' '7' '苏' 'E' 'D' '0' '0' '0' '9' ...
'沪' 'E' 'C' '1' '2' '8' '8' '苏' 'G' 'B' '0' '5' '7' '8' ...
'沪' 'B' 'B' '2' '0' '2' '9' '沪' 'D' '5' '4' '2' '2' '6'];
for m = 1 : 7;
for n = 1 : length(files);
switch m
case 1
distance(n)=sum(sum(abs(words.word1-pattern(n).feature)));
case 2
distance(n)=sum(sum(abs(words.word2-pattern(n).feature)));
case 3
distance(n)=sum(sum(abs(words.word3-pattern(n).feature)));
case 4
distance(n)=sum(sum(abs(words.word4-pattern(n).feature)));
case 5
distance(n)=sum(sum(abs(words.word5-pattern(n).feature)));
case 6
distance(n)=sum(sum(abs(words.word6-pattern(n).feature)));
case 7
distance(n)=sum(sum(abs(words.word7-pattern(n).feature)));
end
end
[yvalue,xnumber]=min(distance);
filename = files(xnumber, :);
[pathstr, name, ext] = fileparts(filename);
result(m) = chepaiword(str2num(name));
end
str = ['识别结果为:' result];
msgbox(str, '车牌识别', 'modal');
str = result;
function result = Plate_Process(plate, id, flag)
% 车牌区域处理
% 输入参数:
% plate——车牌区域
% id——车牌序号
% flag——显示图像标记
% 输出参数:
% result——结果图像
if nargin < 3
flag = 1;
end
if ndims(plate) == 3
plate1 = rgb2gray(plate);
% figure(1)
% imshow(plate1)
else
plate1 = plate;
end
Im = Image_Rotate(plate1, id);
th = [0.85 0.50 0.85 0.70 0.30 ...
0.40 0.65 0.45 0.45 0.65 ...
0.51 0.80 0.40 0.75 0.60 ...
0.55 0.40 0.40 0.76 0.72];
bw = im2bw(Im, th(id)); % 车牌区域二值化
h = fspecial('average', 2); % 均值滤波模板
bw1 = imfilter(bw, h, 'replicate'); % 均值滤波
% figure(1)
% imshow(bw1)
mask = Mask_Process(bw1, id); % 模板处理
bw2 = bw1 .* mask; % 模板滤波
result = bw2;
if flag
figure;
subplot(2, 2, 1); imshow(plate); title('车牌区域图像', 'FontWeight', 'Bold');
subplot(2, 2, 2); imshow(Im); title('车牌区域校正图像', 'FontWeight', 'Bold');
subplot(2, 2, 3); imshow(bw1); title('车牌区域二值图像', 'FontWeight', 'Bold');
subplot(2, 2, 4); imshow(bw2); title('滤波二值图像', 'FontWeight', 'Bold'); end
function [Plate, bw, Loc] = Pre_Process(Img, parm, flag)
% 车牌图像预处理,提取车牌区域
% 输入参数:
% Img——图像矩阵
% parm——参数向量
% flag——是否显示处理结果
% 输出参数:
% Plate——分割结果
if nargin < 3
flag = 1;
end
if nargin < 2 || isempty(parm)
if size(Img, 2) > 900
parm = [0.35 0.9 90 0.35 0.7 90 2];
end
if size(Img, 2) > 700 && size(Img, 2) < 900
parm = [0.6 0.9 90 0.6 0.8 90 0.5];
end
if size(Img, 2) > 500 && size(Img, 2) < 700
parm = [0.5 0.54 50 0.6 0.7 50 3];
end
if size(Img, 2) < 500
parm = [0.8 0.9 150 0.8 0.9 150 3];
end
end
I = Img;
[y, x, z] = size(I); % y方向对应行、x方向对应列、z方向对应深度
% 图像尺寸过大会影响处理效率,所以进行放缩处理
if y > 800
rate = 800/y;
I = imresize(I, rate);
end
[y, x, z] = size(I); % y方向对应行、x方向对应列、z方向对应深度
myI = double(I); % 数据类型转换
bw1 = zeros(y, x);
bw2 = zeros(y, x);
Blue_y = zeros(y, 1);
% 对每一个像素进行分析,统计满足条件的像素所在的行对应的个数for i = 1 : y
for j = 1 : x
rij = myI(i, j, 1)/(myI(i, j, 3)+eps);
gij = myI(i, j, 2)/(myI(i, j, 3)+eps);
bij = myI(i, j, 3);
% 蓝色RGB的灰度范围
if (rij < parm(1) && gij < parm(2) && bij > parm(3)) ...
|| (gij < parm(1) && rij < parm(2) && bij > parm(3)) Blue_y(i, 1) = Blue_y(i, 1) + 1; % 蓝色象素点统计
bw1(i, j) = 1;
end
end
end
% Y方向车牌区域确定
[temp, MaxY] = max(Blue_y);
Th = parm(7);
% 向上追溯,直到车牌区域上边界
PY1 = MaxY;
while ((Blue_y(PY1,1)>Th) && (PY1>1))
PY1 = PY1 - 1;
end
% 向下追溯,直到车牌区域下边界
PY2 = MaxY;
while ((Blue_y(PY2,1)>Th) && (PY2 PY2 = PY2 + 1; % 对车牌区域的修正 PY1 = PY1 - 2; PY2 = PY2 + 2; if PY1 < 1 PY1 = 1; end if PY2 > y PY2 = y; end % 得到车牌区域 IY = I(PY1:PY2, :, :); %%%%%%%% X 方向%%%%%%%%%% % 进一步确定X方向的车牌区域 Blue_x = zeros(1,x); for j = 1:x for i = PY1:PY2 rij = myI(i, j, 1)/(myI(i, j, 3)+eps); gij = myI(i, j, 2)/(myI(i, j, 3)+eps); bij = myI(i, j, 3); % 蓝色RGB的灰度范围 if (rij < parm(4) && gij < parm(5) && bij > parm(6)) ... || (gij < parm(4) && rij < parm(5) && bij > parm(6)) Blue_x(1,j) = Blue_x(1,j) + 1; % 蓝色象素点统计 bw2(i, j) = 1; end end end % 想右追溯,直到找到车牌区域左边界 PX1 = 1; while (Blue_x(1,PX1) PX1 = PX1 + 1; end % 想左追溯,直到找到车牌区域右边界 PX2 = x; while (Blue_x(1,PX2) PX2 = PX2 - 1; end % 对车牌区域的修正 PX1 = PX1 - 2; PX2 = PX2 + 2; if PX1 < 1 PX1 = 1; if PX2 > x PX2 = x; end % 得到车牌区域 IX = I(:, PX1:PX2, :); % 分割车牌区域 Plate = I(PY1:PY2, PX1:PX2, :); Loc.row = [PY1 PY2]; Loc.col = [PX1 PX2]; bw = bw1 + bw2; bw = logical(bw); bw(1:PY1, :) = 0; bw(PY2:end, :) = 0; bw(:, 1:PX1) = 0; bw(:, PX2:end) = 0; if flag figure; subplot(2, 2, 3); imshow(IY); title('行过滤结果', 'FontWeight', 'Bold'); subplot(2, 2, 1); imshow(IX); title('列过滤结果', 'FontWeight', 'Bold'); subplot(2, 2, 2); imshow(I); title('原图像', 'FontWeight', 'Bold'); subplot(2, 2, 4); imshow(Plate); title('分割结果', 'FontWeight', 'Bold'); end function e = Segmation(d) % 车牌图像切割 % 输入参数: % d——车牌图像 % 输出参数: % e——切割后的车牌图像 [m, n] = size(d); % 初始化参数 top = 1; % 矩形框上参数 bottom = m; % 矩形框下参数 left = 1; % 矩形框左参数 right = n; % 矩形框右参数 % 寻找矩形框上参数 while sum(d(top,:))==0 && top<=m top = top + 1; % 寻找矩形框下参数 while sum(d(bottom,:))==0 && bottom>=1 bottom = bottom - 1; end % 寻找矩形框左参数 while sum(d(:,left))==0 && left<=n left = left + 1; end % 寻找矩形框右参数 while sum(d(:,right))==0 && right>=1 right = right - 1; end dd = right - left; % 矩形框长 hh = bottom - top; % 矩形框宽 e = imcrop(d, [left top dd hh]); % 车牌图像矩形框裁剪 function [word, result] = Word_Segmation(d) % 提取字符 % 输入参数: % d——车牌图像 % 输出参数: % word——字符图像 % result——处理结果 word = []; flag = 0; [m, n] = size(d); wideTol = round(n/20); % 区域宽度最小约束 rateTol = 0.25; % 中心区域比值约束 while flag == 0 [m, n] = size(d); wide = 0; while sum(d(:,wide+1)) ~= 0 && wide <= n-2 wide = wide + 1; end temp = Segmation(imcrop(d, [1 1 wide m])); [m1,n1] = size(temp); if wide d(:, 1:wide) = 0; if sum(sum(d)) ~= 0 d = Segmation(d); % 切割出最小范围 else word = []; flag = 1; end else word = Segmation(imcrop(d, [1 1 wide m])); d(:, 1:wide) = 0; if sum(sum(d)) ~= 0; d = Segmation(d); flag = 1; else d = []; end end end result = d; function Write_Mask(words, id) % 写出到模板库 % 输入参数: % words——字符图像集合 % id——序号 imwrite(words.word1, sprintf('模板库\\%d_字符%d.jpg', id, 1)); imwrite(words.word2, sprintf('模板库\\%d_字符%d.jpg', id, 2)); imwrite(words.word3, sprintf('模板库\\%d_字符%d.jpg', id, 3)); imwrite(words.word4, sprintf('模板库\\%d_字符%d.jpg', id, 4)); imwrite(words.word5, sprintf('模板库\\%d_字符%d.jpg', id, 5)); imwrite(words.word6, sprintf('模板库\\%d_字符%d.jpg', id, 6)); imwrite(words.word7, sprintf('模板库\\%d_字符%d.jpg', id, 7)); % imwrite(words.word1, sprintf('模板库\\%d.jpg', (id-1)*7+1)); % imwrite(words.word2, sprintf('模板库\\%d.jpg', (id-1)*7+2)); % imwrite(words.word3, sprintf('模板库\\%d.jpg', (id-1)*7+3)); % imwrite(words.word4, sprintf('模板库\\%d.jpg', (id-1)*7+4)); % imwrite(words.word5, sprintf('模板库\\%d.jpg', (id-1)*7+5)); % imwrite(words.word6, sprintf('模板库\\%d.jpg', (id-1)*7+6)); % imwrite(words.word7, sprintf('模板库\\%d.jpg', (id-1)*7+7)); ( 附录 车牌识别程序 clear ; close all; %Step1 获取图像装入待处理彩色图像并显示原始图像 Scolor = imread('');%imread函数读取图像文件 %将彩色图像转换为黑白并显示 Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图 " figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图 figure,imshow(Sgray),title('原始黑白图像'); %Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数 Bgray=imopen(Sgray,s);%打开sgray s图像 figure,imshow(Bgray);title('背景图像');%输出背景图像 %用原始图像与背景图像作减法,增强图像 Egray=imsubtract(Sgray,Bgray);%两幅图相减 ¥ figure,imshow(Egray);title('增强黑白图像');%输出黑白图像 %Step3 取得最佳阈值,将图像二值化 fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型 fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型 level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值 bw22=im2bw(Egray,level);%转换图像为二进制图像 bw2=double(bw22); %Step4 对得到二值图像作开闭操作进行滤波 、 figure,imshow(bw2);title('图像二值化');%得到二值图像 grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界 基于matlab的汽车牌照识别程序 摘要:本次作业的任务是设计一个基于matlab的汽车牌照识别程序,能够实现车牌图像预处理,车牌定位,字符分割,然后通过神经网络对车牌进行字符识别,最终从一幅图像中提取车牌中的字母和数字,给出文本形式的车牌号码。 关键词:车牌识别,matlab,神经网络 1 引言 随着我国交通运输的不断发展,智能交通系统(Intelligent Traffic System,简称ITS)的推广变的越来越重要,而作为ITS的一个重要组成部分,车辆牌照识别系统(vehicle license plate recognition system,简称LPR)对于交通管理、治安处罚等工作的智能化起着十分重要的作用。它可广泛应用于交通流量检测,交通控制于诱导,机场,港口,小区的车辆管理,不停车自动收费,闯红灯等违章车辆监控以及车辆安全防盗等领域,具有广阔的应用前景。由于牌照是机动车辆管理的唯一标识符号,因此,车辆牌照识别系统的研究在机动车管理方面具有十分重要的实际意义。 2 车辆牌照识别系统工作原理 车辆牌照识别系统的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像通过视频卡输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。 3 车辆牌照识别系统组成 (1)图像预处理:对汽车图像进行图像转换、图像增强和边缘检测等。 (2)车牌定位:从预处理后的汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在的位置。 (3)字符分割:对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像 Matlab程序设计任务书 目录 一.课程设计目的 (3) 二.设计原理 (3) 三.详细设计步骤 (3) 四. 设计结果及分析 (18) 五. 总结 (19) 六. 设计体会 (20) 七. 参考文献 (21) 一、课程设计目的 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过 设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 二、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 三、详细设计步骤: 1. 提出总体设计方案: 牌照号码、颜色识别 为了进行牌照识别,需要以下几个基本的步骤: a.牌照定位,定位图片中的牌照位置; b.牌照字符分割,把牌照中的字符分割出来; c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。 牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。 (1)牌照定位: 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。 流程图: 完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。 字符识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。 基于模板匹配算法首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小, 然后与所有的模板进行匹配,最后选最佳匹配作为结果。基于人工神经元网络的算法有两种:一种是先对待识别字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。实际应用中,牌照识别系统的识别率与牌照质量和拍摄质量密切相关。牌照质量会受到各种因素的影响,如生锈、污损、油漆剥落、字体褪色、牌照被遮挡、牌照倾斜、高亮反光、多牌照、假牌照等等;实际拍摄过程也会受到环境亮度、拍摄亮度、车辆速度等等因素的影响。这些影响因素不同程度上降低了牌照识别的识别率,也正是牌照识别系统的困难和挑战所在。为了提高识别率,除了不断的完善识别算法,还应该想办法克服各种光照条件,使采集到的图像最利于识别。 clear ; close all; % 车牌识别程序主体 clc; close all; clear all; %========================================================== %说明: % % %=========================================================== % ==============测定算法执行的时间,开始计时================= tic %%%%%记录程序运行时间 %=====================读入图片================================ [fn,pn,fi]=uigetfile('*.jpg','选择图片'); I=imread([pn fn]); figure; imshow(I); title('原始图像');%显示原始图像 chepailujing=[pn fn] I_bai=I; [PY2,PY1,PX2,PX1]=caitu_fenge(I); % I=rgb2hsv(I); % [PY2,PY1,PX2,PX1]=caitu_tiqu(I,I_bai);%用HSI模型识别蓝色,用rgb模型识别白色 %================分割车牌区域================================= %===============车牌区域根据面积二次修正====================== [PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1); %==============更新图片============================= Plate=I_bai(PY1:PY2,PX1:PX2,:);%使用caitu_tiqu %==============考虑用腐蚀解决蓝色车问题============= bw=Plate;figure,imshow(bw);title('车牌图像');%hsv彩图提取图像 %==============这里要根据图像的倾斜度进行选择这里选择的图片20090425686.jpg bw=rgb2gray(bw);figure,imshow(bw);title('灰度图像'); %================倾斜校正====================== qingxiejiao=rando_bianhuan(bw) bw=imrotate(bw,qingxiejiao,'bilinear','crop');figure,imshow(bw);title('倾斜校正');%取值为负值向右旋转 %============================================== bw=im2bw(bw,graythresh(bw));%figure,imshow(bw); bw=bwmorph(bw,'hbreak',inf);%figure,imshow(bw); bw=bwmorph(bw,'spur',inf);%figure,imshow(bw);title('擦除之前'); 附录 车牌识别程序 clear ; close all; %Step1 获取图像装入待处理彩色图像并显示原始图像 Scolor = imread('3.jpg');%imread函数读取图像文件 %将彩色图像转换为黑白并显示 Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图 figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图 figure,imshow(Sgray),title('原始黑白图像'); %Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数 Bgray=imopen(Sgray,s);%打开sgray s图像 figure,imshow(Bgray);title('背景图像');%输出背景图像 %用原始图像与背景图像作减法,增强图像 Egray=imsubtract(Sgray,Bgray);%两幅图相减 figure,imshow(Egray);title('增强黑白图像');%输出黑白图像 %Step3 取得最佳阈值,将图像二值化 fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型 fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值 bw22=im2bw(Egray,level);%转换图像为二进制图像 bw2=double(bw22); %Step4 对得到二值图像作开闭操作进行滤波 figure,imshow(bw2);title('图像二值化');%得到二值图像 grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界 figure,imshow(grd);title('图像边缘提取');%输出图像边缘 bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算 figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算 车牌识别的matlab程序(程序-讲解-模板) clc clear close all I=imread('chepai.jpg'); subplot(3,2,1);imshow(I), title('原始图像'); I_gray=rgb2gray(I); subplot(3,2,2),imshow(I_gray),title('灰度图像'); %====================== 形态学预处理====================== I_edge=edge(I_gray,'sobel'); subplot(3,2,3),imshow(I_edge),title('边缘检测后图像'); se=[1;1;1]; I_erode=imerode(I_edge,se); subplot(3,2,4),imshow(I_erode),title('腐蚀后边缘图像'); se=strel('rectangle',[25,25]); I_close=imclose(I_erode,se); %图像闭合、填充图像 subplot(3,2,5),imshow(I_close),title('填充后图像 for i=1:size(location_of_1,1) %寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置 temp=location_of_1(i,1)+location_of_1(i,2); if temp Matlab程序设计任务书 分院(系)信息科学与工程专业 学生姓名学号 设计题目车牌识别系统设计 内容及要求: 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过设计实现车牌识别系统,能够提高学生 分析问题和解决问题的能力,还能培养一定的科研能力。 1.牌照识别系统应包括车辆检测、图像采集、牌照识别等几 部分。 2.当车辆检测部分检测到车辆到达时,触发图像采集单元,采 集当前的视频图像。 3.牌照识别单元对图像进行处理,定位出牌照位置,再将牌 照中的字符分割出来进行识别,然后组成牌照号码输出。 进度安排: 19周:Matlab环境熟悉与基础知识学习 19周:课程设计选题与题目分析 20周:程序设计编程实现 20周:课程设计验收与答辩 指导教师(签字): 年月日学院院长(签字): 年月日 目录 一.课程设计目的 (3) 二.设计原理 (3) 三.详细设计步骤 (3) 四. 设计结果及分析 (18) 五. 总结 (19) 六. 设计体会 (20) 七. 参考文献 (21) 一、课程设计目的 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过 设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 二、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 三、详细设计步骤: 1. 提出总体设计方案: 牌照号码、颜色识别 为了进行牌照识别,需要以下几个基本的步骤: a.牌照定位,定位图片中的牌照位置; I=imread('E:\毕业设计\基于matlab的车牌定位的源程\车牌识别程序 \Car1.jpg') [y,x,z]=size(I); myI=double(I); tic Blue_y=zeros(y,1); for i=1:y for j=1:x if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3) <=142)&&(myI(i,j,3)>=119))) Blue_y(i,1)= Blue_y(i,1)+1; end end end [temp MaxY]=max(Blue_y); PY1=MaxY; while ((Blue_y(PY1,1)>=120)&&(PY1>1)) PY1=PY1-1; end PY2=MaxY; while ((Blue_y(PY2,1)>=40)&&(PY2 clc; clear all; close all; [filename, pathname, filterindex] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';... '*.*','All Files' }, '选择待处理图像', ... 'images\01.jpg'); file = fullfile(pathname, filename);%文件路径和文件名创建合成完整文件名 id = Get_Id(file);%得到file中的所有对象 Img = imread(file);%根据路径和文件名读取图片到Img [Plate, bw, Loc] = Pre_Process(Img); % 车牌区域预处理 result = Plate_Process(Plate, id); % 车牌区域二值化处理 % 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割bw = Segmation(result); words = Main_Process(bw); % 主流程处理 Write_Mask(words, id); % 写出到模板库 str = Pattern_Recognition(words); % 识别 function id = Get_Id(file) % 获取图像id信息 % 输入参数: % file——图像路径 % 输出参数: % id——图像id信息 info = imfinfo(file); FS = [422227 354169 293184 235413 214202 ... 130938 490061 120297 98686 137193 ... 80558 46208 69947 58110 62115 ... 59072 52168 60457 53979 50223]; id = find(FS == info.FileSize); if isempty(id) warndlg('未建立该图像模板库,可能运行出错!', '警告'); id = 1; end function R = Cubic_Spline(P) % 三次样条插值 % 输入参数: % P——节点矩阵 % 输出参数: % R——样条节点矩阵 clc clear close all I=imread('chepai.jpg'); subplot(3,2,1);imshow(I), title('原始图像'); I_gray=rgb2gray(I); subplot(3,2,2),imshow(I_gray),title('灰度图像'); %====================== 形态学预处理====================== I_edge=edge(I_gray,'sobel'); subplot(3,2,3),imshow(I_edge),title('边缘检测后图像'); se=[1;1;1]; I_erode=imerode(I_edge,se); subplot(3,2,4),imshow(I_erode),title('腐蚀后边缘图像'); se=strel('rectangle',[25,25]); I_close=imclose(I_erode,se); %图像闭合、填充图像 subplot(3,2,5),imshow(I_close),title('填充后图像'); I_final=bwareaopen(I_close,2000); %去除聚团灰度值小于2000的部分 subplot(3,2,6),imshow(I_final),title('形态滤波后图像'); %========================== 车牌分割============================= I_new=zeros(size(I_final,1),size(I_final,2)); location_of_1=[]; for i=1:size(I_final,1) %寻找二值图像中白的点的位置 for j=1:size(I_final,2) if I_final(i,j)==1; newlocation=[i,j]; location_of_1=[location_of_1;newlocation]; end end end mini=inf;maxi=0; for i=1:size(location_of_1,1) %寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置 temp=location_of_1(i,1)+location_of_1(i,2); if temp MATLAB课程设计报告书 课题名称基于MATLAB的车牌识别课程设计 姓名 学号 学院 专业 指导教师 2016年6月21日 基于MATLAB的车牌识别课程设计 目录 一.课程设计目的……………………………………………二.设计原理…………………………………………………三.详细设计步骤…………………………………………… 四. 设计结果及分析………………………………………… 五. 总结……………………………………………………… 六. 设计体会………………………………………………… 七. 参考文献………………………………………………… 一、课程设计目的 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 二、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 三、详细设计步骤: 1. 提出总体设计方案: 牌照号码、颜色识别 为了进行牌照识别,需要以下几个基本的步骤: a.牌照定位,定位图片中的牌照位置; b.牌照字符分割,把牌照中的字符分割出来; c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。 牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。 (1)牌照定位: 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合 [, pathname] = uigetfile({'*.jpg', 'JPEG文件(*.jpg)';'*.bmp','BMP文件(*.bmp)';}); if( == 0), return, end global %声明全局变量 = [pathname ]; I=imread(); imshow(I); %显示图像I I1=rgb2gray(I);%RGB图转化为灰度图 figure,imshow(I1); w1=medfilt2(I1); figure,imshow(w1); s1=histeq(w1,256); figure,imshow(s1); t1=imadjust(s1); figure,imshow(t1); I2=edge(t1,'robert',0.15,'both'); %用ROBERT算子提取图像边缘 figure,imshow(I2); se=[1;1;1]; I3=imerode(I2,se); %弱化二进制图像I2的边缘 figure,imshow(I3);%为定位车牌,将白色区域膨胀,腐蚀去无关的小物件,包括车牌字符(下面两句) se=strel('rectangle',[25,20]); %用来腐蚀的形状为矩形,面积20*25 I4=imclose(I3,se); figure,imshow(I4); I5=bwareaopen(I4,2000); %去除图像中面积过小的,可以肯定不是车牌的区域。 figure,imshow(I5); [y,x,z]=size(I5); %z=1。y,x分别为I5图像的高和宽 myI=double(I5) %myI=I5; tic %begin横向扫描 white_y=zeros(y,1); %white_y为y行1列的零矩阵 for i=1:y for j=1:x if(myI(i,j,1)==1) %如果myI(i,j,1)即myI图像中坐标为(i,j)的点为白色 %则white_y的相应行的元素white_y(i,1)值加1 white_y(i,1)= white_y(i,1)+1; end end end [temp MaxY]=max(white_y); %temp为向量white_y的元素中的最大值,MaxY为该值的索引(在向量中的位置) 基于matlab的车牌识别系统 一、对车辆图像进行预处理 1.载入车牌图像: function [d]=main(jpg) [filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'}); if(filename == 0), return, end global FILENAME %定义全局变量 FILENAME = [pathname filename]; I=imread(FILENAME); figure(1),imshow(I);title('原图像');%将车牌的原图显示出来结果如下: 2.将彩图转换为灰度图并绘制直方图: I1=rgb2gray(I);%将彩图转换为灰度图 figure(2),subplot(1,2,1),imshow(I1);title('灰度图像'); figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图结果如下所示: 3. 用roberts算子进行边缘检测: I2=edge(I1,'roberts',0.18,'both');%选择阈值0.18,用roberts算子进行边缘检测 figure(3),imshow(I2);title('roberts 算子边缘检测图像'); 结果如下: 4.图像实施腐蚀操作: se=[1;1;1]; I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作figure(4),imshow(I3);title('腐蚀后图像'); 5.平滑图像 se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个se function[]=main(jpg) close all clc tic %测定算法执行的时间 [fn,pn]=uigetfile('timg1,jpg','选择图片') %读入图片 I=imread([pn,fn]); figure,imshow(I);title('原始图像'); %显示原始图像 Im1=rgb2gray(I); figure(2), subplot(1,2,1), imshow(Im1); title('灰度图'); figure(2), subplot(1,2,2), imhist(Im1); title('灰度图的直方图'); %显示图像的直方图 Tiao=imadjust(Im1,[0.19,0.78],[0,1]); %调整图片 figure(3), subplot(1,2,1), imshow(Tiao);title('增强灰度图'); figure(3), subplot(1,2,2), imhist(Tiao); title('增强灰度图的直方图'); Im2=edge(Tiao,'Roberts','both'); %使用sobel算子进行边缘检测figure(4), imshow(Im2); title('sobel算子实现边缘检测') se=[1;1;1]; Im3=imerode(Im2,se); figure(5), imshow(Im3); se=strel('square',40);%'rectangle',[25,25]/'diamond',25/ Im4=imclose(Im3,se); figure(6), imshow(Im4); title('平滑图像的轮廓'); Im5=bwareaopen(Im4,1500); figure(7), imshow(Im5); title('移除小对象'); [y,x,z]=size(Im5); %返回Im5各维的尺寸,并存储在变量y、x、z中 Im6=double(Im5); %将Im5换成双精度数值 %开始横向扫描 tic %tic计时开始,toc结束,计算tic与toc之间程序的运行时间 Blue_y=zeros(y,1); %产生y*1的全0矩阵 for i=1:y %逐行扫描 for j=1:x if(Im6(i,j,1)==1)%如果Im6图像中坐标为(i,j)的点值为1,即为移除小对象的白色区域, Blue_y(i,1)= Blue_y(i,1)+1;%则y*1列矩阵的相应像素点的元素值加1, end end end [temp MaxY]=max(Blue_y);%temp为向量Blue_y的矩阵中的最大值,MaxY为该值的索引(最大值在向量中的位置) %返回包含最大元素的列,即白色区域最宽的列 %Y方向车牌区域确定 figure(8),subplot(1,2,1), plot(0:y-1,Blue_y),title('行方向白色像素点累计'),xlabel('行数'),ylabel('个数'); PY1=MaxY; while ((Blue_y(PY1,1)>=120)&&(PY1>1)) PY1=PY1-1; end PY2=MaxY; while ((Blue_y(PY2,1)>=40)&&(PY2 基于Matlab的车牌识别 摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。并用MATLAB软件编程来实现每一个部分,最后识别出汽车车牌。 一、设计原理 车辆车牌识别系统的基本工作原理为:将摄像头拍摄到的包含车辆车牌的图像通过视频卡输入到计算机中进行预处理,再由检索模块对车牌进行搜索、检测、定位,并分割出包含车牌字符的矩形区域,然后对车牌字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。车牌自动识别是一项利用车辆的动态视频或静态图像进行车牌号码、车牌颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些车牌识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。车牌识别单元对图像进行处理,定位出车牌位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出。 二、设计步骤 总体步骤为: 车辆→图像采集→图像预处理→车牌定位 →字符分割→字符定位→输出结果 基本的步骤: a.车牌定位,定位图片中的车牌位置; b.车牌字符分割,把车牌中的字符分割出来; c.车牌字符识别,把分割好的字符进行识别,最终组成车牌号码。 车牌识别过程中,车牌颜色的识别依据算法不同,可能在上述不同步骤实现,通常与车牌识别互相配合、互相验证。 (1)车牌定位: 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定车牌区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合汽车车牌特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为车牌区域,并将其从图象中分割出来。 流程图: (2)车牌字符分割 : 完成车牌区域的定位后,再将车牌区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足车牌的字符书写格式、字符、尺寸限制和一些其他条件。利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。 导入原始图像 图像预处理增强效果图像 边缘提取 车牌定位 对图像开闭运算 汽车车牌的号码识别 1.车牌号码识别的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像通过视频卡输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单 个字符,得到输出结果。 2.车牌号码识别系统原理图各部分说明如下: (1)图像预处理:对汽车图像进行图像转换、图像增强和边缘检测等。 (2)车牌定位:从预处理后的汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在的位置。 (3)字符分割:对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像。 (4)字符识别:对分割出来的字符进行预处理(二值化、归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。 3.源程序代码及图形 (1)I=imread('F:\tu\yuan.bmp'); figure; subplot(2,2,1); imshow(I); title('原图'); I1=rgb2gray(I);%图像灰度化subplot(2,2,2); imshow(I1); title('灰度化图'); m2=medfilt2(I1,[5,5]); subplot(2,2,3); imshow(m2); title('中值滤波'); w2=wiener2(I1,[5,5]);%维纳滤波subplot(2,2,4); imshow(w2); title('维纳滤波'); (2)图像二值化 原图灰度化图 中值滤波维纳滤波 fmax1=double(max(max(I1))); fmin1=double(min(min(I1))); level=(fmax1-(fmax1-fmin1)/3)/255; bw2=im2bw(I1,level); bw22=double(bw2); figure,imshow(bw22),title('图像二值化 '); 图像二值化 [filename, pathname] = uigetfile({'*.jpg', 'JPEG文件(*.jpg)';'*.bmp','BMP文件(*.bmp)';}); if(filename == 0), return, end global FILENAME %声明全局变量 FILENAME = [pathname filename]; I=imread(FILENAME); imshow(I); %显示图像I I1=rgb2gray(I);%RGB图转化为灰度图 figure,imshow(I1); w1=medfilt2(I1); figure,imshow(w1); s1=histeq(w1,256); figure,imshow(s1); t1=imadjust(s1); figure,imshow(t1); I2=edge(t1,'robert',0.15,'both'); %用ROBERT算子提取图像边缘 figure,imshow(I2); se=[1;1;1]; I3=imerode(I2,se); %弱化二进制图像I2的边缘 figure,imshow(I3);%为定位车牌,将白色区域膨胀,腐蚀去无关的小物件,包括车牌字符(下面两句) se=strel('rectangle',[25,20]); %用来腐蚀的形状为矩形,面积20*25 I4=imclose(I3,se); figure,imshow(I4); I5=bwareaopen(I4,2000); %去除图像中面积过小的,可以肯定不是车牌的区域。 figure,imshow(I5); [y,x,z]=size(I5); %z=1。y,x分别为I5图像的高和宽 myI=double(I5) %myI=I5; tic %begin横向扫描 white_y=zeros(y,1); %white_y为y行1列的零矩阵 for i=1:y for j=1:x if(myI(i,j,1)==1) %如果myI(i,j,1)即myI图像中坐标为(i,j)的点为白色 %则white_y的相应行的元素white_y(i,1)值加1 white_y(i,1)= white_y(i,1)+1; end end end [temp MaxY]=max(white_y); %temp为向量white_y的元素中的最大值,MaxY为该值的索引(在向量中的位置) 基于Matlab的车牌识别(完整版) 基于Matlab的车牌识别 摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。并用MATLAB软件编程来实现每一个部分,最后识别出汽车车牌。 一、设计原理 车辆车牌识别系统的基本工作原理为:将摄像头拍摄到的包含车辆车牌的图像通过视频卡输入到计算机中进行预处理,再由检索模块对车牌进行搜索、检测、定位,并分割出包含车牌字符的矩形区域,然后对车牌字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。车牌自动识别是一项利用车辆的动态视频或静态图像进行车牌号码、车牌颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些车牌识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。车牌识别单元对图像进行处理,定位出车牌位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出。 二、设计步骤 总体步骤为: 车辆→图像采集→图像预处理→车牌定位 →字符分割→字符定位→输出结果 基本的步骤: a.车牌定位,定位图片中的车牌位置; b.车牌字符分割,把车牌中的字符分割出来; c.车牌字符识别,把分割好的字符进行识别,最终组成车牌号码。 车牌识别过程中,车牌颜色的识别依据算法不同,可能在上述不同步骤实现,通常与车牌识别互相配合、互相验证。 (1)车牌定位: 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定车牌区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合汽车车牌特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为车牌区域,并将其从图象中分割出来。 流程图: (2)车牌字符分割 : 完成车牌区域的定位后,再将车牌区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足车牌的字符书写 导入原始图像 图像预处理增强效果图像 边缘提取 车牌定位 对图像开闭运算PX1) 车牌识别地matlab程序
基于matlab的车牌号码识别程序代码
matlab车牌识别课程设计报告(附源代码)
matlab车牌识别程序代码
车牌识别的matlab程序
车牌识别的matlab程序(程序-讲解-模板)
matlab车牌识别课程设计报告(附源代码)
基于matlab的车牌定位源程序及运行结果 (1)
最新车牌识别系统MATLAB源代码完整解析
车牌识别的matlab程序(程序-讲解-模板)
基于MATLAB的车牌识别课程设计
车牌识别matlab程序[1]
基于matlab的车牌识别(含子程序)
基于Matlab的车牌识别实现源码
基于Matlab的车牌识别(完整版)
基于matlab的车牌识别
车牌识别matlab程序[1]精选.
基于Matlab的车牌识别(完整版)