【问题标题】:Automatically recognize patterns in images自动识别图像中的图案
【发布时间】:2011-03-16 03:07:40
【问题描述】:

最近我从CIA world factbook 下载了一些标志。现在我想“对它们进行分类。

  1. 获取颜色
  2. 获取一些形状(星星、月亮等)

在浏览时,我发现了 Python Image Library,它允许我提取颜色(即Austria

#!/usr/bin/env python
import Image
bild = Image.open("au-lgflag.gif").convert("RGB")
bild.getcolors()
[(44748, (255, 255, 255)), (452, (236, 145, 146)), (653, (191, 147, 149)), ...)]

我觉得奇怪的是,奥地利国旗里面只有两种颜色,但上面的输出却显示了十多种。你知道为什么吗?我的想法是只计算前 5 种颜色,因为我对 每种 颜色不感兴趣,我会做一些“标准化”将数字“标准化”为 64 的倍数(因此 (236, 145, 146) 变为(192, 128, 128))。

但是目前我不知道提取更多信息的最佳方法是什么(图像中是否有一颗星?或者其他)。你能给我一些提示吗?

提前致谢

【问题讨论】:

    标签: python algorithm image-processing python-imaging-library


    【解决方案1】:

    Python 图像库 - PIL 只进行基本的图像处理 - 打开、一些转换或过滤器,以及保存为其他格式。

    模式识别是高级图像处理领域的一部分并且不断发展——它使用的算法与 PIL 中的算法大不相同。

    您可以在 Python 中使用一些库和框架进行模式识别 - (识别星星和月亮等) - 虽然我向您提出了建议:如果您只想对一个 0 和 1 进行分类国家标志,您应该手动完成,而不是尝试深入模式识别。

    您对颜色数量的评论表明您根本不使用计算机图像。模式识别是核心,即使使用 python 前端也是如此。 (例如,你不能指望任何当前的框架事先知道什么是“月亮”或“星星”)

    因此,对于少于 500 张的图像,您可以使用允许您手动标记图像并编写一些代码将标签链接到每个标志的软件。

    至于颜色:计算机光栅化图像由像素组成。这些是广场。在不同颜色之间的边界,如果一个像素在一种颜色上(比如白色),而它的邻居是完全不同的颜色(比如红色),这个边界就会出现锯齿状。这称为“混叠”。为了减少这种情况,计算机软件在硬边界处混合颜色,创建中间颜色 - 这就是为什么即使具有 2 种明显颜色的 PNG 在内部也可以具有多种颜色。对于 .JPG,情况更糟,因为我们使用的 RGB 颜色的四舍五入十进制数字甚至没有像它们在图像中那样存储。

    与模式识别不同,您可以通过仅使用每个组件的最高有效位来缩小看到的颜色数量。我想说两个最重要的位就足够了。 以下 python 函数可以使用 PIL 给出的颜色计数来做到这一点:

    def get_main_colors(col_list):
        main_colors = set()
        for index, color in col_list:
            main_colors.add(tuple(component >> 6 for component in color))
        return [tuple(component << 6 for component in color) for color in main_colors]
    

    例如用“get_main_colors(bild.get_colors())”调用它。

    这是处理模式识别部分的另一个问题: python image recognition

    【讨论】:

      【解决方案2】:

      首先是一些简短的术语,以防万一:

      分类器学习输入到输出的映射。您通过给分类器输入/输出对来训练分类器,例如颜色信息等特征向量和“捷克国旗”等标签。在实践中,标签表示为标量数。在您的示例中,您有一个多类问题,这仅仅意味着有两个以上的可能标签(显然,因为有两个以上的国家标志)。训练多类分类器可能比普通二元分类器要复杂一些,因此您可能需要搜索“多类分类器”或“一对多分类器”等术语来研究最适合您的方法。

      关于问题:

      我认为使用颜色直方图作为特征向量的简单分类器(例如 k 最近邻)可以轻松解决您的问题。特别是,我会使用 HSV 特征向量而不是 RGB 特征向量。仅使用这种简单的分类器系统,文献中已经报道了一些很好的结果,例如:SVMs for Histogram-Based Image Classification。在那篇论文中,作者使用了称为支持向量机 (SVM) 和 HSV 特征向量的特定分类器。 HSV 特征向量还回避了图像缩放和旋转问题,例如 1024x768 与 640x480 的标志,或者在图像中旋转 45 度的标志。

      用于训练算法的伪代码如下所示:

      # training simple kNN -- just compute feature vectors, collect labels
      X = []    # tuple (input example, label)
      for training_image in data:
          x = get_hsv_vector(training_image)
          y = get_label(training_image)
          X.append((x,y))
      
      # classification -- pick k closest feature vectors 
      K = 3     # the 'k' in kNN -- how many similar featvecs to use
      d = []    # (distance, label) tuples for scoring
      x_test = get_hsv_vector(test_image)    # feature vector to be classified
      for x_train in X:
          d.append((distance(x_test[0], x_train), x_test[1])
      
      # sort distances, d, by closeness and pick top K labels for scoring
      d.sort()
      output = get_majority_vote([x[1] for x in d[:K]])
      

      kNN 分类器可在多个 python 包中使用,并提供良好的文档。转换为 HSV 颜色空间也应该很容易。如果你没有达到你想要的结果,你可以尝试改进你的特征向量或者你的分类器。

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2013-06-17
        • 1970-01-01
        相关资源
        最近更新 更多