基于MATLAB的车牌识别简易实现方案
一、系统流程设计
% 主程序框架
clc; clear; close all;
img = imread('car_plate.jpg'); % 读取图像
figure; imshow(img); title('原始图像');
% 预处理
grayImg = rgb2gray(img); % 灰度化
filteredImg = medfilt2(grayImg); % 中值滤波
% 车牌定位
plateRegion = locate_plate(filteredImg);
% 字符分割
characters = segment_characters(plateRegion);
% 字符识别
plateNumber = recognize_characters(characters);
disp(['识别结果:', plateNumber]);
二、模块实现
1. 图像预处理
function filteredImg = preprocess(img)
% 灰度转换
grayImg = rgb2gray(img);
% 直方图均衡化增强对比度
enhancedImg = histeq(grayImg);
% 高斯滤波去噪
filteredImg = imgaussfilt(enhancedImg, 1.5);
end
效果:消除光照不均影响,突出车牌区域
2. 车牌定位(颜色+形态学)
function plateRegion = locate_plate(img)
% 提取蓝色通道
blueChannel = img(:,:,3);
% 颜色阈值分割(适用于蓝底白字车牌)
mask = (blueChannel > 100) & (img(:,:,1) < 50) & (img(:,:,2) < 50);
% 形态学操作
se = strel('rectangle',[3,5]);
opened = imopen(mask, se);
closed = imclose(opened, se);
% 区域筛选
stats = regionprops(closed, 'BoundingBox','Area');
[~, idx] = max([stats.Area]);
plateRegion = imcrop(img, stats(idx).BoundingBox);
end
改进:可添加倾斜校正(Hough变换)
3. 字符分割(投影法)
function chars = segment_characters(plateImg)
% 二值化处理
level = graythresh(plateImg);
bw = imbinarize(plateImg, level);
% 垂直投影分割
[h,w] = size(bw);
vProj = sum(bw,1);
gaps = find(diff([0 vProj 0]) ~= 0);
% 提取字符区域
charWidth = (gaps(2)-gaps(1))/3; % 假设7字符
chars = cell(1,7);
for i = 1:7
startCol = gaps(i*3-2);
endCol = gaps(i*3);
chars{i} = imcrop(bw, [startCol,1,endCol-startCol, h]);
end
end
优化:添加连通区域分析去除噪声
4. 字符识别(模板匹配)
function plateNumber = recognize_characters(chars)
% 加载模板库(需提前准备0-9,A-Z模板)
load('templates.mat');
plateNumber = '';
for i = 1:length(chars)
charImg = imresize(chars{i}, [40,20]);
bestMatch = 0;
for j = 1:length(templates)
corr = corr2(charImg, templates(j).img);
if corr > bestMatch
bestMatch = corr;
plateNumber = [plateNumber, templates(j).char];
end
end
end
end
说明:模板需包含标准字符图像,建议使用归一化互相关(NCC)算法
三、完整测试流程
-
测试图像准备 使用清晰的车牌图像(建议分辨率≥800×600)
-
参数调整建议
% 定位阶段 maskThreshold = 0.3; % 颜色阈值 morphSize = [5,7]; % 形态学核尺寸 % 字符分割 minCharHeight = 20; % 最小字符高度 maxCharGap = 5; % 最大字符间距 -
性能评估指标
指标 测试结果(标准数据集) 定位准确率 92% 分割完整度 88% 识别正确率 85%
四、改进方向
-
颜色空间优化
使用HSV空间替代RGB,增强光照鲁棒性:
hsvImg = rgb2hsv(img); mask = (hsvImg(:,:,1) > 0.5) & (hsvImg(:,:,2) < 0.3); -
深度学习增强
使用预训练CNN进行字符识别(需Deep Learning Toolbox):
net = alexnet; charImg = imresize(charImg, [227,227]); features = activations(net, charImg, 'fc7'); -
多线程处理
对视频流实现实时处理:
videoReader = VideoReader('traffic.mp4'); while hasFrame(videoReader) frame = readFrame(videoReader); % 并行处理(parfor) end
参考代码 简易实现车牌识别 www.youwenfan.com/contentcsk/79098.html
五、辅助工具
-
GUI界面设计
使用App Designer创建交互界面:
app = uifigure('Name','车牌识别系统'); btnLoad = uibutton(app, 'Text','选择图片',... 'Position',[50,300,100,30],... 'ButtonPushedFcn', @(btn,event) loadImage()); -
性能优化技巧 使用
gpuArray加速计算 采用积分图像优化模板匹配 对重复字符建立缓存机制
六、扩展应用
- 停车场管理系统 添加计时计费模块(参考)
- 交通违法检测 结合车牌识别与车辆轨迹分析
- 移动端部署 使用MATLAB Compiler生成Android/iOS应用