如何从汉字中提取笔画

15

我一直在尝试创建一个算法,从汉字中提取笔画信息。我尝试了各种方法,但没有一个很令人满意,可能是因为我对图形算法的知识有限。

基本上,我有以下数据:

  • 汉字,可以是像素或矢量(黑色)

  • 笔画的整体轮廓,以像素表示(红色)

  • 整体方向(蓝色箭头)。

enter image description here

从这个图中,我正在尝试提取笔画。如果你必须使用现有数据进行此操作,你会使用哪些方法?你能想到任何自动提取笔画的方法吗?


你准确地用这个做什么? - Szabolcs
1
我想创建字符笔画动画。 - laurent
5个回答

5

我会从计算每个蓝色像素到最近的白色像素的距离开始。然后,您可以保留所有比最近的白色像素更靠近的红色像素。之后可能需要使用一些滤镜来平滑效果(例如 侵蚀 后跟一个 闭合)。


3
你可能在寻找介质轴线,也称为拓扑骨架。简而言之,您需要解决的问题是找到所有与边缘上的多个点等距离的点。您可能需要对结果曲线进行平滑或简化。
棘手的部分是分离形状中共同存在于多个笔画中的部分。我不确定是否有明确定义的方法来实现这一点。也许可以将“公共区域”定义为以每个骨架交叉点为中心、切线接触最近的边缘的圆?然后在间隙处进行一些笔画宽度的插值?

2

我不认为你能够设计出一个没有错误的算法。有些字的一部分看起来相同,但并不等同于相同的笔画数。例如,从视觉上讲(当然不是语言学上),马在技术上也包括口。

我唯一的想法是将区域分成小区域,并编写算法尝试按照笔画的设置顺序进行操作,但我无法想象这会很容易,而且根据字体的不同,有些线条会延伸到不应该存在的区域。

此外,由于其不寻常的布局,还有一些字符无法与算法配合良好,只有遵循笔画顺序的严格规则才能得到正确的笔画数:例如凹和凸。

我必须问一下 - 笔画数是每个汉字的基本信息 - 为什么需要创建一个计算它的算法?是否更容易进行字符识别,然后在自定义字典中查找字符的笔画数?


我相信 OP 对蓝色箭头所示的笔画有更多的信息。此外,他似乎并不关心计算笔画,而是将它们分开(也许是为了创建动画版本?)。 - Paweł Obrok
是的,我不是在寻找笔画计数,因为我知道有数据库可以做到这一点。我想从一个字符中提取每个笔画(它的图形外观)。由于我认为这不能自动完成,所以我将通过提供蓝线和红色像素来“引导”算法(基本上我用大刷子手动在字符顶部绘制,按照笔画顺序)。此外,我意识到有些情况可能更复杂(我想到了中文中的角形笔画),但一次只解决一个问题 :) - laurent
啊,我明白你的意思了。那太高深了!;o; 祝你好运,听起来会是很多工作。 - Gaijinhunter

2
从蓝线和样本图像来看,我认为这个三步方法可能适用于相当多的情况:
对于线上的每个点,选择所有比最近的白色像素更接近该点的红色像素。这将大致给出字符的笔画,但在两个笔画交叉的区域周围会有凸起,并且你将排除笔画两端的一些像素。
为了消除凸起,隔离笔画的边缘像素,并计算该边缘图像的霍夫变换。从中选择两条最显著的线。这将为您提供(如果笔画足够直)沿着笔画边缘的两条线。在与这两条线垂直方向上比蓝线更远的位置上,消除所有距离笔画更远的红色像素。现在(对于足够直的笔画),你所缺少的只是一些小的孤立像素块,它们可能在步骤1或步骤2中被排除,因此:
将所有仅触及你的笔画而不触及字符其他部分的小孤立像素区域添加到笔画中。如果在步骤1和步骤2之间,你发现步骤2中找到的线距离蓝线太近,也可以在这两个步骤之间执行此步骤。

1

我认为最简单的可行方法是:

  1. 逐个绘制蓝色箭头
  2. 计算每个蓝线段的距离变换
  3. 将这个离散距离与红色区域相交
  4. 删除到蓝线段距离大于T的红色区域

完成上述步骤后,您可以进一步研究更复杂的策略,以选择一个好的、依赖于线段的T值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接