自动识别图像中的图案

时间:2010-07-14 22:34:07

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

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

  1. 获取颜色
  2. 获得一些形状(星星,卫星等)
  3. 在浏览时,我遇到了Python图像库,它允许我提取颜色(即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))。

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

    提前致谢

2 个答案:

答案 0 :(得分:8)

Python成像库 - PIL只进行基本的图像处理 - 打开,转换或过滤,并保存为其他格式。

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

你可以在Python中使用一些库和框架来进行模式识别 - (识别星星,卫星等等) - 虽然我推进了你:如果你想要这只是为了分类一个0-徘徊 - 和 - 少数coutnry标志,你应该手动完成,而不是试图潜入模式识别。

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

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

颜色:计算机光栅化图像由像素组成。这些是广场。在不同颜色之间的边界处,如果像素在一种颜色(例如白色)上,并且其邻居是完全不同的颜色(如红色),则该边界将显示为锯齿状。这称为“别名”。为了减少这种情况,计算机软件在硬边界处混合颜色,创建中间颜色 - 这就是为什么PNG即使有2种表观颜色也可以在内部有多种颜色。对于.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

答案 1 :(得分:7)

首先是一些快速术语,以防万一:

分类器学习输出的输入图。您可以通过给出输入/输出对来训练分类器,例如颜色信息等特征向量和“捷克旗”等标签。实际上,标签表示为标量数字。在您的示例中,您有一个多类问题,这意味着有两个以上可能的标签(显然,因为有两个以上的国家/地区标志)。训练多类分类器可能比vanilla二元分类器有点棘手,因此您可能希望搜索“多类分类器”或“一对多分类器”等术语来研究最佳方法。

解决问题:

我认为你的问题很容易用一个简单的分类器解决,比如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色彩空间也应该很容易。如果未达到预期效果,可以尝试改进特征向量或分类器。