当前位置:  开发笔记 > 编程语言 > 正文

自动识别图像中的图案

如何解决《自动识别图像中的图案》经验,为你挑选了2个好方法。

最近我从CIA世界事实本上下载了一些标志.现在我想"对它们进行分类.

    获得颜色

    获得一些形状(星星,卫星等)

在浏览时,我遇到了Python图像库,它允许我提取颜色(即对于奥地利:

#!/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)), ...)]

我觉得奇怪的是,奥地利国旗只有两种颜色,但上面的输出显示超过十种.你知道为什么吗?我的想法是只计算前五种颜色,因为我对每种颜色都不感兴趣,我会做一些"标准化"数字到64的倍数(所以(236,145,146)变成(192,128,128) ).

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

提前致谢



1> jsbueno..:

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

模式识别是高级图像处理标志领域和演进的一部分 - 它使用的算法与PIL中存在的算法大不相同.

你可以在Python中使用一些库和框架来进行模式识别 - (识别星星,卫星等等) - 虽然我推进了你:如果你想要这只是为了分类一个数不胜数的少数几个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图像识别



2> Andrew B...:

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

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

关于问题:

我认为你的问题很容易用一个简单的分类器解决,比如k-最近邻,颜色直方图作为特征向量.特别是,我将使用HSV特征向量而不是RGB特征向量.仅使用这种简单的分类器系统在文献中报道了一些很好的结果,例如:用于基于直方图的图像分类的SVM.在该论文中,作者使用称为支持向量机(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色彩空间也应该很容易.如果未达到预期效果,可以尝试改进特征向量或分类器.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有