如何使用 MATLAB 分割文本图像?
Posted
技术标签:
【中文标题】如何使用 MATLAB 分割文本图像?【英文标题】:How to segment text images using MATLAB? 【发布时间】:2011-02-06 11:43:05 【问题描述】:这是OCR过程的一部分,即:
如何将句子分割成单词,再分割成字符?
这个任务的候选算法是什么?
【问题讨论】:
【参考方案1】:作为第一关:
将文本处理成行 将线加工成线段(连接部分) 找到可以放置在每对线段之间的最大白带。 查看宽度顺序并选择“大”宽度作为空白。 空格之间的所有内容都是一个单词。现在你只需要一个足够好的“大”定义。
【讨论】:
但是基于空间的解决方案不适用于 CJK 字符:en.wikipedia.org/wiki/CJK_characters 在这种情况下,OCR 会隔离几个字符并猜测字母表。如果是英文,就做上面的,如果不是,做别的。【参考方案2】:首先,NIST(美国国家标准与技术研究院)在大约 15 年前发布了一个名为 NIST 基于表单的手写识别系统的protocol对于这个确切的问题——即提取和准备文本作为图像的数据,以输入到 OCR 的机器学习算法中。 NIST 这个小组的成员也在这个系统上发布了许多papers。
他们的分类器的性能也通过该算法发布的数据(“NIST 手写样本表格”)得到证明。
我已经下载和使用的大约六个 OCR 数据集中的每一个都引用了 NIST 使用的数据提取/准备协议来准备数据以输入到他们的算法中。特别是,我很确定这是准备波士顿大学手写数字数据库所依赖的方法,该数据库被视为 OCR 的基准参考数据。
因此,如果 NIST 协议不是真正的标准,至少它是一种经过验证的方法,可以将文本作为图像准备用于 OCR 算法的输入。我建议从那里开始,并使用该协议来准备您的数据,除非您有充分的理由不这样做。
总之,NIST 数据是通过直接从预先打印的表格中提取 32 位 x 32 位标准化位图来准备的。
这是一个例子:
00000000000001100111100000000000 00000000000111111111111111000000 00000000011111111111111111110000 00000000011111111111111111110000 00000000011111111101000001100000 00000000011111110000000000000000 00000000111100000000000000000000 000000011111000000000000000000000 00000001111100011110000000000000 00000001111100011111000000000000 00000001111111111111111000000000 00000001111111111111111000000000 00000001111111111111111110000000 00000001111111111111111100000000 00000001111111100011111110000000 00000001111110000001111110000000 00000001111100000000111110000000 00000001111000000000111110000000 00000000000000000000001111000000 00000000000000000000001111000000 00000000000000000000011110000000 00000000000000000000011110000000 00000000000000000000111110000000 000000000000000000001111100000000 00000000001110000001111100000000 00000000001110000011111100000000 00000000001111101111111000000000 00000000011111111111100000000000 00000000011111111111000000000000 00000000011111111110000000000000 00000000001111111000000000000000 00000000000010000000000000000000
我认为 BU 数据准备技术包含了 NIST 技术,但在最后增加了一些步骤,目的不是为了提高保真度,而是为了减小文件大小。特别是 BU 组:
从 32 x 32 位图开始;那么 将每个 32 x 32 位图分为 4x4 的非重叠块; 接下来,他们数了数 每个块中的激活像素(“1” 被激活; “0”不是); 结果是一个 8 x 8 输入矩阵 其中每个元素都是整数 (0-16)【讨论】:
不,输入的是一个带有句子的图像,我想将其拆分为单个单词的图像,然后拆分为单个字符的图像。 我在你的回答中找不到任何实现细节:( 今晚我将编辑我的答案,以便提供分步指南。【参考方案3】:用于查找二进制序列,如 101000000000000000010000001 检测序列0000,0001,001,01,1
【讨论】:
【参考方案4】:我假设您使用的是 matlab 中的图像处理工具箱。
区分图像中的文本。您可能想关注:
-
灰度(大大加快速度)。
对比度增强。
轻轻腐蚀图像以去除噪点(划痕/光点)
扩张(重度)。
边缘检测(或 ROI 计算)。
通过反复试验,您将获得适当的系数,以便您在第 5 步之后获得的图像将包含围绕每个字母/单词/行/段落的凸区域。
注意:
-
基本上,你扩张得越多,你得到的元素就越大。即,最小扩张将有助于识别字母,而相对较高的扩张将需要识别行和段落。
Online ImgProc MATLAB docs
查看在线文档中的“文档中的示例”部分或参考 Matlab 帮助菜单中的图像处理工具箱文档。
那里给出的示例将指导您正确调用函数及其各种格式。
Sample CODE (not mine)
【讨论】:
你的STEP 5之后可以有多个轮廓组件,如何处理? @CVS,它不是基于轮廓的解决方案。 有人在这里发过类似的问题:***.com/questions/789527/… 但是在某个阶段,U 必须开始实施一个系统来识别和存储图像模式作为特定字符。也关注这个问题:***.com/questions/789527/… 这里的关键是如何处理多个链码,我评论过你的帖子。以上是关于如何使用 MATLAB 分割文本图像?的主要内容,如果未能解决你的问题,请参考以下文章
Matlab中如何只把figure中的图像区域保存为图片文件