基于MATLAB的光学字符识别系统
项目简介
本项目是一个完全采用MATLAB编写的轻量级光学字符识别(OCR)解决方案。该系统实现了从图像生成、预处理、分割到字符识别的完整计算机视觉处理流程。不同于依赖外部复杂库的方案,本项目完全基于MATLAB的基础函数与图像处理工具箱,通过经典算法(如Otsu二值化、投影法分割、模板匹配)实现了对数字和英文字母的自动识别。
该系统的显著特点是具备自包含性:它不需要加载外部的模板图片或训练数据集,而是利用MATLAB的绘图引擎在线生成标准字符模板,并能自动合成带有噪声的测试图像,用户只需运行主程序即可观察完整的OCR处理过程。
功能特性
- 全流程自动化:涵盖图像获取、预处理、分割、特征提取、识别及可视化的完整OCR流水线。
- 自适应模板库:无需外部数据文件,程序运行时根据设定字体(如Arial)自动动态生成字符模板库。
- 鲁棒的预处理:包含灰度化、基于Otsu算法的自适应二值化、背景颜色自动反转以及基于面积的去噪处理。
- 精确分割算法:采用水平投影和垂直投影分析技术,有效实现文本行定位和单字符切割。
- 相关性匹配识别:基于二维相关系数(Correlation Coefficient)的模板匹配算法,提供可靠的字符识别率。
- 直观的可视化界面:程序运行过程中会弹出一个综合图形窗口,分步展示原始图、灰度图、二值图、分割线、单字符特写及最终识别结果。
系统要求
- MATLAB:建议使用 R2018b 或更高版本。
- 工具箱:必须安装 Image Processing Toolbox (图像处理工具箱),用于图像变换、形态学操作及二值化处理。
使用方法
- 确保MATLAB环境已安装并配置好图像处理工具箱。
- 将脚本文件保存在MATLAB的工作路径中。
- 在MATLAB命令行窗口输入函数名或直接运行脚本。
- 程序将自动执行以下操作:
* 构建字符模板库。
* 生成包含 "MATLAB 2025 OCR" 的合成测试图像。
* 处理图像并在图形窗口中显示每个阶段的处理结果。
* 在控制台和图形界面输出最终识别的文本字符串。
---
系统详细实现逻辑
本系统的核心逻辑严格遵循以下处理管线:
1. 系统初始化与模板构建
程序首先定义了识别参数,包括归一化后的字符目标尺寸(42x24像素)、待识别字符集(0-9, A-Z)以及字体类型。
- 在线模板生成:系统不读取本地图片,而是调用绘图函数在不可见的Figure中绘制每个字符,截取图像帧并进行二值化、反转、裁剪和归一化,最终存入结构体数组作为匹配标准。
2. 图像获取
为了演示方便,代码并未直接读取本地文件,而是调用内部函数生成一张合成图像。该图像包含文本 "MATLAB 2025 OCR",并添加了椒盐噪声以模拟真实环境中的干扰。
3. 图像预处理
为了提高识别准确率,对输入图像进行了一系列变换:
- 灰度化:将RGB图像转换为灰度图像。
- 二值化:使用Otsu方法(最大类间方差法)自动计算全局阈值,将灰度图转换为二值图像。
- 颜色校正:通过检测图像角点像素颜色,自动判断背景是黑还是白。系统统一将图像规整为"黑底白字"(前景为1,背景为0)的格式,以便后续处理。
- 去噪:利用形态学开运算或面积滤波(
bwareaopen),移除小于30像素的孤立噪点,消除椒盐噪声的影响。
4. 图像分割(投影法)
系统通过分析像素分布直方图来定位文字:
- 行分割(Y轴投影):统计二值图像每一行的白色像素总数。连续的非零区域即被视为文本行。
- 列分割(X轴投影):在提取出的文本行图像内部,统计每一列的白色像素数,从而将连续的文本行切割为独立的字符图像。
5. 特征提取与识别
- 归一化:将分割出的每一个字符图像(ROI)去除多余的黑边,并强制缩放到与模板一致的尺寸(42x24)。
- 核心识别算法:遍历提取的字符,将其与模板库中的每一个字符进行比对。代码采用二维相关系数 (2D Correlation Coefficient) 作为相似度度量标准。
* 计算待识别图像与模板图像之间的
corr2 值。
* 选取相关系数最大(最接近1)的模板对应的字符作为识别结果。
6. 结果输出
系统将识别出的字符拼接成字符串,并在控制台打印。同时,图形窗口会更新展示分割出的单字符细节以及最终叠加在图像上的识别文本。
---
关键算法与函数分析
以下对代码中的关键辅助函数及其算法原理进行解析:
match_character (模板匹配)
- 功能:输入归一化后的字符图像和模板库,返回最佳匹配字符。
- 算法:使用
corr2 函数计算图像矩阵的相关性。
* 将图像数据转换为双精度浮点型。
* 遍历所有模板,计算输入图像与当前模板的相关系数。
* 保留系数最高的结果,实现基于像素分布统计特性的模式识别。
segmentation_y / segmentation_x (投影分割)
*
segmentation_y:对矩阵按行求和 (
sum(bw, 2)),得到垂直方向的像素分布向量。
*
segmentation_x:对矩阵按列求和 (
sum(bw, 1)),得到水平方向的像素分布向量。
* 通过寻找求和向量中大于0的连续片段,确定文字或字符的起止坐标。
find_continuous_regions (区域定位)
- 功能:通用的辅助逻辑,用于处理投影向量。
- 算法:利用差分函数
diff 检测二值向量中的跳变点(0变1为起点,1变0为终点),从而精确返回所有非零连续区域的索引范围。
generate_templates (动态模板生成)
- 功能:解决OCR系统中模板来源问题。
- 实现细节:利用MATLAB的
getframe 功能捕获绘图窗口内容。该函数模拟了字符的"打印"过程,确保了模板与待识别合成图像在字体形态上的高度一致性,从而保证了演示的高识别率。
generate_synthetic_image (数据合成)
- 功能:生成测试数据。
- 实现细节:创建一个包含指定文本的Figure,捕获为图像数据,并人为添加
salt & pepper (椒盐) 噪声,以此验证系统去噪和预处理模块的有效性。