准确的二进制图像分类

问题描述 投票:12回答:7

我试图从一个游戏板字母的项目。目前,我可以检测游戏板,段成单个方块,并提取每平方的图像。

我得到的输入是这样的(这些是个别字母):

首先,我被计数每个图像的黑色像素的数量,并使用识别不同的字母,其工作有点以及用于受控输入图像的,作为一个方式。我有,这个问题虽然是我不能做这个工作,从这些稍有不同的图像。

我身边有5个样品每一个字母一起工作进行训练,这应该是足够了。

有谁知道这将是一个很好的算法用于此?

我的想法是(归一化图像后):

  • 计数的图像,并且每一个字母图像,看看哪一个产生错误的至少量之间的差。这不会对大型数据集工作,虽然。
  • 检测角落和比较的相对位置。
  • ???

任何帮助,将不胜感激!

python image-processing opencv ocr simplecv
7个回答
14
投票

我认为这是某种形式的监督学习的。你需要做的一些图像特征提取,然后做你的分类你计算每个图像的特征向量的基础上。

特征提取

在乍看之下,这特征提取部分看起来像Hu-Moments一个很好的方案。只是计算image moments,然后从这些计算cv::HuMoments。那么你有一个7维实值特征空间(每幅图像的特征向量)。另外,您也可以省略此步骤并使用每个像素值作为单独的功能。我认为在this answer建议去这个方向,但增加了一个PCA压缩来降低特征空间的维数。

分类

至于分级部分,几乎可以使用任何你喜欢的分类算法。您可以使用每个字母的SVM(二进制的是否分类),你可以使用一个NaiveBayes(什么是最大可能的字母),或者你可以使用一个k最近邻(k近邻,在功能空间的最小空间距离)的方法,例如flann

特别是对于基于距离的分类(例如KNN),你应该考虑你的功能空间的标准化(例如缩放所有维度值在一定范围内为欧氏距离,或用之类的东西马氏距离)。这是为了避免在分类过程中较大值的差异overrepresenting功能。

评估

当然,你需要训练数据,即给出正确的字母图像特征向量。而一个过程,来评估你的进程,例如交叉验证。


在这种情况下,你可能也想看看template matching。在这种情况下,你会在你的训练集中可用的模式进行卷积候选图像。输出图像中的高值表明该图案位于该位置处的良好的概率。


5
投票

这是一个认识问题。我个人使用PCA的组合和机器学习技术(可能SVM)。这些都是相当大的主题,因此我怕我真的不能过多阐述,但这里的非常基本的过程:

  1. 召集你的训练图像(每个字母不止一个,但不发疯)
  2. 标记它们(可能意味着很多事情,在这种情况下,它意味着组的字母到逻辑组 - 所有甲图像 - > 1,所有的B图像 - > 2等)
  3. 训练分类 通过PCA分解运行一切 项目所有的训练图像到PCA空间 通过SVM运行投影图像(如果它是一类分类,做他们一次一个,否则做出来的一次。) 保存了你的PCA特征向量和SVM训练数据
  4. 运行识别 负载在PCA空间 负载在SVM训练数据 对于每一个新的形象,项目成PCA空间,并问你的SVM分类它。 如果你得到一个答案(数字)映射回了一封信(1 - > A,2 - > B,等等)。

4
投票

2
投票

我有一个类似的问题,几天就回来。但它是数字识别。不为字母。

我实现了一个简单的OCR在OpenCV的这种使用kNearestNeighbour。

下面是链接和代码:

Simple Digit Recognition OCR in OpenCV-Python

实现它的字母。希望它的工作原理。



0
投票

您可以尝试通过上传你的训练数据建立模型来demo.nanonets.ai(〜1秒的,2S,3S .... 787-9 50张)(免费使用)

1)在这里上传你的训练数据:

demo.nanonets.ai

2)使用以下(Python代码)然后查询API:

import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "http://images.clipartpanda.com/number-one-clipart-847-blue-number-one-clip-art.png"
files = {'uploadfile': urllib.urlopen(url).read()}
url = "http://demo.nanonets.ai/classify/?appId="+model_name
r = requests.post(url, files=files)
print json.loads(r.content)

3)所述响应是这样的:

{
  "message": "Model trained",
  "result": [
    {
      "label": "1",
      "probability": 0.95
    },
    {
      "label": "2",
      "probability": 0.01
    },

     ....

    {
      "label": "9",
      "probability": 0.005
    }
  ]
}

0
投票

由于您的图像度过了一个棋盘游戏的电脑屏幕,变化不能“太疯狂了”。我刚刚得到的东西为同一类型的问题的工作。我通过裁剪一直到“核心”归我的图片。

以每个字母5个样品,你可能已经完全覆盖。

我在图像文件名开始组织了“冲压”标识符我的工作。然后我可以排序的文件名(=标识符)。 Windows资源管理器允许您查看与中图标的目录打开。我会用“假改名”行动取得的标识,并将其复制到Python程序。

这里是可以翻新任何的这些问题的一些工作代码。

def getLetter(im):
    area = im.height * im.width
    white_area = np.sum(np.array(im))
    black_area = area - white_area
    black_ratio = black_area / area           # between 0 and 1
    if black_ratio == .740740740740740 or \
       black_ratio == .688034188034188 or \
       black_ratio == .7407407407407407:  
       return 'A'
    if black_ratio == .797979797979798:
       return 'T'
    if black_ratio == .803030303030303:
       return 'I'
    if black_ratio == .5050505050505051 or \
       black_ratio == .5555555555555556:
       return 'H'
    ############ ... etc.

    return '@' # when this comes out you have some more work to do

注意:这可能是相同的标识符(这里我们使用black_ratio)可能指向多个字母。如果它发生,你需要采取的图像的另一个属性它们之间进行区分。

© www.soinside.com 2019 - 2024. All rights reserved.