车牌识别matlab程序
带GUI界面,可以识别图像中的车牌,还可以检测出是什么颜色的车牌。
使用模板匹配的方法。
下面是一个基于Matlab的车牌识别程序,使用模板匹配的方法,并附带GUI界面。该程序能够识别图像中的车牌位置、提取车牌字符,并检测车牌的颜色。
GUI界面代码
function license_plate_gui
% 创建GUI界面
fig = figure('Name', '车牌识别系统', 'NumberTitle', 'off', ...
'Position', [200, 200, 800, 400]);
% 添加按钮和文本框
uicontrol('Style', 'pushbutton', 'String', '选择图片', ...
'Position', [50, 300, 100, 30], 'Callback', @load_image);
uicontrol('Style', 'pushbutton', 'String', '识别车牌', ...
'Position', [50, 250, 100, 30], 'Callback', @recognize_license_plate);
uicontrol('Style', 'text', 'String', '车牌颜色:', ...
'Position', [50, 200, 100, 30]);
uicontrol('Style', 'text', 'String', '', ...
'Position', [160, 200, 100, 30], 'Tag', 'color_result');
uicontrol('Style', 'text', 'String', '车牌号码:', ...
'Position', [50, 150, 100, 30]);
uicontrol('Style', 'text', 'String', '', ...
'Position', [160, 150, 100, 30], 'Tag', 'plate_number');
% 显示原始图像的轴
axes('Position', [0.3, 0.3, 0.6, 0.6], 'Tag', 'image_axes');
title('输入图像');
% 全局变量存储图像
global input_image;
input_image = [];
% 加载图片回调函数
function load_image(~, ~)
[file, path] = uigetfile({'*.jpg;*.png;*.bmp', '图像文件 (*.jpg, *.png, *.bmp)'});
if isequal(file, 0)
return;
end
full_path = fullfile(path, file);
input_image = imread(full_path);
axes(findobj('Tag', 'image_axes'));
imshow(input_image);
title('输入图像');
end
% 车牌识别回调函数
function recognize_license_plate(~, ~)
if isempty(input_image)
errordlg('请先加载一张图片!', '错误');
return;
end
% 调用车牌识别函数
[plate_number, plate_color] = detect_license_plate(input_image);
% 更新GUI显示结果
set(findobj('Tag', 'plate_number'), 'String', plate_number);
set(findobj('Tag', 'color_result'), 'String', plate_color);
end
end
车牌识别核心代码
function [plate_number, plate_color] = detect_license_plate(image)
% 车牌识别函数
gray_image = rgb2gray(image); % 转换为灰度图像
binary_image = edge(gray_image, 'Canny'); % 边缘检测
% 形态学操作增强边缘
se = strel('rectangle', [5, 15]);
dilated_image = imdilate(binary_image, se);
% 查找车牌区域
[labels, num_labels] = bwlabel(dilated_image);
stats = regionprops(labels, 'BoundingBox', 'Area');
% 筛选可能的车牌区域
min_area = 500; % 最小面积
max_aspect_ratio = 6; % 长宽比阈值
candidate_regions = [];
for i = 1:num_labels
if stats(i).Area > min_area
bbox = stats(i).BoundingBox;
aspect_ratio = bbox(3) / bbox(4);
if aspect_ratio < max_aspect_ratio && aspect_ratio > 1.5
candidate_regions = [candidate_regions; bbox];
end
end
end
% 如果没有找到合适的车牌区域
if isempty(candidate_regions)
error('未检测到车牌区域!');
end
% 提取最大的候选区域作为车牌
[~, idx] = max(candidate_regions(:, 3) .* candidate_regions(:, 4));
plate_bbox = candidate_regions(idx, :);
plate_image = imcrop(image, plate_bbox);
% 检测车牌颜色
plate_color = detect_plate_color(plate_image);
% 字符分割与识别(模板匹配)
plate_number = recognize_characters(plate_image);
end
function color = detect_plate_color(plate_image)
% 检测车牌颜色
hsv_image = rgb2hsv(plate_image);
hue = hsv_image(:, :, 1);
saturation = hsv_image(:, :, 2);
% 统计色调分布
blue_mask = (hue > 0.5 & hue < 0.7) & (saturation > 0.2);
yellow_mask = (hue > 0.1 & hue < 0.2) & (saturation > 0.2);
if sum(blue_mask(:)) > sum(yellow_mask(:))
color = '蓝色';
else
color = '黄色';
end
end
function number = recognize_characters(plate_image)
% 字符分割与模板匹配
% 这里使用简单的二值化和形态学操作分割字符
gray_plate = rgb2gray(plate_image);
binary_plate = imbinarize(gray_plate);
binary_plate = ~binary_plate; % 反色
% 字符分割
[char_images, ~] = extract_characters(binary_plate);
% 模板匹配识别字符
templates = load_templates(); % 加载模板
number = '';
for i = 1:length(char_images)
char_image = char_images{i};
best_match = '';
best_score = -inf;
for j = 1:length(templates)
template = templates{j};
score = corr2(imresize(char_image, size(template)), template);
if score > best_score
best_score = score;
best_match = char(j);
end
end
number = [number, best_match];
end
end
function templates = load_templates()
% 加载字符模板
% 假设模板已经保存为灰度图像文件
chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
templates = cell(length(chars), 1);
for i = 1:length(chars)
template_file = sprintf('templates/%c.png', chars(i));
templates{i} = imread(template_file);
templates{i} = imbinarize(rgb2gray(templates{i}));
end
end
function [char_images, positions] = extract_characters(binary_plate)
% 提取字符区域
[labels, num_labels] = bwlabel(binary_plate);
stats = regionprops(labels, 'BoundingBox', 'Area');
% 筛选字符区域
min_char_area = 50;
char_images = {};
positions = [];
for i = 1:num_labels
if stats(i).Area > min_char_area
bbox = stats(i).BoundingBox;
char_image = imcrop(binary_plate, bbox);
char_images{end+1} = char_image;
positions(end+1, :) = bbox;
end
end
% 按位置排序字符
[~, sorted_idx] = sort(positions(:, 1));
char_images = char_images(sorted_idx);
end
注意事项
- 模板准备:需要提前准备好字符模板(如数字和字母),并将其保存为PNG格式存放在
templates
文件夹中。 - 依赖工具箱:代码使用了Matlab的图像处理工具箱(Image Processing Toolbox)。
- 性能优化:模板匹配部分可以进一步优化,例如使用卷积神经网络(CNN)替代模板匹配以提高识别率。
为了帮助你更好地理解如何实现车牌识别并使用模板匹配方法进行字符识别,我将提供一个完整的代码示例。
完整的车牌识别和字符识别代码
1. GUI界面代码
function license_plate_gui
% 创建GUI界面
fig = figure('Name', '车牌识别系统', 'NumberTitle', 'off', ...
'Position', [200, 200, 800, 400]);
% 添加按钮和文本框
uicontrol('Style', 'pushbutton', 'String', '选择图片', ...
'Position', [50, 300, 100, 30], 'Callback', @load_image);
uicontrol('Style', 'pushbutton', 'String', '识别车牌', ...
'Position', [50, 250, 100, 30], 'Callback', @recognize_license_plate);
uicontrol('Style', 'text', 'String', '车牌颜色:', ...
'Position', [50, 200, 100, 30]);
uicontrol('Style', 'text', 'String', '', ...
'Position', [160, 200, 100, 30], 'Tag', 'color_result');
uicontrol('Style', 'text', 'String', '车牌号码:', ...
'Position', [50, 150, 100, 30]);
uicontrol('Style', 'text', 'String', '', ...
'Position', [160, 150, 100, 30], 'Tag', 'plate_number');
% 显示原始图像的轴
axes('Position', [0.3, 0.3, 0.6, 0.6], 'Tag', 'image_axes');
title('输入图像');
% 全局变量存储图像
global input_image;
input_image = [];
% 加载图片回调函数
function load_image(~, ~)
[file, path] = uigetfile({'*.jpg;*.png;*.bmp', '图像文件 (*.jpg, *.png, *.bmp)'});
if isequal(file, 0)
return;
end
full_path = fullfile(path, file);
input_image = imread(full_path);
axes(findobj('Tag', 'image_axes'));
imshow(input_image);
title('输入图像');
end
% 车牌识别回调函数
function recognize_license_plate(~, ~)
if isempty(input_image)
errordlg('请先加载一张图片!', '错误');
return;
end
% 调用车牌识别函数
[plate_number, plate_color] = detect_license_plate(input_image);
% 更新GUI显示结果
set(findobj('Tag', 'plate_number'), 'String', plate_number);
set(findobj('Tag', 'color_result'), 'String', plate_color);
end
end
2. 车牌识别核心代码
function [plate_number, plate_color] = detect_license_plate(image)
% 车牌识别函数
gray_image = rgb2gray(image); % 转换为灰度图像
binary_image = edge(gray_image, 'Canny'); % 边缘检测
% 形态学操作增强边缘
se = strel('rectangle', [5, 15]);
dilated_image = imdilate(binary_image, se);
% 查找车牌区域
[labels, num_labels] = bwlabel(dilated_image);
stats = regionprops(labels, 'BoundingBox', 'Area');
% 筛选可能的车牌区域
min_area = 500; % 最小面积
max_aspect_ratio = 6; % 长宽比阈值
candidate_regions = [];
for i = 1:num_labels
if stats(i).Area > min_area
bbox = stats(i).BoundingBox;
aspect_ratio = bbox(3) / bbox(4);
if aspect_ratio < max_aspect_ratio && aspect_ratio > 1.5
candidate_regions = [candidate_regions; bbox];
end
end
end
% 如果没有找到合适的车牌区域
if isempty(candidate_regions)
error('未检测到车牌区域!');
end
% 提取最大的候选区域作为车牌
[~, idx] = max(candidate_regions(:, 3) .* candidate_regions(:, 4));
plate_bbox = candidate_regions(idx, :);
plate_image = imcrop(image, plate_bbox);
% 检测车牌颜色
plate_color = detect_plate_color(plate_image);
% 字符分割与识别(模板匹配)
plate_number = recognize_characters(plate_image);
end
function color = detect_plate_color(plate_image)
% 检测车牌颜色
hsv_image = rgb2hsv(plate_image);
hue = hsv_image(:, :, 1);
saturation = hsv_image(:, :, 2);
% 统计色调分布
blue_mask = (hue > 0.5 & hue < 0.7) & (saturation > 0.2);
yellow_mask = (hue > 0.1 & hue < 0.2) & (saturation > 0.2);
if sum(blue_mask(:)) > sum(yellow_mask(:))
color = '蓝色';
else
color = '黄色';
end
end
function number = recognize_characters(plate_image)
% 字符分割与模板匹配
% 这里使用简单的二值化和形态学操作分割字符
gray_plate = rgb2gray(plate_image);
binary_plate = imbinarize(gray_plate);
binary_plate = ~binary_plate; % 反色
% 字符分割
[char_images, ~] = extract_characters(binary_plate);
% 模板匹配识别字符
templates = load_templates(); % 加载模板
number = '';
for i = 1:length(char_images)
char_image = char_images{i};
best_match = '';
best_score = -inf;
for j = 1:length(templates)
template = templates{j};
score = corr2(imresize(char_image, size(template)), template);
if score > best_score
best_score = score;
best_match = char(j);
end
end
number = [number, best_match];
end
end
function templates = load_templates()
% 加载字符模板
% 假设模板已经保存为灰度图像文件
chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
templates = cell(length(chars), 1);
for i = 1:length(chars)
template_file = sprintf('templates/%c.png', chars(i));
templates{i} = imread(template_file);
templates{i} = imbinarize(rgb2gray(templates{i}));
end
end
function [char_images, positions] = extract_characters(binary_plate)
% 提取字符区域
[labels, num_labels] = bwlabel(binary_plate);
stats = regionprops(labels, 'BoundingBox', 'Area');
% 筛选字符区域
min_char_area = 50;
char_images = {};
positions = [];
for i = 1:num_labels
if stats(i).Area > min_char_area
bbox = stats(i).BoundingBox;
char_image = imcrop(binary_plate, bbox);
char_images{end+1} = char_image;
positions(end+1, :) = bbox;
end
end
% 按位置排序字符
[~, sorted_idx] = sort(positions(:, 1));
char_images = char_images(sorted_idx);
end
使用说明
- 运行GUI:运行
license_plate_gui
函数,会弹出一个GUI界面。 - 选择图片:点击“选择图片”按钮,选择包含车牌的图片。
- 识别车牌:点击“识别车牌”按钮,程序会自动识别车牌,并显示车牌号码和颜色。
1. GUI界面代码
function license_plate_gui
% 创建GUI界面
fig = figure('Name', '车牌识别系统', 'NumberTitle', 'off', ...
'Position', [200, 200, 800, 400]);
% 添加按钮和文本框
uicontrol('Style', 'pushbutton', 'String', '选择图片', ...
'Position', [50, 300, 100, 30], 'Callback', @load_image);
uicontrol('Style', 'pushbutton', 'String', '识别车牌', ...
'Position', [50, 250, 100, 30], 'Callback', @recognize_license_plate);
uicontrol('Style', 'text', 'String', '车牌颜色:', ...
'Position', [50, 200, 100, 30]);
uicontrol('Style', 'text', 'String', '', ...
'Position', [160, 200, 100, 30], 'Tag', 'color_result');
uicontrol('Style', 'text', 'String', '车牌号码:', ...
'Position', [50, 150, 100, 30]);
uicontrol('Style', 'text', 'String', '', ...
'Position', [160, 150, 100, 30], 'Tag', 'plate_number');
% 显示原始图像的轴
axes('Position', [0.3, 0.3, 0.6, 0.6], 'Tag', 'image_axes');
title('输入图像');
% 全局变量存储图像
global input_image;
input_image = [];
% 加载图片回调函数
function load_image(~, ~)
[file, path] = uigetfile({'*.jpg;*.png;*.bmp', '图像文件 (*.jpg, *.png, *.bmp)'});
if isequal(file, 0)
return;
end
full_path = fullfile(path, file);
input_image = imread(full_path);
axes(findobj('Tag', 'image_axes'));
imshow(input_image);
title('输入图像');
end
% 车牌识别回调函数
function recognize_license_plate(~, ~)
if isempty(input_image)
errordlg('请先加载一张图片!', '错误');
return;
end
% 调用车牌识别函数
[plate_number, plate_color] = detect_license_plate(input_image);
% 更新GUI显示结果
set(findobj('Tag', 'plate_number'), 'String', plate_number);
set(findobj('Tag', 'color_result'), 'String', plate_color);
end
end
2. 车牌识别核心代码
function [plate_number, plate_color] = detect_license_plate(image)
% 车牌识别函数
gray_image = rgb2gray(image); % 转换为灰度图像
binary_image = edge(gray_image, 'Canny'); % 边缘检测
% 形态学操作增强边缘
se = strel('rectangle', [5, 15]);
dilated_image = imdilate(binary_image, se);
% 查找车牌区域
[labels, num_labels] = bwlabel(dilated_image);
stats = regionprops(labels, 'BoundingBox', 'Area');
% 筛选可能的车牌区域
min_area = 500; % 最小面积
max_aspect_ratio = 6; % 长宽比阈值
candidate_regions = [];
for i = 1:num_labels
if stats(i).Area > min_area
bbox = stats(i).BoundingBox;
aspect_ratio = bbox(3) / bbox(4);
if aspect_ratio < max_aspect_ratio && aspect_ratio > 1.5
candidate_regions = [candidate_regions; bbox];
end
end
end
% 如果没有找到合适的车牌区域
if isempty(candidate_regions)
error('未检测到车牌区域!');
end
% 提取最大的候选区域作为车牌
[~, idx] = max(candidate_regions(:, 3) .* candidate_regions(:, 4));
plate_bbox = candidate_regions(idx, :);
plate_image = imcrop(image, plate_bbox);
% 检测车牌颜色
plate_color = detect_plate_color(plate_image);
% 字符分割与识别(模板匹配)
plate_number = recognize_characters(plate_image);
end
function color = detect_plate_color(plate_image)
% 检测车牌颜色
hsv_image = rgb2hsv(plate_image);
hue = hsv_image(:, :, 1);
saturation = hsv_image(:, :, 2);
% 统计色调分布
blue_mask = (hue > 0.5 & hue < 0.7) & (saturation > 0.2);
yellow_mask = (hue > 0.1 & hue < 0.2) & (saturation > 0.2);
if sum(blue_mask(:)) > sum(yellow_mask(:))
color = '蓝色';
else
color = '黄色';
end
end
function number = recognize_characters(plate_image)
% 字符分割与模板匹配
% 这里使用简单的二值化和形态学操作分割字符
gray_plate = rgb2gray(plate_image);
binary_plate = imbinarize(gray_plate);
binary_plate = ~binary_plate; % 反色
% 字符分割
[char_images, ~] = extract_characters(binary_plate);
% 模板匹配识别字符
templates = load_templates(); % 加载模板
number = '';
for i = 1:length(char_images)
char_image = char_images{i};
best_match = '';
best_score = -inf;
for j = 1:length(templates)
template = templates{j};
score = corr2(imresize(char_image, size(template)), template);
if score > best_score
best_score = score;
best_match = char(j);
end
end
number = [number, best_match];
end
end
function templates = load_templates()
% 加载字符模板
% 假设模板已经保存为灰度图像文件
chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
templates = cell(length(chars), 1);
for i = 1:length(chars)
template_file = sprintf('templates/%c.png', chars(i));
templates{i} = imread(template_file);
templates{i} = imbinarize(rgb2gray(templates{i}));
end
end
function [char_images, positions] = extract_characters(binary_plate)
% 提取字符区域
[labels, num_labels] = bwlabel(binary_plate);
stats = regionprops(labels, 'BoundingBox', 'Area');
% 筛选字符区域
min_char_area = 50;
char_images = {};
positions = [];
for i = 1:num_labels
if stats(i).Area > min_char_area
bbox = stats(i).BoundingBox;
char_image = imcrop(binary_plate, bbox);
char_images{end+1} = char_image;
positions(end+1, :) = bbox;
end
end
% 按位置排序字符
[~, sorted_idx] = sort(positions(:, 1));
char_images = char_images(sorted_idx);
end
使用说明
- 运行GUI:运行
license_plate_gui
函数,会弹出一个GUI界面。 - 选择图片:点击“选择图片”按钮,选择包含车牌的图片。
- 识别车牌:点击“识别车牌”按钮,程序会自动识别车牌,并显示车牌号码和颜色。