应先进行图像预处理再定位车牌,具体包括读取图像、转灰度、中值滤波去噪、自适应直方图均衡化增强对比度;接着用Canny边缘检测、闭运算连接边缘、填充孔洞、筛选连通域并按长宽比与面积定位车牌区域;最后二值化、字符分割、OCR识别并清洗结果。
如果您尝试从一张车辆图像中提取车牌号码,但系统无法正确识别,则可能是由于图像质量不佳或预处理步骤缺失。以下是解决此问题的步骤:
一、图像预处理:提升图像质量
预处理是确保后续定位与识别准确的基础环节,主要目标是消除噪声、增强对比度、统一亮度,并为二值化提供可靠输入。未经过滤的原始图像常含光照不均、模糊、反光等干扰,直接进入OCR会导致字符断裂或粘连。
1、使用
读取彩色图像:
img = imread('car_image.jpg');
2、调用
转换为灰度图:
gray_img = rgb2gray(img);
3、应用中值滤波去除椒盐噪声:
denoised_img = medfilt2(gray_img, [3 3]);
4、使用自适应直方图均衡化增强局部对比度:
enhanced_img = adapthisteq(denoised_img);
二、车牌区域定位:精准框出车牌位置
定位失败将导致OCR作用于错误区域,因此需结合颜色特征(蓝/绿底)、边缘连续性及几何约束(长宽比≈4.5:1)进行多条件筛选。仅依赖单一阈值分割易受背景干扰。
1、对增强图像执行Canny边缘检测:
edges = edge(enhanced_img, 'Canny', [0.1 0.2]);
2、构造矩形结构元素并闭运算连接断裂边缘:
se = strel('rectangle', [5 15]); closed_edges = imclose(edges, se);
3、填充孔洞并剔除小面积连通域:
filled = imfill(closed_edges, 'holes'); cleaned = bwareaopen(filled, 500);
4、提取连通区域属性,按长宽比与面积筛选候选区域:
stats = regionprops(cleaned, 'BoundingBox', 'Area', 'Extent'); valid_regions = [stats.Area] > 1000 & ([stats.BoundingBox(:,3)] ./ [stats.BoundingBox(:,4)]) > 3 &
三、车牌图像裁剪与二值化:构建标准输入
裁剪后的车牌子图需进一步归一化尺寸并二值化,以适配OCR引擎对黑白分明、字符清晰的输入要求。全局阈值在光照不均时失效,应优先采用局部自适应方法。
1、根据筛选出的有效包围框裁剪车牌区域:
plate_roi = imcrop(enhanced_img, bbox);
2、使用Otsu法自动获取全局阈值并二值化:
bw_plate = imbinarize(plate_roi, 'global');
3、若存在局部阴影,改用自适应阈值:
bw_plate = imbinarize(plate_roi, 'adaptive', 'Sensitivity', 0.4);
4、对二值图像做形态学开运算消除毛刺:
se_char = strel('disk', 1); bw_clean = imopen(bw_plate, se_char);
四、字符分割:分离单个字符图像
字符粘连或断裂会显著降低OCR识别率,因此需基于垂直投影或连通域分析实现稳定分割。新能源车牌含汉字、字母、数字及分隔符,需保留完整字符宽度信息。
1、计算二值车牌图像的垂直像素投影:
proj = sum(bw_clean, 1);
2、寻找投影谷值作为字符间隔点,设定最小宽度阈值过滤噪声:
min_width = round(size(bw_clean, 2) / 8); [peaks, locs] = findpeaks(proj, 'MinPeakDistance', min_width);
3、依据峰值位置生成字符边界矩形列表:
char_bounds = []; for i = 1:length(locs)-1, char_bounds(i,:) = [locs(i), 1, locs(i+1)-locs(i), size(bw_clean,1)]; end;
4、逐个裁剪字符子图并归一化至固定尺寸(如40×60):
char_img = imresize(imcrop(bw_clean, char_bounds(k,:)), [40 60]);
五、OCR识别:调用MATLAB内置引擎完成字符判别
MATLAB R2023b起集成增强型OCR功能,支持自定义字符集与语言模型。默认识别易将“O”误判为“0”、“I”误判为“1”,需显式限定字符空间并启用置信度过滤。
1、设置仅识别中文、英文字母及阿拉伯数字:
ocr_result = ocr(bw_clean, 'CharacterSet', '京沪粤津渝冀晋辽吉黑苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云陕甘青宁新藏蒙0123456789ABCDEFGHJKLMNPQRSTUVWXYZ');
2、指定语言为简体中文以提升汉字识别准确率:
ocr_result = ocr(bw_clean, 'Language', 'Chinese');
3、提取高置信度字符结果(置信度≥0.7):
high_conf = ocr_result.Words(ocr_result.Confidence >= 70);
4、拼接识别字符串并去除空格与异常符号:
plate_text = regexprep(strjoin({high_conf.Text}, ''), '[^京沪粤津渝冀晋辽吉黑苏浙皖闽赣鲁豫鄂湘粤桂琼川贵云陕甘青宁新藏蒙0123456789ABCDEFGHJKLMNPQRSTUVWXYZ·]', '');
imreadrgb2gray