对符号/图像进行分类的建议
Posted
技术标签:
【中文标题】对符号/图像进行分类的建议【英文标题】:Advice for classifying symbols/images 【发布时间】:2011-03-11 11:06:38 【问题描述】:我正在从事一个需要对字符和符号进行分类的项目(基本上是 OCR,需要处理单个 ASCII 字符和符号,例如音乐符号)。我正在使用矢量图形(WPF 中的路径和字形),因此图像可以具有任何分辨率,并且旋转可以忽略不计。它需要对不在训练集中的字体和路径进行分类(并且可能从中学习)。性能很重要,但高精度优先。
我看过一些examples of image detection using Emgu CV(OpenCV 的.Net 包装器)。然而,我发现的示例和教程似乎专门处理图像检测而不是分类。我不需要在更大的图像中找到图像的实例,只需确定图像中的符号类型。
似乎有多种方法可供选择,可能起作用,我不知道从哪里开始。任何建议或有用的链接将不胜感激。
【问题讨论】:
【参考方案1】:您可能应该看一下论文:Gradient-Based Learning Applied to Document Recognition,尽管它指的是手写字母和数字。您还应该阅读 Belongie 和 Malik 的 Shape Context。您应该寻找的关键字是数字/字符/形状识别(不是检测,不是分类)。
【讨论】:
谢谢,我会看看并发布我的结果。 我最终在 EmguCV 中使用了 EigenObjectRecognizer 类。感谢关键字提示。【参考方案2】:如果您使用 EmguCV,SURF 功能示例(StopSign 检测器)将是一个不错的起点。另一种(可能是互补的)方法是使用 MatchTemplate(..) 方法。
但是我找到的示例和教程 似乎专门处理图像 检测而不是分类。一世 不需要找到一个实例 更大的图像中的图像,只是 确定符号的种类 图片。
通过在图像中查找符号的实例,您实际上是在对其进行分类。不知道为什么你认为这不是你需要的。
Image<Gray, float> imgMatch = imgSource.MatchTemplate(imgTemplate, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMED);
double[] min, max;
Point[] pointMin, pointMax;
imgMatch.MinMax(out min, out max, out pointMin, out pointMax);
//max[0] is the score
if (max[0] >= (double) myThreshold)
Rectangle rect = new Rectangle(pointMax[0], new Size(imgTemplate.Width, imgTemplate.Height));
imgSource.Draw(rect, new Bgr(Color.Aquamarine), 1);
max[0] 给出了最佳匹配的分数。
【讨论】:
这是我首先尝试的(使用“SURF 特征检测器”示例)。但是我不知道如何比较结果。它会找到一堆正确匹配的特征和一堆不正确(但接近)匹配的特征。你怎么知道哪一组特征匹配更好?附带说明一下,SURF 是旋转不变的(这很酷),但可能对我的情况有害。 您确实知道您对每个匹配项(SURF 或模板匹配)都有一个匹配分数,这可以让您了解匹配的紧密程度。您还可以为 ExhaustiveTemplateMatching 类设置一个阈值,这样您就可以剔除不太相关的类。 我以为一定是这样,但我找不到。谢谢。【参考方案3】:将您的所有图像都降低到某个标准分辨率(适当缩放和居中)。 将画布分解成 n 个正方形或矩形块。
对于每个块,您可以测量该块中黑色像素的数量或黑白之间的比率,并将其视为特征。
现在您可以将图像表示为特征向量(每个特征源自不同的块),您可以使用许多标准分类算法来预测图像所属的类别。
Google 'viola jones' 以获取此类更详细的方法。
【讨论】:
我尝试了一些非常接近这个的东西。它适用于以前见过的符号,但对于新字体/变体可能更好。我会做一些谷歌搜索。以上是关于对符号/图像进行分类的建议的主要内容,如果未能解决你的问题,请参考以下文章