【问题标题】:Computer Vision - Recognize 'A' from an image of 'A'计算机视觉 - 从“A”的图像中识别“A”
【发布时间】:2015-11-11 13:38:06
【问题描述】:

您好,我是一名新手程序员,在简单的图像处理方面遇到了麻烦。

我的目标是让程序认识到这两个 A 是……嗯,都是 A。如果你仔细看,你会发现它有点不同。(在像素的范围内。)虽然任何有文化的人都可以将两者都读为“A”,但我敢肯定,逐像素比较的程序不会工作,因为这两个 A 实际上是不同的。更糟糕的是,这两个有不同的尺寸——一个是 48*60,另一个是 48*61。

我想知道程序是否有办法将其“读取”为 A。我听说这是一种叫做计算机视觉的东西(不太确定)......我真的更喜欢简单的方法 - 它不是识别任意字符;只有'A'。但如果不能这样,任何让计算机将这两者都视为 A 的解释都非常受欢迎。

提前致谢:)

【问题讨论】:

标签: image-processing computer-vision identification


【解决方案1】:

首先:字符识别不仅不是一个简单的问题,也不是一个完全解决的问题。

有很多 OCR 实现吗?是的。这些实现好吗?这取决于应用程序。您认为 OCR 应该越通用,现有的实现看起来就越糟糕。

长话短说,有专门针对这个主题的书籍,并且需要一定长度的书才能提供任何有意义的详细程度的答案。

OCR(光学字符识别)有很多技术。已针对 (a) 机器打印字符与 (b) 手写字符开发了不同的技术。阅读机印字符通常更容易,但不一定容易。阅读手写字符可能非常困难,并且仍然是一个未完全解决的问题。请记住,还有其他“脚本”(用于书写的字符系统),拉丁字符的识别技术可能与繁体汉字的识别技术不同。 [如果你能写一个手机OCR应用来快速准确地读取手写汉字,你可以赚一大笔钱。]

https://en.wikipedia.org/wiki/Optical_character_recognition

OCR 有很多方法,如果您对实际编写代码来执行 OCR 感兴趣,那么您自然应该考虑首先实现至少一种更简单的技术。从你的 cmets 听起来你已经在研究这个了,但简单地说:不要先看神经网络。是的,您可能最终会到达那里,但是在您可以大量使用神经网络技术之前,还有很多关于成像、照明和基本图像处理的知识。

但在深入研究之前,请花一些时间尝试自己解决问题:

  1. 自己编写代码(不要使用别人的代码)将图像从文件加载到内存中。
  2. 将图像表示为内存中的二维数组。
  3. 想一想可以将几个字符或形状彼此区分开来的方法。首先假设这些字符被完美复制。例如,如果图像包含字符“1”和“2”的多个精确副本,那么您可以想象区分这些字符的最简单方法是什么?
  4. 考虑相同的问题,但字符略有不同。例如,为每个字符添加一些“噪声”像素。

稍作修改后,阅读一些基本的图像处理技术。一本好书是冈萨雷斯和伍兹的数字图像处理。

(归一化相关是一种简单的算法,您可以在网上和书中阅读。它对于某些简单类型的 OCR 很有用。您可以将归一化相关视为比较参考“A”字符的“模板”的一种方法到可能是也可能不是“A”字符的其他字符的样本——模板与样本越接近,样本是 A 的置信度越高。

所以是的,尝试使用 OpenCV 的模板匹配。首先修改 OpenCV 函数,了解模板匹配何时有效以及何时失败,然后更仔细地查看代码。)

最近对 OCR 技术的调查可以在本书中找到:Character Recognition Systems,作者 Cheriet。这是研究各种算法的一个很好的起点。其中一些技术将非常令人惊讶和违反直觉。

要了解有关人类如何识别字符的更多信息(其细节通常令人惊讶且违反直觉),请阅读 Dehaene 的Reading in the Brain一书。这本书可读性很强,不需要特殊的数学或编程技能。

最后,对于任何 OCR 算法,请务必牢记以下几点:

  1. 图像质量很重要。尽可能控制图像采集和照明。培养对光、影等对 OCR 结果的影响的良好直觉。
  2. 设定读取率准确度的目标。为避免沮丧,首先设定一个低目标——也许只有 50%。有多种技术可以计算“准确”的含义,但首先您可以简单地计算正确识别的字符百分比或正确识别的单词百分比。实现 98% 的读取率并不容易,对于某些应用程序来说,即使读取率也不是特别有用。
  3. 识别单词又增加了一层复杂性。
  4. 学习任何深度的 OCR 都需要很长时间。慢慢来。
  5. 始终重新审视关于“应该”如何编写 OCR 算法的假设。即使第 2 步、第 3 步、第 4 步和第 5 步的实现很巧妙,第 1 步的愚蠢选择也会阻碍整个实现。

祝你好运!

【讨论】:

    【解决方案2】:

    您的问题看起来像光学字符识别。一种非常常见的方法是使用神经网络。神经网络将分析图像并为您提供每个字母的概率。 但是你必须先训练它,而且神经网络是一个积极研究的主题,所以我知道没有一个简单的“插入式”解决方案。

    【讨论】:

      【解决方案3】:

      好的,确实没有简单的“插入”来解决这个问题。我将尝试以一种简单的方式解释神经网络方法,以便为您澄清一点。 首先,您需要以更简单的方式表示图像! 这意味着,现在你的图像是 48*60 矩阵并且是灰度的。 考虑采取以下措施:

      • 将它们转换为二进制照片。
      • 将它们全部调整为 50*50。
      • 使用形态学操作将字母细化到一个像素宽度(搜索它!)。

      现在我们将对结果使用装箱方法。将您的 50*50 图像划分为例如 8*8 网格部分。计算每个部分中有多少像素,并将结果放入 8*8 矩阵名称 C 中。 现在您有一个 8 x 8 的矩阵 C,它是原始图像的简单表示。 收集一些训练数据和测试数据,然后简单地使用 matlab 的神经网络模式识别应用程序(你需要知道 ANN 的工作原理才能使用这个应用程序)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-30
        • 2018-05-13
        • 1970-01-01
        • 2019-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-19
        相关资源
        最近更新 更多