math - OCR 和字符相似度

标签 math matrix ocr projection

我目前正在研究某种 OCR(光学字符识别)系统。我已经编写了一个脚本来从文本中提取每个字符并清除(大部分)不规则之处。我也知道字体。例如,我现在拥有的图像是:

M ( http://i.imgur.com/oRfSOsJ.png (字体) 和 http://i.imgur.com/UDEJZyV.png (扫描))

K( http://i.imgur.com/PluXtDz.png(字体)和 http://i.imgur.com/TRuDXSx.png(扫描))

C( http://i.imgur.com/wggsX6M.png(字体)和 http://i.imgur.com/GF9vClh.png(扫描))

对于所有这些图像,我已经有了一种二进制矩阵(黑色为 1,白色为 0)。我现在想知道是否有某种类似数学投影的公式来查看这些矩阵之间的相似性。我不想依赖图书馆,因为那不是给我的任务。

我知道这个问题可能看起来有点含糊,并且有类似的问题,但我正在寻找方法,而不是软件包,到目前为止我找不到关于该方法的任何评论。这个问题含糊不清的原因是我真的没有开始的意义。我想要做的实际上是在维基百科上描述的:

矩阵匹配涉及逐个像素地将图像与存储的字形进行比较;它也被称为“模式匹配”或“模式识别”。 [9]这依赖于输入字形与图像的其余部分正确隔离,以及存储的字形采用相似的字体和相同的比例。此技术最适用于打字文本,但在遇到新字体时效果不佳。这是早期基于物理光电池的 OCR 实现的技术,而直接实现。 ( http://en.wikipedia.org/wiki/Optical_character_recognition#Character_recognition )

如果有人能帮助我解决这个问题,我将不胜感激。

最佳答案

大多数 OCR 使用神经网络进行识别或分类
这些必须正确配置为所需的任务,如内部互连架构的层数等。神经网络的另一个问题是它们必须经过适当的训练,这很难正确地进行,因为您需要知道诸如适当的训练数据集大小之类的事情(因此它包含足够的信息并且不要过度训练)。如果您没有使用神经网络的经验,如果您需要自己实现它,请不要走这条路!!!
还有其他方法可以比较模式

  • 矢量方法
  • 多边形化图像(边缘或边框)
  • compare polygons相似性(表面积、周长、形状……)

  • 像素方法
    您可以根据以下内容比较图像:
  • 直方图
  • DFT/DCT 光谱分析
  • 尺码
  • 每行占用的像素数
  • 每行占用像素的起始位置(从左开始)
  • 每行中占用像素的结束位置(从右开始)
  • 这 3 个参数也可以用于行
  • 兴趣点列表(点有一些变化,如强度凹凸、边缘等)

  • 您为每个测试字符创建功能列表并将其与您的字体进行比较,然后最接近的匹配是您的字符。此外,这些特征列表可以缩放到某个固定大小(如 64x64 ),因此识别在缩放时变得不变。
    这是我用于 的功能示例OCR
    OCR character features
    在这种情况下(特征大小被缩放以适应 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
    
    现在:预先计算字体中每个字符和每个读取字符的所有特征。从字体中找到最接近的匹配
  • 所有特征向量/数组之间的最小距离
  • 不超过一些阈值差异

  • 这在旋转时部分不变并倾斜到一个点。我愿意 OCR 对于填充字符,因此对于轮廓字体,它可能需要进行一些调整

    【备注】
    为了进行比较,您可以使用距离或 correlation coefficient

    关于math - OCR 和字符相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786288/

    相关文章:

    algorithm - 分而治之矩阵乘法

    opencv - 如何使用 tesseract 和 opencv 从相机中提取文本

    python - 如何从deepfont论文中提到的Adobe VFR数据集中的bcf文件加载图像数据?

    python - 树莓派计数光值

    python - Python 3.7 math.remainder 和 %(模运算符) 之间的区别

    Java float 数学错误?

    c++ - 如何创建特征向量以使用 open cv 识别字符

    c# - 这个振荡功能如何实现

    C 程序接收到信号 SIGSEGV,矩阵乘法时出现段错误?

    ruby - 如何从 ruby​​ 中的矩阵中提取子矩阵