实验一:利用Matlab运行车牌识别方法

河南工业大学

《人工智能》实验报告

专业班级: 学号**:** 姓名:

实验一:利用 Matlab 运行车牌识别方法

【实验目的】

(1) 了解Matlab的运行环境。

(2) 了解如何使用Matlab软件来实现基于模板的车牌识别方法。

【实验环境】

Window11(x64),Python 3.10.9(x64),Visual Studio Code(x64))

【实验内容】

1.Matlab的安装

2.掌握车牌识别的主要流程

【实验作业

  1. 请写出在车牌识别之前,程序经历了哪些图像预处理?

  2. 请写出你是利用什么方法实现车牌中的字符识别的,请附上相关代码?

  3. 请在校园里随手拍一张车牌照(可以只拍局部),并用你的程序识别它?(选作)

【实验结果】

  1. Matlab安装

答:

找到Matlab R2020b版本的网盘资源进行下载,如图1所示。下载解压后,跟着步骤进行安装,安装过程见图2,3所示。安装完后打开Matlab R2020b即可运行,见图4所示。

图 1 下载安装包

图 2 解压文件

图 3 安装软件

图 4 安装完成

  1. 请写出在车牌识别之前,程序经历了哪些图像预处理?

答:

当加载图片后,预处理步骤主要包括灰度化、边缘检测、腐蚀处理、填充图像、形态滤波和车牌提取。预处理步骤如下:

灰度化是将彩色图像转换为灰度图像的过程。在灰度图像中,每个像素只有一个值,表示该点的亮度,范围通常在0到255之间。灰度化是为了简化图像处理的复杂性,同时保留图像的主要特征。由于车牌识别中只需关注字符的形状和灰度信息,因此将彩色图像转换为灰度图像可以降低计算成本,并加速后续处理步骤。边缘检测是识别图像中物体边界的过程。Sobel 算子是一种常用的边缘检测算子,它在图像中进行卷积运算,通过计算像素点的梯度来检测边缘。

在车牌识别中,边缘检测有助于找到车牌字符之间的分界线,从而更容易进行字符分割。它能够帮助过滤掉图像中的一些无关的信息,提取出图像中的主要特征。腐蚀是一种形态学操作,它通过对图像进行局部缩小来消除图像中的小目标或细小的干扰物。在车牌识别中,腐蚀操作有助于减小字符之间的间隙,使得字符更加连接。这可以提高后续形态学操作的效果,同时减少字符分割的误差。填充图像是用指定的颜色或灰度值填充图像中的空洞或孔洞。

填充图像有助于连接字符之间的间隙,使得字符区域更加连通。这有助于提高后续形态学操作的效果,同时减少字符分割的误差。形态滤波是一种形态学操作,主要包括膨胀和腐蚀两种基本操作。闭运算是形态学操作中的一种,它先进行腐蚀操作,再进行膨胀操作。闭运算可以平滑图像并消除小的干扰物体,同时保留主要的目标区域。

而形态滤波有助于减小字符之间的间隙,使得字符更加连接,进一步优化字符分割的效果。车牌提取是通过一系列操作来定位图像中的车牌区域。通常使用轮廓检测、连通区域分析等技术来定位车牌区域。在车牌识别中,首先需要定位并提取出图像中的车牌区域,然后才能进行后续的字符分割和识别。因此,车牌提取是车牌识别系统中的一个关键步骤,它直接影响到后续识别的准确性和效率。

图 5 车牌识别流程

  1. 请写出你是利用什么方法实现车牌中的字符识别的,请附上相关代码?

答:

代码所使用的技术是基于图像处理的车牌定位和识别。这种技术利用计算机视觉算法对车牌图像进行处理,从而实现车牌的自动定位和字符识别。首先,通过将彩色车牌图像转换为灰度图像,降低了处理的复杂度。接着,使用边缘检测算法(Sobel算子)来检测图像中的边缘信息,这有助于找到车牌的轮廓。然后,通过腐蚀和闭运算等形态学处理步骤,对边缘检测后的图像进行细化和去噪,从而更好地提取出车牌区域。接下来,通过形态滤波和面积过滤等方法,进一步清除图像中的噪声,保留有效的车牌信息。最后,对车牌区域进行字符分割和识别,通过处理后的字符图像,使用预定义的模板库进行匹配,从而实现对车牌中字符的识别。这种基于图像处理的车牌定位和识别技术,具有较高的准确性和可靠性,在实际应用中能够有效地实现车牌的自动识别。通过合理选择和组合图像处理算法,可以针对不同类型和光照条件下的车牌图像进行处理,从而适应不同的场景需求。同时,该技术也为自动化车牌识别系统的开发提供了基础,可在车辆管理、交通监控等领域发挥重要作用。

核心部分代码如下:

  1. function pushbutton2_Callback(hObject, eventdata, handles)

  2. % 从 GUI 中获取图像数据

  3. Img = handles.Img;

  4. % 灰度化

  5. I_gray = rgb2gray(Img);

  6. % 边缘检测

  7. I_edge = edge(I_gray, 'sobel');

  8. % 腐蚀处理

  9. I_erode = imerode(I_edge, [1;1;1]);

  10. % 填充图像

  11. I_close = imclose(I_erode, strel('rectangle', [25, 25]));

  12. % 形态滤波

  13. I_final = bwareaopen(I_close, 1500);

  14. % 提取车牌

  15. I_new = zeros(size(I_final,1), size(I_final,2));

  16. location_of_1 = [];

  17. for i = 1:size(I_final,1)

  18. for j = 1:size(I_final,2)

  19. if I_final(i,j) == 1

  20. newlocation = [i,j];

  21. location_of_1 = [location_of_1; newlocation];

  22. end

  23. end

  24. end

  25. mini = inf;

  26. maxi = 0;

  27. for i = 1:size(location_of_1,1)

  28. temp = location_of_1(i,1) + location_of_1(i,2);

  29. if temp < mini

  30. mini = temp;

  31. a = i;

  32. end

  33. if temp > maxi

  34. maxi = temp;

  35. b = i;

  36. end

  37. end

  38. first_point = location_of_1(a,:);

  39. last_point = location_of_1(b,:);

  40. x1 = first_point(1) + 10;

  41. x2 = last_point(1) - 4;

  42. y1 = first_point(2) + 10;

  43. y2 = last_point(2) - 4;

  44. I_plate = Img(x1:x2, y1:y2);

  45. % 在 GUI 中显示处理后的车牌图像

  46. axes(handles.axes8);

  47. imshow(I_plate);

  48. title('车牌提取');

  49. % 保存处理后的车牌图像到 handles 结构体中

  50. handles.I_plate = I_plate;

  51. guidata(hObject, handles);

  52. end

  53. % --- Executes on button press in pushbutton2.

  54. function pushbutton2_Callback(hObject, eventdata, handles)

  55. % 获取处理后的车牌图像

  56. I_plate = handles.I_plate;

  57. % 水平分割线的横坐标

  58. X = [];

  59. % 省略代码,获取水平分割线的横坐标

  60. % 循环进行字符分割和识别

  61. for n = 1:7

  62. % 粗分割

  63. char = I_plate(:, X(2*n-1):X(2*n)-1);

  64. % 字符上下裁剪

  65. for i = 1:size(char,1)

  66. if sum(char(i,:)) ~= 0

  67. top = i;

  68. break;

  69. end

  70. end

  71. for i = 1:size(char,1)

  72. if sum(char(size(char,1)-i,:)) ~= 0

  73. bottom = size(char,1)-i;

  74. break;

  75. end

  76. end

  77. char = char(top:bottom,:);

  78. % 归一化

  79. char = imresize(char, [40,20], 'nearest');

  80. % 将分割的字符放入 Char_i 中

  81. eval(strcat('Char_', num2str(n), '=char;'));

  82. end

  83. % 字符识别

  84. char = [];

  85. store1 = strcat('贵','豫','粤','湘','鄂','皖','鲁','藏','京','苏','黑','吉','冀','晋','辽','浙','津','闽','云','陕','琼');

  86. % 省略代码,汉字识别部分

  87. store2 = strcat('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');

  88. % 省略代码,字母与数字识别模板库

  89. % 在 GUI 中显示识别结果

  90. set(handles.edit1, 'string', strcat('车牌为:', char), 'FontWeight', 'Bold', 'FontSize', 12, 'ForegroundColor', [1 0 0]);

  91. end

  92. 请在校园里随手拍一张车牌照(可以只拍局部),并用你的程序识别它?

答:

在校园里拍摄一辆汽车的车牌,如图6所示。接下来,我将对它进行图片预处理,这个过程主要包括灰度化、边缘检测、腐蚀处理、填充图像、形态滤波,处理过程以及相关结果图见图7所示。

图 6 随机拍摄一辆车的车牌

图 7 图片预处理

处理后的车牌图片,随后经过图像提取过程,再使用字符切割成一个字符一个字符的形式,如图8所示。最后采用字符检测,即可检测出车牌号码,识别结果见图9所示。

图 8 车牌提取

图 9 车牌识别结果

【实验体会】

本次实验涉及到Matlab软件的配置和使用,它是一个强大而便捷的工具。我首先熟悉了Matlab的基本操作,包括创建脚本文件、加载图像、调用函数等。通过Matlab的交互式界面,我能够快速进行代码编写、调试和执行,极大地提高了实验效率。其次,在图像处理中,我学习了许多常用的图像处理方法。其中,灰度化和边缘检测是最基础的步骤,能够有效地提取图像中的轮廓信息。我深刻体会到形态学处理的重要性,腐蚀和闭运算能够帮助去除图像中的噪声,从而更准确地定位车牌区域。此外,形态滤波和面积过滤等方法对于进一步优化车牌识别结果也起到了关键作用。

紧接着,我深入了解了基于图像处理的车牌识别技术。通过字符分割和识别的步骤,我明白了在实际应用中,对于车牌中每个字符的准确识别至关重要。同时,利用预定义的模板库进行匹配,能够提高识别的准确率和速度。我还学习了如何针对不同场景的车牌图像进行优化,以适应各种光照条件和车牌类型。通过这次实验,我对图像处理技术和车牌识别有了更深入的理解和实践经验。Matlab作为一个功能强大的工具,在图像处理领域展现出了巨大的优势。我将继续深入学习图像处理算法,并探索更多实际应用场景,努力提升自己的技术水平。未来,我希望能够将所学知识应用于实际项目中,为社会交通管理等领域提供更加智能和高效的解决方案。

相关推荐
吃好睡好便好6 小时前
在Matlab中绘制三维等高线图
开发语言·python·学习·算法·matlab·信息可视化
Aaron15888 小时前
RFSOC+VU13P/VU9P+GPU多通道同步一体化解决方案
人工智能·嵌入式硬件·算法·matlab·fpga开发·硬件架构·基带工程
Evand J8 小时前
【MATLAB】多无人机编队协同控制与三维航迹规划仿真。障碍物斥力避障,输出编队误差、控制输入、三维轨迹等
开发语言·matlab·无人机
青春不败 177-3266-052010 小时前
MATLAB 2024b深度学习新特性全面解析与DeepSeek大模型集成开发
人工智能·深度学习·机器学习·matlab·卷积神经网络·自编码器·deepseek
吃好睡好便好11 小时前
Matlab中三种三维图的对比
开发语言·人工智能·学习·算法·matlab·信息可视化
Evand J12 小时前
【MATLAB例程】5个UAV 分布式围捕编队运动仿真 —— 基于PID控制
开发语言·分布式·matlab
吃好睡好便好14 小时前
在Matlab中绘制二维等高线图
开发语言·人工智能·学习·算法·matlab
2zcode14 小时前
基于Matlab元胞自动机模拟(CA)动态再结晶过程
开发语言·matlab·动态再结晶
yong99901 天前
MATLAB仿真计算电磁波回波信号的技术路径与实现指南
开发语言·matlab