
选择待处理图像', ...
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 ...
id = find(FS == info.FileSize);
if isempty(id)
未建立该图像模板库,可能运行出错!', '警告');
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)
对每一个分量计算出来的插值曲线进行采样,以便将其画出。
采样点个数
R(:, k) = temp;
end
function mask = Get_PointSplineMask(Img, Ptn)
% 获取封闭有序节点的蒙板图像
% Img——图像矩阵
% Ptn——封闭有序节点
% 输出参数:
% mask——蒙板图像
if ndims(Img) == 3
else
end
mask = zeros(size(I));
Ptn = Cubic_Spline(Ptn); % 样条插值
for i = 1 : size(Ptn, 1)-1
线段起点
线段终点
直线段参数
直线段取点
赋值操作
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
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
原图像');
旋转图像');
end
function words = Main_Process(bw, flag_display)
% 主流程处理,分割字符并获取
% 输入参数:
% bw——车牌区域图像
% flag_display——显示图像标记
% 输出参数:
% words——车牌字符数据
if nargin < 2
end
[m, n] = size(bw);
k1 = 1;
k2 = 1;
s = sum(bw); % 列积分投影
j = 1; % 列游标
while j ~= n
寻找车牌图像左侧边界
车牌图像左侧边界
寻找车牌图像右侧边界
车牌图像右侧边界
字符区域宽度约束
抹去该字符
end
% 再切割
bw = Segmation(bw);
% 切割出 7 个字符
[m, n] = size(bw);
wideTol = round(n/20); % 区域宽度最小约束
rateTol = 0.25; % 中心区域比值约束
flag = 0;
word1 = [];
while flag == 0
找到空隙位置
认为是左侧干扰
抹去干扰区域
提取字符区域
该字符所有像素之和
该字符图像2/3图像区域像素和
中间区域像素/全局区域像素
word1 = temp; %提取WORD 1
抹去已处理的区域
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) ...
[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
字符1', 'FontWeight', 'Bold');
字符2', 'FontWeight', 'Bold');
字符3', 'FontWeight', 'Bold');
字符4', 'FontWeight', 'Bold');
字符5', 'FontWeight', 'Bold');
字符6', 'FontWeight', 'Bold');
字符7', 'FontWeight', 'Bold');
字符1', 'FontWeight', 'Bold');
字符2', 'FontWeight', 'Bold');
字符3', 'FontWeight', 'Bold');
字符4', 'FontWeight', 'Bold');
字符5', 'FontWeight', 'Bold');
字符6', 'FontWeight', 'Bold');
字符7', 'FontWeight', 'Bold');
end
function mask = Mask_Process(Img, id)
% 图像蒙版处理函数
% 输入参数:
% Img——图像矩阵
% id——图像序号
% 输出参数:
% mask——模板图像
% 如果已经存在模板图像则不再取模板
if exist(filename, 'file')
end
I = Img;
Ptn = [];
figure;
subplot(1, 3, 1); imshow(I);
title('取点_{左键取点,右键退出}', 'Color', 'r', ...
hold on;
set(gcf, 'units', 'normalized', 'position', [0 0 1 1]);
[x, y, button] = ginput(1); % 点击
while button == 1
绘制节点
存储节点
点击
end
if size(Ptn, 1) < 2
end
Ptn = [Ptn; Ptn(1, :)];
plot(Ptn(:, 1), Ptn(:, 2), 'ro-', 'LineWidth', 2, 'MarkerFaceColor', 'k');
title('原图像', 'Color', 'k', ...
mask = Get_PointSplineMask(I, Ptn); % 获取蒙板图像
subplot(1, 3, 2); imshow(mask);
title('蒙板图像', 'Color', 'k', ...
if ndims(I) == 3
else
end
subplot(1, 3, 3); imshow(I1);
title('蒙板分割结果', 'Color', 'k', ...
imwrite(mask, filename);
function str = Pattern_Recognition(words)
% 车牌字符识别
% 输入参数:
% words——车牌字符图像
% 输出参数:
% str——识别结果
pattern = [];
dirpath = './标准库/';
%读取所有样本文件
for t = 1 : length(files)
读取样本文件
pattern(t).feature = imagedata;
% 字符库列表
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'];
end
str = ['识别结果为:' result];
msgbox(str, '车牌识别', 'modal');
str = result;
function result = Plate_Process(plate, id, flag)
% 车牌区域处理
% 输入参数:
% plate——车牌区域
% id——车牌序号
% flag——显示图像标记
% 输出参数:
% result——结果图像
if nargin < 3
end
if ndims(plate) == 3
else
end
Im = Image_Rotate(plate1, id);
th = [0.85 0.50 0.85 0.70 0.30 ...
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
车牌区域图像', 'FontWeight', 'Bold');
车牌区域校正图像', 'FontWeight', 'Bold');
车牌区域二值图像', 'FontWeight', 'Bold');
滤波二值图像', 'FontWeight', 'Bold');
end
function [Plate, bw, Loc] = Pre_Process(Img, parm, flag)
% 车牌图像预处理,提取车牌区域
% 输入参数:
% Img——图像矩阵
% parm——参数向量
% flag——是否显示处理结果
% 输出参数:
% Plate——分割结果
if nargin < 3
end
if nargin < 2 || isempty(parm)
end
I = Img;
[y, x, z] = size(I); % y方向对应行、x方向对应列、z方向对应深度
% 图像尺寸过大会影响处理效率,所以进行放缩处理
if y > 800
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
蓝色RGB的灰度范围
蓝色象素点统计
end
% Y方向车牌区域确定
[temp, MaxY] = max(Blue_y);
Th = parm(7);
% 向上追溯,直到车牌区域上边界
PY1 = MaxY;
while ((Blue_y(PY1,1)>Th) && (PY1>1))
end
% 向下追溯,直到车牌区域下边界
PY2 = MaxY;
while ((Blue_y(PY2,1)>Th) && (PY2 % 对车牌区域的修正 PY1 = PY1 - 2; PY2 = PY2 + 2; if PY1 < 1 end if PY2 > y end % 得到车牌区域 IY = I(PY1:PY2, :, :); %%%%%%%% X 方向 %%%%%%%%%% % 进一步确定X方向的车牌区域 Blue_x = zeros(1,x); for j = 1:x 蓝色RGB的灰度范围 蓝色象素点统计 end % 想右追溯,直到找到车牌区域左边界 PX1 = 1; while (Blue_x(1,PX1) % 想左追溯,直到找到车牌区域右边界 PX2 = x; while (Blue_x(1,PX2) end % 对车牌区域的修正 PX1 = PX1 - 2; PX2 = PX2 + 2; if PX1 < 1 end if 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; 行过滤结果', 'FontWeight', 'Bold'); 列过滤结果', 'FontWeight', 'Bold'); 原图像', 'FontWeight', 'Bold'); 分割结果', '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 end % 寻找矩形框下参数 while sum(d(bottom,:))==0 && bottom>=1 end % 寻找矩形框左参数 while sum(d(:,left))==0 && left<=n end % 寻找矩形框右参数 while sum(d(:,right))==0 && 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 切割出最小范围 end result = d; function Write_Mask(words, id) % 写出到模板库 % 输入参数: % words——字符图像集合 % id——序号 imwrite(words.word1, sprintf('模板库\\\\%d_字符 imwrite(words.word2, sprintf('模板库\\\\%d_字符 imwrite(words.word3, sprintf('模板库\\\\%d_字符 imwrite(words.word4, sprintf('模板库\\\\%d_字符 imwrite(words.word5, sprintf('模板库\\\\%d_字符 imwrite(words.word6, sprintf('模板库\\\\%d_字符 imwrite(words.word7, sprintf('模板库\\\\%d_字符 % imwrite(words.word1, sprintf('模板库 % imwrite(words.word2, sprintf('模板库 % imwrite(words.word3, sprintf('模板库 % imwrite(words.word4, sprintf('模板库 % imwrite(words.word5, sprintf('模板库 % imwrite(words.word6, sprintf('模板库 % imwrite(words.word7, sprintf('模板库
end PX1) 
车牌识别系统MATLAB源代码完整
最新推荐
猜你喜欢
热门推荐