我目前正在研究某种OCR(光学字符识别)系统.我已经编写了一个脚本来从文本中提取每个字符并清除(大部分)不规则性.我也知道这个字体.我现在的图像例如是:
M(http://i.imgur.com/oRfSOsJ.png(font)和http://i.imgur.com/UDEJZyV.png(已扫描))
K(http://i.imgur.com/PluXtDz.png(font)和http://i.imgur.com/TRuDXSx.png(已扫描))
C(http://i.imgur.com/wggsX6M.png(font)和http://i.imgur.com/GF9vClh.png(已扫描))
对于所有这些图像,我已经有了一种二进制矩阵(1表示黑色,0表示白色).我现在想知道是否有某种类似数学投影的公式来看这些矩阵之间的相似性.我不想依赖图书馆,因为这不是给我的任务.
我知道这个问题可能看起来有点模糊,并且有类似的问题,但我正在寻找方法,而不是一个包,到目前为止我找不到任何关于该方法的评论.这个问题含糊不清的原因是我真的没有意义开始.我想要做的事实上是在维基百科上描述的:
矩阵匹配包括逐个像素地将图像与存储的字形进行比较; 它也被称为"模式匹配"或"模式识别".[9] 这依赖于输入字形与图像的其余部分正确隔离,并且存储的字形采用相似的字体和相同的比例.此技术最适用于打字文本,并且在遇到新字体时效果不佳.这是基于早期物理光电池的OCR实现的技术,而非直接实现.(http://en.wikipedia.org/wiki/Optical_character_recognition#Character_recognition)
如果有人能帮我解决这个问题,我会非常感激.
对于识别或分类,大多数OCR使用神经网络
这些必须正确配置到所需的任务,如层内部互连体系结构的数量,等等.神经网络的另一个问题是它们必须经过适当的训练,这很难做得很好,因为你需要知道正确的训练数据集大小(所以它包含足够的信息,不要过度训练).如果您没有神经网络的经验,如果您需要自己实施,请不要这样做!
还有其他比较模式的方法
矢量方法
多边形图像(边缘或边框)
比较多边形的相似性(表面积,周长,形状......)
像素方法
您可以根据以下内容比较图像:
直方图
DFT/DCT光谱分析
尺寸
每行占用的像素数
每行中占用像素的起始位置(从左起)
每行中占用像素的结束位置(来自righ)
这三个参数也可以用于行
兴趣点列表(点数在哪里有一些变化,如强度凹凸,边缘......)
您为每个测试角色创建功能列表,并将其与您的字体进行比较,然后最接近的匹配是您的角色.此外,这些功能列表可以缩放到某个固定大小(如64x64
),因此识别在缩放时变得不变.
以下是我用于OCR的功能示例
在这种情况下(缩放要素大小以适应NxN
),因此每个字符都有数字的6
数组,N
如:
int row_pixels[N]; // 1nd image int lin_pixels[N]; // 2st image int row_y0[N]; // 3th image green int row_y1[N]; // 3th image red int lin_x0[N]; // 4th image green int lin_x1[N]; // 4th image red
现在:预先计算字体中每个字符和每个readed字符的所有功能.从字体中找到最接近的匹配项
所有特征向量/数组之间的最小距离
不超过一些门槛差异
这在旋转方面是不变的,并且在某一点上倾斜.我为填充的字符进行OCR,因此对于轮廓字体,它可能会使用一些调整
[笔记]
为了比较,您可以使用距离或相关系数