计算机视觉 - 从'A'的图像中识别'A'

时间:2015-10-31 11:43:38

标签: image-processing computer-vision identification

'A' Extracted from File_01

'A' Extracted from File_02

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

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

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

提前致谢:)

3 个答案:

答案 0 :(得分:2)

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

是否有许多OCR实施?是。这些实现是否很好?这取决于应用程序。你认为OCR应该越普遍,现有的实现就越糟糕。

长话短说,有一本专门讨论这个主题的书籍,需要一本书才能在任何有意义的细节层面提供答案。

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

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

OCR有很多种方法,如果您对实际编写代码执行OCR感兴趣,那么您应该考虑首先实现至少一种更简单的技术。从你的评论来看,听起来你已经在考虑这个问题了,但是简单地说:不要先看神经网络。是的,你可能会在那里结束,但在你可以使神经网络技术得到充分利用之前,还需要学习很多关于成像,光照和基本图像处理的知识。

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

  1. 自己编写代码(不要使用别人的代码)将图像从文件加载到内存中。
  2. 将图像表示为内存中的2D数组。
  3. 想一想你可以区分几个角色或形状的方法。首先假设这些角色完美再现。例如,如果图像包含多个字符的精确副本" 1"和" 2,"你可以想象区分这些角色的最简单方法是什么?
  4. 考虑相同的问题,但字符只是略有不同。例如,添加一些"噪音"每个角色的像素。
  5. 稍微修补一下后,请阅读一些基本的图像处理技术。 Gonzalez和Woods的数字图像处理是一本好书。

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

    是的,尝试使用OpenCV的模板匹配。首先修补OpenCV函数并了解模板匹配何时起作用以及何时失败,然后仔细查看代码。)

    最近对OCR技术的调查可以在本书中找到:Cheriet的字符识别系统。这是研究各种算法的一个很好的起点。一些技术将是非常令人惊讶和反直觉的。

    要了解有关人类如何识别角色的更多信息 - 其中的细节往往令人惊讶且反直觉 - 请阅读Dehaene的书“大脑中的阅读”。这本书非常易读,不需要特殊的数学或编程技巧。

    最后,对于任何OCR算法,记住以下几点非常重要:

    1. 图像质量很重要。尽可能控制图像采集和照明。对光线,阴影等对OCR结果的影响产生良好的直觉。
    2. 设定读取率准确性的目标。为了避免沮丧,首先设置一个低目标 - 可能只有50%。有各种技术来计算什么"准确"意味着,但要开始,您只需计算正确识别的字符百分比或正确识别的字词百分比。实现98%的读取率并不容易,对于某些应用程序来说,即使读取率也不是特别有用。
    3. 识别单词会增加另一层复杂性。
    4. 在任何深度学习OCR需要很长时间。慢慢来。
    5. 始终重新审视有关OCR算法"应如何"写的。即使第2步,第3步,第4步和第5步中的实施很聪明,步骤1的含骨选择也会妨碍整体实施。
    6. 祝你好运!

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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