计算机视觉 - 从 'A' 的图像中识别出 'A'
Computer Vision - Recognize 'A' from an image of 'A'
嗨,我是一个新手程序员,在简单的图像处理方面遇到了麻烦。
我的目标是让程序识别出两个 A 是……好吧,两个 A。如果你足够仔细地看,你会发现它有点不同。(在像素的尺度上。)虽然任何有文化的人都可以将两者都读成 'A',但我敢肯定,一个逐像素比较的程序将不起作用,因为两个 A 实际上是不同的。更糟糕的是,这两个有不同的尺寸 - 一个是 48*60,另一个是 48*61。
我想知道是否有办法让一个程序 'read' 都成为 A。我听说这是一种叫做计算机视觉的东西(不太确定)......我真的更喜欢这种方法简单 - 它不是关于识别任意字符;只有 'A'。但如果不能那样做,欢迎任何让计算机将这两个都视为 A 的解释。
提前致谢:)
您的问题看起来像是光学字符识别。一种非常常见的方法是使用神经网络。神经网络将分析图像并为您提供每个字母的概率。
但是你必须先训练它,神经网络是一个活跃的研究课题,所以没有我所知道的简单 "drop-in" 解决方案。
好吧,这个问题确实没有简单的"drop-in"。我将尝试以一种简单的方式解释神经网络方法,以便为您稍微理清思路。
首先,您需要以更简单的方式表示图像!
这意味着,现在您的图像是 48*60 矩阵并且是灰度。
考虑采取以下行动:
- 将它们变成二进制照片。
- 将它们全部调整为 50*50。
- 使用形态学操作将字母变细到一个像素宽度(搜索它!)。
现在我们将对结果使用装箱方法。将您的 50*50 图像分成例如 8*8 的网格部分。计算每个部分有多少像素,并将结果放入 8*8 矩阵名称 C 中。
现在你有一个 8 x 8 的矩阵 C,它是原始图像的简单表示。
收集一些训练数据和测试数据,然后简单地使用 matlab 的神经网络模式识别应用程序(你需要知道 ANN 是如何工作的才能使用这个应用程序)
第一:字符识别不仅不是一个简单的问题,也不是一个彻底解决的问题。
OCR 实现有很多吗?是的。这些实现好吗?这取决于应用程序。您认为 OCR 应该越通用,现有的实现就越糟糕。
长话短说,有专门针对这个主题的书籍,需要一定篇幅的书才能提供任何级别的有意义的详细答案。
OCR(光学字符识别)技术有很多。针对 (a) 机器打印字符与 (b) 手写字符开发了不同的技术。阅读机印字符通常比较容易,但不一定容易。阅读手写字符可能非常困难,并且仍然是一个未完全解决的问题。请记住,还有其他 "scripts"(书写字符系统),拉丁字符的识别技术可能与繁体中文字符的识别技术不同。 [如果你能写一个手机OCR应用程序快速准确地阅读手写汉字,你可以赚一大笔钱。]
https://en.wikipedia.org/wiki/Optical_character_recognition
OCR 有多种方法,如果您有兴趣实际编写代码来执行 OCR,那么您应该首先考虑至少实施一种更简单的技术。从您的评论来看,您似乎已经在研究这个问题,但简而言之:不要先看神经网络。是的,您可能会到此为止,但是在将神经网络技术投入大量使用之前,您需要学习很多关于成像、照明和基本图像处理的知识。
但在深入之前,请花点时间尝试自己解决问题:
- 自己编写代码(不要使用别人的代码)将图像从文件加载到内存中。
- 在内存中将图像表示为二维数组。
- 想办法将几个字符或形状彼此区分开来。首先假设这些字符被完美复制。例如,如果图像包含字符“1”和“2”的多个精确副本,您能想到的区分这些字符的最简单方法是什么?
- 考虑同样的问题,但字符仅略有不同。例如,为每个字符添加几个 "noise" 像素。
稍加修改后,阅读一些基本的图像处理技术。一本好书是冈萨雷斯和伍兹的《数字图像处理》。
(归一化相关是一种简单的算法,您可以在网上和书中阅读。它对某些简单类型的 OCR 很有用。您可以将归一化相关视为一种比较 "stencil" 参考文献的方法'A' 个字符到可能是或不是 'A' 个字符的其他字符的样本——模板与样本越接近,样本是 A 的置信度越高。
是的,尝试使用 OpenCV 的模板匹配。首先修补 OpenCV 函数并了解模板匹配何时有效以及何时失败,然后更仔细地查看代码。)
最近对 OCR 技术的调查可以在这本书中找到:Cheriet 的 Character Recognition Systems。这是研究各种算法的良好起点。一些技术将是相当令人惊讶和反直觉的。
要了解有关人类如何识别字符的更多信息(其中的细节往往令人惊讶且违反直觉),请阅读 Dehaene 的 阅读大脑 一书。这本书可读性很强,不需要特殊的数学或编程技能。
最后,对于任何 OCR 算法,请务必牢记以下几点:
- 图像质量很重要。尽可能控制图像采集和照明。培养对光、影等对 OCR 结果影响的良好直觉。
- 设置读取率准确性的目标。为了避免沮丧,首先设定一个低目标——也许只有 50%。有多种方法可以计算 "accurate" 的含义,但首先您可以简单地计算正确识别的字符的百分比或正确识别的单词的百分比。达到 98% 的读取率并不容易,对于某些应用程序,即使是读取率也不是特别有用。
- 识别单词增加了另一层复杂性。
- 任何深度的OCR学习都需要很长时间。慢慢来。
- 始终重新审视有关如何编写 OCR 算法 "should" 的假设。即使第 2、3、4 和 5 步的实施很聪明,但对第 1 步的愚蠢选择也会阻碍整个实施。
祝你好运!
嗨,我是一个新手程序员,在简单的图像处理方面遇到了麻烦。
我的目标是让程序识别出两个 A 是……好吧,两个 A。如果你足够仔细地看,你会发现它有点不同。(在像素的尺度上。)虽然任何有文化的人都可以将两者都读成 'A',但我敢肯定,一个逐像素比较的程序将不起作用,因为两个 A 实际上是不同的。更糟糕的是,这两个有不同的尺寸 - 一个是 48*60,另一个是 48*61。
我想知道是否有办法让一个程序 'read' 都成为 A。我听说这是一种叫做计算机视觉的东西(不太确定)......我真的更喜欢这种方法简单 - 它不是关于识别任意字符;只有 'A'。但如果不能那样做,欢迎任何让计算机将这两个都视为 A 的解释。
提前致谢:)
您的问题看起来像是光学字符识别。一种非常常见的方法是使用神经网络。神经网络将分析图像并为您提供每个字母的概率。 但是你必须先训练它,神经网络是一个活跃的研究课题,所以没有我所知道的简单 "drop-in" 解决方案。
好吧,这个问题确实没有简单的"drop-in"。我将尝试以一种简单的方式解释神经网络方法,以便为您稍微理清思路。 首先,您需要以更简单的方式表示图像! 这意味着,现在您的图像是 48*60 矩阵并且是灰度。 考虑采取以下行动:
- 将它们变成二进制照片。
- 将它们全部调整为 50*50。
- 使用形态学操作将字母变细到一个像素宽度(搜索它!)。
现在我们将对结果使用装箱方法。将您的 50*50 图像分成例如 8*8 的网格部分。计算每个部分有多少像素,并将结果放入 8*8 矩阵名称 C 中。 现在你有一个 8 x 8 的矩阵 C,它是原始图像的简单表示。 收集一些训练数据和测试数据,然后简单地使用 matlab 的神经网络模式识别应用程序(你需要知道 ANN 是如何工作的才能使用这个应用程序)
第一:字符识别不仅不是一个简单的问题,也不是一个彻底解决的问题。
OCR 实现有很多吗?是的。这些实现好吗?这取决于应用程序。您认为 OCR 应该越通用,现有的实现就越糟糕。
长话短说,有专门针对这个主题的书籍,需要一定篇幅的书才能提供任何级别的有意义的详细答案。
OCR(光学字符识别)技术有很多。针对 (a) 机器打印字符与 (b) 手写字符开发了不同的技术。阅读机印字符通常比较容易,但不一定容易。阅读手写字符可能非常困难,并且仍然是一个未完全解决的问题。请记住,还有其他 "scripts"(书写字符系统),拉丁字符的识别技术可能与繁体中文字符的识别技术不同。 [如果你能写一个手机OCR应用程序快速准确地阅读手写汉字,你可以赚一大笔钱。]
https://en.wikipedia.org/wiki/Optical_character_recognition
OCR 有多种方法,如果您有兴趣实际编写代码来执行 OCR,那么您应该首先考虑至少实施一种更简单的技术。从您的评论来看,您似乎已经在研究这个问题,但简而言之:不要先看神经网络。是的,您可能会到此为止,但是在将神经网络技术投入大量使用之前,您需要学习很多关于成像、照明和基本图像处理的知识。
但在深入之前,请花点时间尝试自己解决问题:
- 自己编写代码(不要使用别人的代码)将图像从文件加载到内存中。
- 在内存中将图像表示为二维数组。
- 想办法将几个字符或形状彼此区分开来。首先假设这些字符被完美复制。例如,如果图像包含字符“1”和“2”的多个精确副本,您能想到的区分这些字符的最简单方法是什么?
- 考虑同样的问题,但字符仅略有不同。例如,为每个字符添加几个 "noise" 像素。
稍加修改后,阅读一些基本的图像处理技术。一本好书是冈萨雷斯和伍兹的《数字图像处理》。
(归一化相关是一种简单的算法,您可以在网上和书中阅读。它对某些简单类型的 OCR 很有用。您可以将归一化相关视为一种比较 "stencil" 参考文献的方法'A' 个字符到可能是或不是 'A' 个字符的其他字符的样本——模板与样本越接近,样本是 A 的置信度越高。
是的,尝试使用 OpenCV 的模板匹配。首先修补 OpenCV 函数并了解模板匹配何时有效以及何时失败,然后更仔细地查看代码。)
最近对 OCR 技术的调查可以在这本书中找到:Cheriet 的 Character Recognition Systems。这是研究各种算法的良好起点。一些技术将是相当令人惊讶和反直觉的。
要了解有关人类如何识别字符的更多信息(其中的细节往往令人惊讶且违反直觉),请阅读 Dehaene 的 阅读大脑 一书。这本书可读性很强,不需要特殊的数学或编程技能。
最后,对于任何 OCR 算法,请务必牢记以下几点:
- 图像质量很重要。尽可能控制图像采集和照明。培养对光、影等对 OCR 结果影响的良好直觉。
- 设置读取率准确性的目标。为了避免沮丧,首先设定一个低目标——也许只有 50%。有多种方法可以计算 "accurate" 的含义,但首先您可以简单地计算正确识别的字符的百分比或正确识别的单词的百分比。达到 98% 的读取率并不容易,对于某些应用程序,即使是读取率也不是特别有用。
- 识别单词增加了另一层复杂性。
- 任何深度的OCR学习都需要很长时间。慢慢来。
- 始终重新审视有关如何编写 OCR 算法 "should" 的假设。即使第 2、3、4 和 5 步的实施很聪明,但对第 1 步的愚蠢选择也会阻碍整个实施。
祝你好运!