符号识别与手写字符分类方法
1. 符号识别基础
在符号识别中,直方图的处理是一个重要环节。当将归一化后的直方图视为向量时,不同符号的直方图之间的距离关系可用于分类。例如,对于符号 B、C、D1、D2、D3,其距离矩阵如下:
| | B | C | D1 | D2 | D3 |
| — | — | — | — | — | — |
| B | 0.00000 | 0.23383 | 0.08730 | 0.12709 | 0.06909 |
| C | 0.23383 | 0.00000 | 0.14653 | 0.10961 | 0.17203 |
| D1 | 0.08730 | 0.14653 | 0.00000 | 0.04251 | 0.03562 |
| D2 | 0.12709 | 0.10961 | 0.04251 | 0.00000 | 0.07557 |
| D3 | 0.06909 | 0.17203 | 0.03562 | 0.07557 | 0.00000 |
从这个矩阵可以看出,D 类符号之间的最小距离小于 D 与其他符号的距离,尽管存在个别情况(如 B 与 D3 的距离比 D2 与 D3 的距离更近),但仍能正确分类。
还有一种向量模板匹配的方法,步骤如下:
1. 将最短向量缩至 1 像素长度。
2. 按相同比例缩放其余向量。
3. 将结果重新绘制在小光栅中。
4. 与训练数据中以相同方式得到的模板进行标准模板匹配。若匹配值差于某个值 X,则用下一个最短向量重新缩放,依此类推。
相关程序方面,
learn3.c
可读取标准测试图像并创建特征向量数据库,能根据需求计算特征并存储在文件中;
ocr3.c
读取该数据库,再读取文本图像,将图像的特征向量与数据库中的进行匹配,执行最小距离分类。
2. 手写字符分类的挑战与策略
手写字符分类的主要问题是其不一致性,人类难以两次以完全相同的方式书写字符。许多匹配算法,尤其是基于模板的算法,依赖一致性才能有效工作,模板与输入字符差异越大,正确匹配的可能性越低。因此,需要使用基于字符整体形状和结构特征的方法,而非像素级特征。
在手写数字分类中,会考虑多种统计和结构方法。使用多种不同技术的好处是,当结果一致时能增强对结果的信心,不一致时能更好地判断错误可能性。通常认为,能表明无法分类的算法优于错误分类的算法,目标是尽量降低错误率,即使这会增加未分类字符的数量。未分类情况称为拒绝,通常不计为错误。
测试数据包含两组各 1000 个的手写数字符号,一组用于训练识别算法,另一组用于评估性能,不能用训练数据测试识别器。
3. 混淆矩阵
混淆矩阵是分析符号识别程序行为的有效工具,它是一个二维分类数组,列表示算法对符号的分类,行表示符号的实际值。例如,对于识别 A、B、C、D 四个字母的程序,其混淆矩阵如下:
| | A | B | C | D |
| — | — | — | — | — |
| A | 96 | 2 | 0 | 2 |
| B | 0 | 98 | 0 | 2 |
| C | 0 | 0 | 100 | 0 |
| D | 0 | 1 | 0 | 99 |
从这个矩阵可以看出,每行总和为 100(除非数据集中有被拒绝的字符)。第一行表示实际为 A 的字符的各类分类数量,多数 A 字符被正确分类,但也有少数错误。列表示分类后的数据情况,如最后一列显示分类为 D 的字符中,99 个正确,4 个错误。混淆矩阵包含很多有用信息。
4. 字符轮廓属性方法
Shridhar 等人提出了一系列用于分类手写数字的拓扑特征,多数是数字轮廓的属性。例如,数字 8 可描述为左右两侧轮廓平滑,中心区域宽度最小,但并非所有手写 8 都符合此描述,其他数字也可能有类似特征,关键是为每个数字提供足够多的描述以提高识别率。
以数字 9 为例,计算左右轮廓的步骤如下:
1. 隔离并二值化数字。
2. 对于字符边界框的每一行,计算左边界与第一个黑色像素之间的背景像素数,得到左轮廓(LP)的采样版本,再缩放到标准大小(如 52 像素)。
3. 类似地,保存每行最后一个黑色像素,得到右轮廓(RP)。
得到轮廓后,可测量其一些属性:
-
极值位置
:左轮廓的最小值位置 Lmin 和最大值位置 Lmax,右轮廓类似有 Rmin 和 Rmax。例如,数字 9 的 Lmin 通常在字符上半部分,而数字 6 的 Lmin 在下半部分。
-
宽度计算
:W(k) = RP(k) - LP(k),Wmax 是 RP(k) - LP(k) 最大时的宽度。
-
高宽比
:R 为高度与最大宽度的比值,数字 1 的 R 值通常远大于其他数字。
还可基于一阶差分定义特征,如 LDIF(k) = LP(k) - LP(k - 1) 和 RDIF(k) = RP(k) - RP(k - 1),大的 LDIF 值表示轮廓在该点变化大,可辅助分类。例如,数字 9 在位置 30 附近轮廓变化大,LDIF 值大,这是数字 3 和 9 的特征之一。
在训练阶段,为每个样本数字计算 48 个特征,创建特征向量,特征为二进制(TRUE 或 FALSE)。例如,特征 43 表示第 20 行的字符宽度大于等于第 40 行的宽度(W(20) >= W(40))。然后搜索每个数字的位串,找出公共元素并存储在库中。匹配时,提取输入图像的轮廓,测量并保存位串,与模板的公共元素匹配,由于只涉及位运算,速度很快。完全匹配时,将对应的数字类别分配给输入数字。
样本数据(1000 个数字)的位串如下:
123456789012345678901234567890123456789012345678
*******0**0**********1******0**0******0****1*1**0
****************0******1**********************1*1
******************0********1************0****0**2
0****1*******0*****1*1****0****000*******0*****13
***********0********0***********0***00*******10*4
0*0**********0*****0********************1******15
1******0***********************0******0*1**1***16
*****1*1*****1*******1****0****0*0**************7
***00***000*0**0***1************0*****0**0*****18
**0*0***********0****1****0****00*******0*1*****9
其中 * 表示“不关心”情况。该方法的整体识别率为 94.2%,各数字的识别率如下表:
| 数字 | % RIGHT | % ERROR | % REJECT |
| — | — | — | — |
| 0 | 94 | 1 | 5 |
| 1 | 95 | 4 | 1 |
| 2 | 96 | 1 | 3 |
| 3 | 100 | 0 | 0 |
| 4 | 95 | 5 | 0 |
| 5 | 100 | 0 | 0 |
| 6 | 84 | 10 | 6 |
| 7 | 94 | 5 | 1 |
| 8 | 90 | 4 | 6 |
| 9 | 94 | 6 | 0 |
提高识别率可使用多个特征集,但自动识别最优特征集是计算难题。也可将特征分组指定,如数字 6 可通过某些特征子集的组合进行分类,但确定最优特征分组也很困难。还可使用 1000 个数字作为训练数据构建已知分类的位串数据库,用标准统计方法识别未知字符,该纯统计方法识别率略高,为 94.7%,但执行时间长,部分数字识别效果好(如 2、3、5 为 100%),部分较差(如 7 为 86%),
recp.c
程序实现了该算法,使用
prof.db
文件作为位串数据库。
5. 凸缺陷方法
现有的字符识别方法存在诸多问题,很多方法在所有情况下都不能很好地工作。因此,考虑利用更丰富的背景像素进行分类,因为噪声对其影响相对较小,且类似处理目标像素的方法仍可能有效。
大多数字符识别系统关注字符本身的像素,但分析字符图像周围背景区域的大小、形状和位置也很有意义。例如,数字 8 有两个洞,数字 0 有一个中心洞,数字 2 上下部分分别有左右朝向的凹区域。对这些凸缺陷进行更全面分析,可能开发出基于背景区域的分类方案。
对于数字字符图像,有一个相对简单但有效的方案:从输入图像的每个背景像素向四个主要方向(上、下、左、右)画线,若至少三个方向遇到目标像素,则将原像素标记为未遇到目标像素的方向(开放方向);若四个方向都不开放,则该像素是洞的一部分,标记为 0。
以下是用于定位和分类光栅图像中基本凸缺陷的 C 代码:
int czones (struct image *x)
{
int i,j,k,left,right,up,down;
struct image *z=0;
copy (x, &z, &k);
for (i=0; i<z->info->nr; i++)
for (j=0; j<z->info->nc; j++)
{
if (x->data[i][j] == 0) z->data[i][j] = 255;
else
{
up = 0; down = 0; left = 0; right = 0;
for (k=i-1; k>=0; k--) /* Check upwards */
if (x->data[k][j] == 0)
{
up = 1; break;
}
for (k=i+1; k<x->info->nr; k++) /* Check down */
if (x->data[k][j] == 0)
{
down = 1; break;
}
for (k=j; k>=0; k--) /* Check left */
if (x->data[i][k] == 0)
{
left = 1; break;
}
for (k=j+1; k<x->info->nc; k++) /* Check right */
if (x->data[i][k] == 0)
{
right = 1; break;
}
/* Consolidate these directions */
if (left && up && right && down)
z->data[i][j] = 0;
else if (left && up && right)
z->data[i][j] = 1; /* Open down */
else if (up && right && down)
z->data[i][j] = 2; /* Open left */
else if (right && down && left)
z->data[i][j] = 3; /* Up */
else if (down && left && up)
z->data[i][j] = 4;
else z->data[i][j] = 255;
}
}
}
标记完所有区域后,进行计数和测量。忽略面积小于目标像素 10% 的小区域,使用最大的四个区域进行分类。有时简单的关系就可识别,如 99% 的 0 可通过大的中心洞和无其他凸缺陷识别;更复杂的方案考虑区域相对位置,如 8 有上下两个洞,左右分别有左右朝向的区域;最复杂的方案还需形状信息,如 7 和 3 左侧都有大的左朝向区域,但 7 的该区域是凸的,3 的是非凸的,可用于区分。
该方法对区域大小不做过于具体的要求,将区域分为大或小,按大小排序后只使用最大的区域。位置也粗略分类为上、下、左、右,靠近中心的区域有特殊标记。这种方法能提供足够信息对图像进行数字类型分类,且受手写字符常见变化影响较小。
该方法的识别率约为 94%,具有无需细化步骤的优点,平滑轮廓有帮助,形态学闭合步骤可能提高 8、6、9 的识别率。可通过增加特征集或更精细的特征集来提高识别率,确定最佳特征主要依靠常识和反复试验。
符号识别与手写字符分类方法
6. 凸缺陷方法的详细分析与优化思路
在凸缺陷方法中,对不同数字的分类描述虽然已经有了一定的基础,但还可以进一步细化和优化。下面我们详细分析每个数字的描述以及可能的改进方向。
| 数字 | 凸缺陷描述 | 可能的优化方向 |
|---|---|---|
| 0 | 大的中心洞且无其他凸缺陷 | 可以考虑洞的相对大小与字符整体大小的比例,以及洞的形状是否规则 |
| 8 | 上下两个洞,左右分别有左右朝向的区域 | 分析两个洞的大小比例、相对位置的精确关系,以及左右区域的形状特征 |
| 2 | 顶部有左朝向区域,底部有右朝向区域 | 研究两个区域的面积比例、与字符边界的距离等 |
| 7 | 左侧有大的左朝向凸区域 | 考虑该区域的曲率、与其他部分的连接方式 |
| 3 | 左侧有大的左朝向非凸区域 | 分析非凸区域的具体形状,如凹陷的深度和宽度 |
通过对这些细节的分析,可以更准确地描述每个数字的凸缺陷特征,从而提高识别率。
7. 不同方法的综合应用
在实际的手写数字识别中,可以将字符轮廓属性方法和凸缺陷方法结合起来使用。这样可以充分利用两种方法的优势,提高识别的准确性和可靠性。
以下是综合应用两种方法的流程:
1.
预处理
:对输入的手写数字图像进行二值化、降噪等预处理操作。
2.
特征提取
:
- 运用字符轮廓属性方法,提取左右轮廓、极值位置、宽度、高宽比等特征。
- 采用凸缺陷方法,标记背景像素的开放方向,识别凸缺陷区域。
3.
特征匹配
:
- 将字符轮廓属性方法提取的特征向量与数据库中的模板进行匹配。
- 依据凸缺陷方法的区域描述,对数字进行初步分类。
4.
综合判断
:结合两种方法的匹配结果,进行综合判断。如果两种方法的结果一致,则确定分类结果;如果不一致,则进一步分析或采用其他辅助方法进行判断。
8. 未来发展趋势
随着技术的不断发展,手写字符识别领域也在不断进步。未来可能会出现以下发展趋势:
-
深度学习方法的应用
:深度学习在图像识别领域取得了巨大的成功,未来可能会更多地应用于手写字符识别中,通过大量的数据训练,提高识别的准确率和泛化能力。
-
多模态信息融合
:结合手写字符的图像信息、书写动态信息(如书写速度、压力等),进行更准确的识别。
-
实时识别与交互
:实现实时的手写字符识别,并与用户进行交互,如在智能设备上实现手写输入的实时转换和反馈。
9. 总结
本文介绍了符号识别和手写字符分类的多种方法,包括基于直方图的距离分类、向量模板匹配、字符轮廓属性方法和凸缺陷方法等。每种方法都有其特点和适用场景,在实际应用中可以根据具体需求选择合适的方法或综合使用多种方法。
通过使用混淆矩阵可以有效地分析识别程序的性能,了解识别的准确性和错误情况。同时,不断优化特征提取和匹配方法,结合多种技术手段,有望进一步提高手写字符识别的准确率和可靠性。
在未来的发展中,随着新技术的不断涌现,手写字符识别将在更多领域得到应用,为人们的生活和工作带来更多的便利。
以下是综合应用两种方法的 mermaid 流程图:
graph TD;
A[输入手写数字图像] --> B[预处理];
B --> C[特征提取];
C --> C1[字符轮廓属性特征提取];
C --> C2[凸缺陷特征提取];
C1 --> D1[字符轮廓特征匹配];
C2 --> D2[凸缺陷特征匹配];
D1 --> E[综合判断];
D2 --> E;
E --> F{结果一致?};
F -- 是 --> G[确定分类结果];
F -- 否 --> H[进一步分析或辅助判断];
H --> G;
通过以上的综合分析和优化,我们可以更深入地理解手写字符识别的方法和技术,为实际应用提供更有效的解决方案。
超级会员免费看
24万+

被折叠的 条评论
为什么被折叠?



