30、符号识别技术详解:从特征提取到字符分类

符号识别技术详解:从特征提取到字符分类

1. 符号特征提取与签名计算

在符号识别中,一种重要的特征提取方法是计算物体质心到边界的距离。通过以任意增量从 0 度到 360 度计算角度的函数,得到一组距离值。将这些距离值进行适当缩放后,可纳入特征向量。例如,在图 9.12 中展示了这一过程,签名值是由到边界像素的角度索引的距离。若在特定角度已有距离值,则取两者中较长的,从而得到外边界签名。

然而,这种方式计算的签名依赖于旋转和缩放。例如,为 12 点字符找到的签名不能作为匹配 10 点字符的模板。虽有人尝试对签名进行归一化以使其与缩放无关,像将所有区间除以方差的方法取得了一定成功,但这并非易事。程序 sig.c 就是该过程的一种实现。

2. 传真图像的 OCR 处理挑战

传真图像的使用给 OCR 带来了更多复杂问题。使用扫描仪时,用户能将文档放置得使文本行与真实水平方向偏差在约 3 度内。但传真机通常有进纸器,固有误差更大,且噪声问题也更严重,因为图像可能通过不太干净的电话线传输数千英里,并且传真图像标准可能采用有损压缩方法。选择更好的特征有助于减少固有失真的影响。

3. 倾斜检测方法
3.1 水平投影法

当大致知道倾斜角度时,可使用水平投影法。此前在识别文本行位置时也用到过水平投影。若倾斜角度较大,投影中可能没有对应文本行之间完全白色条带的部分。但如果知道大致角度,可将图像旋转该角度,然后为小角度计算投影,直到找到最大行高和最大行间距,此时的角度即为倾斜角度(假设噪声水平合理)。

3.2 Baird 算法

对于没有下行字母(除 g、j、p、q 和 y 之外的字符),每行字符的底部是共线的。基于此,Baird 算法步骤如下:
1. 识别所有连通区域,除非区域超过某个大小阈值,否则假定每个区域代表一个字符。
2. 找到每个区域的边界框,并确定边界框底部边缘的中心点。
3. 对于给定角度 θ,计算步骤 2 中得到的点的投影,得到一维投影数组 P(θ)。Baird 使用的区间大小对应于采样分辨率下六点字符大小的 1/3。Pi(θ) 是角度 θ 下第 i 个区间的值。
4. 最大化函数:
[A(\theta) = \sum_{i = 1}^{n} P_{i}^{2}(\theta)]
其中 n 是区间的数量。使该函数取得最大值的角度即为正确的倾斜角度。

该算法的准确性较高,报告的精度可接近 1/30 度,典型精度为 1/2 度。提前估计倾斜角度可减少寻找最大值所需的搜索量,若没有估计值,可进行穷举搜索,但耗时较长。进入正确邻域后,可使用从粗到细的搜索方法,也有人建议使用非线性最小二乘法。

以下是 Baird 算法处理旋转图像的示例:
| 图像状态 | 描述 |
| ---- | ---- |
| 图 9.13a | 文本图像旋转 10 度的部分 |
| 图 9.13b | 文本图像旋转 15 度的部分 |
| 图 9.13c - d | 分别为图 9.13a 和 9.13b 阈值化后的版本 |
| 图 9.13e - f | 黑色像素代表连通区域边界框的底部中心,连接这些点应得到 10 度和 15 度的直线 |

3.3 Hough 变换法

Hough 变换是一种在光栅图像中检测直线的方法。图像中的每个黑色像素都有无数条可能穿过它的直线,每条直线可用斜截式方程 (Y = mX + b) 表示,其中 (X, Y) 是像素坐标,m 是直线斜率,b 是直线与 Y 轴的交点。若将 X 和 Y 视为常数,m 和 b 视为坐标,则方程可重写为 (b = -Xm + Y),这是 (m, b) 空间中的直线方程。

图像中的每个像素在 (m, b) 空间中对应一条直线,(m, b) 空间(即 Hough 空间)中两条直线的交点对应图像空间中的共线点。若 Hough 空间中对应图像空间 N 个给定像素的 N 条直线相交于一点,则这 N 个像素位于图像坐标中的同一条直线上,该直线的参数对应于交点的 Hough 坐标 (m, b)。

Hough 变换的实现实际上类似于直方图。预先确定 (m, b) 坐标的量化程度,创建 Hough 图像。对于原始图像中的每个像素,计算其在 Hough 空间中的直线,并对 Hough 图像中该直线上的每个像素进行累加。处理完所有像素后,Hough 图像中值最大的像素对应原始图像中最多的共线像素。

由于斜截式直线方程无法处理垂直线(斜率变为无穷大),可使用法线式方程 (r = x \cos \omega + y \sin \omega),其中 r 是原点到直线的垂直距离,ω 是该垂直线与 x 轴的角度,此时 Hough 空间坐标为 (r, ω)。

Hough 变换与倾斜检测的关系很明确。Baird 倾斜检测算法的前几步得到的图像有大量共线像素集,其 Hough 图像应在对应倾斜角度的位置有一个主峰。对图 9.13 中的两个示例进行 Hough 变换,分别得到 10 度和 15 度的倾斜角度,与实际情况完全相符。以下是 Hough 变换的实现代码:

void hough (IMAGE x, float *theta)
{
     float **z;
     int center_x, center_y, r, omega, i, j, rmax, tmax;
     double conv;
     double sin(), cos(), sqrt();
     float tmval;
     conv = 3.1415926535/180.0;
     center_x = x->info->nc/2;center_y = x->info->nr/2;
     rmax = 
       (int)(sqrt((double)(x->info->nc*x->info->nc +
                            x->info->nr*x->info->nr)) /2.0);
    /* Create an image for the Hough space - choose your own sampling */
     z = f2d (180, 2*rmax+1);
     for (r = 0; r < 2 * rmax+1; r++)
        for (omega = 0; omega < 180; omega++)
           z[omega][r] = 0;
     tmax = 0; tmval = 0;
     for (i = 0; i < x->info->nr; i++)
        for (j = 0; j < x->info->nc; j++)
            if (x->data[i][j])
              for (omega = 0; omega < 180; ++omega)
              {
                 r = (i - center_y) * sin((double)(omega*conv))
                    + (j - center_x) * cos((double)(omega*conv));
                 z[omega][rmax+r] += 1;
              } 
     for (i=0; i<180; i++)
        for (j=0; j<2*rmax+1; j++)
          if (z[i][j] > tmval)
          {
            tmval = z[i][j];
            tmax = i;
          }
        *theta = tmax;
        free (z[0]); free (z);
}
3.4 基于字符间距的方法

另一种倾斜检测方法基于字符间距的观察:一行上字符之间的间距小于行与行之间的间距。因此,连接最近邻对质心的直线应连接相邻字符,该直线的角度接近倾斜角度,角度的直方图应在最佳倾斜角度估计处有一个峰值。

4. 边缘的使用

此前,字形被视为连通的黑色区域,本质上是光栅实体。但实际上仅使用边缘信息也能识别字符,因为字符的基本形状和拓扑属性在边缘表示中已存在,且需要处理的像素更少,处理时间可能更短。

4.1 边缘链接(矢量量化)

边缘链接是将像素收集成线段的过程,在从工程图或地图的光栅图像创建线图的上下文中也称为矢量化。可从对灰度图像应用边缘检测器得到的一组边缘像素,或从二值字形得到的对象边界开始。每个像素假定属于一条直线段,相邻像素被添加到一个集合中,直到违反某些线性约束。当一个集合完成时,将线段作为其端点保存,并从图像中移除该集合中的像素,然后以同样方式提取下一条线,直到没有像素剩余。

程序 vect.c 是一个简单且有效的边界矢量化程序,可用于字符处理,其工作步骤如下:
1. 识别对象边界,并将所有非边界对象像素设置为背景级别。
2. 从外边界的任意像素开始,找到轮廓的链码,然后创建包含轮廓的像素列表。
3. 从步骤 2 创建的列表中的第一个像素开始,将列表中的下一个像素添加到一个集合中,该集合将是边界中下一条线的像素集合。
4. 检查步骤 3 中创建的集合中所有像素与该集合中第一个和最后一个像素之间真实直线的距离。
5. 如果找到的距离小于某个阈值 D,则继续从步骤 3 开始,使用列表中的下一个像素。
6. 如果距离大于 D,则停止向当前线添加像素。将集合中的第一个和最后一个像素作为线段端点省略,让列表中的下一个像素作为新的起始点。
7. 从步骤 3 恢复该过程。

这种方法是经典的矢量化策略,适用于像字形这样的小图像,但对于地图和线图等大图像可能不太有用。

另一种替代方法是找到仅穿过黑色像素的最长直线,保存该直线,移除组成像素,然后重复该过程。但这种方法找到的直线可能不形成连接序列,需要一些后处理工作将线段重新连接成字形的合理表示。

以下是字形边界矢量化的示例:
| 图像状态 | 描述 |
| ---- | ---- |
| 图 9.16a | 原始字形 |
| 图 9.16b | 误差阈值为 1.0 时外边界的矢量化 |
| 图 9.16c | 阈值为 2.0 时的相同矢量化 |

矢量形式的字形边界有很多优点,例如可以轻松准确地找到线段的长度和方向,并且可以精确地进行旋转以修复字形的方向。

4.2 边缘在分类中的应用

当输入字形的边界以矢量形式可用时,可用于分类的方法有:
- 边缘匹配 :这是一种棘手的技术,试图识别输入图像中与一组模型图像中边缘对应的边缘。由于模型已分类,最佳匹配将提供分类结果。将矢量化的边缘转换为 (Xc, Yc, L, θ) 形式,其中 (Xc, Yc) 是线的中心,L 是其长度,θ 是线段与 x 轴的角度。如果适当缩放,可使用距离度量来匹配图像中的线和模型中的线。但由于轮廓中的小误差会反映在提取的矢量中,且坐标系通常基于边界框(边界框也可能略有变化),因此会引入不准确因素。
- 斜率直方图 :斜率直方图在之前也提到过,从矢量图像生成比从光栅图像生成更准确。首先对图像中线段的可能角度进行量化,然后创建特定字形中实际出现角度的频率直方图,这就定义了斜率直方图。某个角度出现的频率是具有该角度的线段长度之和。量化程度决定了直方图中所需的区间数量,也会影响匹配的准确性。在字符识别中,可能最多需要 8 到 16 个不同的角度。

例如,图 9.17 使用了从 0 到 180 度以 22.5 度为增量的八个不同角度,计算得到的样本直方图如下:
| 字符 | 直方图 |
| ---- | ---- |
| B | (0.3815, 0.0, 0.1439, 0.0, 0.3307, 0.0, 0.1439, 0.0) |
| C | (0.2733, 0.0, 0.26, 0.0, 0.2050, 0.0, 0.2609, 0.0) |
| D1 | (0.3409, 0.0, 0.1875, 0.0, 0.2841, 0.0, 0.1875, 0.0) |
| D2 | (0.3118, 0.0, 0.2004, 0.0, 0.2740, 0.0, 0.2138, 0.0) |
| D3 | (0.3714, 0.0, 0.1751, 0.0, 0.2785, 0.0, 0.1751, 0.0) |

这些直方图可作为特征向量或更大特征向量的组成部分。图 9.17 中的所有 D 字符的直方图彼此之间的欧几里得距离比它们与其他字形的距离更近。

综上所述,在处理传真图像的 OCR 时,倾斜检测和边缘处理是关键步骤,不同的方法各有优缺点,可根据具体情况选择合适的方法来提高 OCR 的准确性和效率。

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B(处理传真图像):::process
    B --> C{倾斜检测}:::decision
    C -->|水平投影法| D(使用水平投影计算倾斜角度):::process
    C -->|Baird 算法| E(按 Baird 算法步骤计算倾斜角度):::process
    C -->|Hough 变换法| F(使用 Hough 变换计算倾斜角度):::process
    C -->|基于字符间距法| G(根据字符间距计算倾斜角度):::process
    D --> H(旋转图像校正倾斜):::process
    E --> H
    F --> H
    G --> H
    H --> I(边缘处理):::process
    I --> J{边缘链接方法}:::decision
    J -->|vect.c 方法| K(按 vect.c 步骤进行矢量化):::process
    J -->|最长直线法| L(寻找最长直线并处理):::process
    K --> M(边缘分类):::process
    L --> M
    M --> N(字符识别):::process
    N --> O([结束]):::startend

以上流程图展示了从处理传真图像开始,经过倾斜检测、边缘处理、边缘分类到最终字符识别的整个过程,不同的倾斜检测和边缘链接方法都在流程中有所体现。

符号识别技术详解:从特征提取到字符分类

5. 特征提取与倾斜检测总结

在符号识别过程中,特征提取是关键的第一步。通过计算物体质心到边界的距离来生成签名是一种有效的特征提取方法,但签名的旋转和缩放依赖性需要通过归一化等手段来解决。在处理传真图像时,倾斜检测是必不可少的环节,不同的倾斜检测方法各有特点:
| 倾斜检测方法 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 水平投影法 | 简单直观,在大致知道倾斜角度时可快速计算 | 倾斜角度较大时效果不佳 | 倾斜角度较小且大致已知的情况 |
| Baird 算法 | 准确性较高,报告精度可接近 1/30 度 | 搜索过程可能耗时,需要提前估计倾斜角度以提高效率 | 对倾斜角度精度要求较高的场景 |
| Hough 变换法 | 能有效检测直线,不受斜截式方程无法处理垂直线的限制 | 计算量相对较大 | 图像中存在大量共线像素的情况 |
| 基于字符间距的方法 | 基于字符间距的直观特性,计算相对简单 | 依赖字符间距的稳定性 | 字符间距规律明显的文本图像 |

6. 边缘处理与分类的深入分析

边缘处理在字符识别中起着重要作用,它不仅可以减少处理的像素数量,还能保留字符的关键特征。边缘链接的两种主要方法也各有优劣:
| 边缘链接方法 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| vect.c 方法 | 简单有效,适用于小图像如字形 | 对于大图像可能效果不佳 | 处理小尺寸的字符图像 |
| 最长直线法 | 能找到较长的直线段 | 直线可能不连续,需要后处理 | 对直线段长度有要求的场景 |

在边缘分类方面,边缘匹配和斜率直方图是两种常用的技术。边缘匹配通过比较输入图像和模型图像的边缘来进行分类,但由于轮廓误差和坐标系的问题可能会引入不准确因素。斜率直方图则通过量化线段角度并统计频率来生成特征向量,从矢量图像生成更为准确,且在字符识别中所需的角度数量相对较少,通常 8 到 16 个不同角度即可。

7. 实际应用中的考虑因素

在实际应用符号识别技术时,需要综合考虑多个因素:
- 数据质量 :传真图像可能存在噪声、倾斜、压缩失真等问题,这些都会影响识别的准确性。在处理前需要对图像进行预处理,如去噪、校正倾斜等。
- 计算资源 :不同的算法对计算资源的需求不同。例如,Hough 变换法计算量相对较大,在资源有限的情况下可能需要选择更简单的算法。
- 字符类型 :不同的字符可能具有不同的特征,某些算法可能对特定类型的字符更有效。例如,Baird 算法基于字符底部共线的特性,对于没有下行字母的字符效果较好。

8. 未来发展趋势

随着技术的不断发展,符号识别技术也将不断进步。以下是一些可能的发展趋势:
- 深度学习的应用 :深度学习在图像识别领域取得了巨大的成功,未来可能会更多地应用于符号识别中。深度学习模型可以自动学习字符的特征,提高识别的准确性和鲁棒性。
- 多模态融合 :结合多种模态的信息,如图像、语音等,可能会进一步提高符号识别的效果。例如,在识别手写字符时,可以同时利用手写轨迹和语音描述的信息。
- 实时处理 :在一些应用场景中,如实时监控、移动设备等,需要符号识别技术能够实时处理图像。未来的算法可能会更加注重实时性的优化。

9. 总结与建议

符号识别技术是一个复杂而又重要的领域,涉及特征提取、倾斜检测、边缘处理和分类等多个环节。在实际应用中,需要根据具体的场景和需求选择合适的算法和方法。为了提高识别的准确性和效率,建议采取以下措施:
1. 对输入图像进行充分的预处理,包括去噪、校正倾斜等,以提高数据质量。
2. 根据图像的特点和计算资源的限制,选择合适的倾斜检测和边缘处理方法。例如,对于小尺寸的字符图像,可以优先考虑 vect.c 方法进行边缘链接。
3. 结合多种特征和分类方法,以提高识别的鲁棒性。例如,可以同时使用边缘匹配和斜率直方图进行边缘分类。
4. 关注技术的发展趋势,尝试应用新的算法和方法,如深度学习模型,以不断提升符号识别的性能。

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始应用符号识别]):::startend --> B(评估数据质量):::process
    B --> C{数据质量是否达标}:::decision
    C -->|是| D(选择倾斜检测方法):::process
    C -->|否| E(进行预处理,如去噪、校正倾斜):::process
    E --> D
    D --> F{选择合适的倾斜检测方法}:::decision
    F -->|水平投影法| G(使用水平投影计算倾斜角度):::process
    F -->|Baird 算法| H(按 Baird 算法步骤计算倾斜角度):::process
    F -->|Hough 变换法| I(使用 Hough 变换计算倾斜角度):::process
    F -->|基于字符间距法| J(根据字符间距计算倾斜角度):::process
    G --> K(旋转图像校正倾斜):::process
    H --> K
    I --> K
    J --> K
    K --> L(选择边缘处理方法):::process
    L --> M{选择合适的边缘链接方法}:::decision
    M -->|vect.c 方法| N(按 vect.c 步骤进行矢量化):::process
    M -->|最长直线法| O(寻找最长直线并处理):::process
    N --> P(边缘分类):::process
    O --> P
    P --> Q(结合多种特征和分类方法):::process
    Q --> R(进行字符识别):::process
    R --> S{识别结果是否满意}:::decision
    S -->|是| T([结束应用]):::startend
    S -->|否| U(调整算法和参数):::process
    U --> D

以上流程图展示了在实际应用符号识别技术时的完整流程,包括数据质量评估、倾斜检测、边缘处理、分类和识别结果评估等环节。如果识别结果不满意,可以返回重新选择算法和调整参数,以不断优化识别效果。

通过对符号识别技术的深入研究和应用,我们可以更好地处理各种类型的图像,实现准确、高效的字符识别,为众多领域的发展提供有力支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值