最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

车牌识别系统MATLAB源代码完整

来源:动视网 责编:小OO 时间:2025-09-30 01:47:38
文档

车牌识别系统MATLAB源代码完整

clc;clearall;closeall;选择待处理图像',...file=fullfile(pathname,filename);%文件路径和文件名创建合成完整文件名id=Get_Id(file);%得到file中的所有对象Img=imread(file);%根据路径和文件名读取图片到Img[Plate,bw,Loc]=Pre_Process(Img);%车牌区域预处理result=Plate_Process(Plate,id);%车牌区域二值化处理%寻找连续有文字的块,若长度大于某阈值,
推荐度:
导读clc;clearall;closeall;选择待处理图像',...file=fullfile(pathname,filename);%文件路径和文件名创建合成完整文件名id=Get_Id(file);%得到file中的所有对象Img=imread(file);%根据路径和文件名读取图片到Img[Plate,bw,Loc]=Pre_Process(Img);%车牌区域预处理result=Plate_Process(Plate,id);%车牌区域二值化处理%寻找连续有文字的块,若长度大于某阈值,
clc; clear all; close all;

 选择待处理图像', ...

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) && (PY2end

% 对车牌区域的修正

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)end

% 想左追溯,直到找到车牌区域右边界

PX2 = x;

while (Blue_x(1,PX2)PX1)

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('模板库

文档

车牌识别系统MATLAB源代码完整

clc;clearall;closeall;选择待处理图像',...file=fullfile(pathname,filename);%文件路径和文件名创建合成完整文件名id=Get_Id(file);%得到file中的所有对象Img=imread(file);%根据路径和文件名读取图片到Img[Plate,bw,Loc]=Pre_Process(Img);%车牌区域预处理result=Plate_Process(Plate,id);%车牌区域二值化处理%寻找连续有文字的块,若长度大于某阈值,
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top