最近我从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) ).
但是目前我不知道提取更多信息的最佳方式是什么(图中有星星?或者其他).你能给我一些关于怎么做的提示吗?
提前致谢
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图像识别
首先是一些快速术语,以防万一:
分类器学习输出到输出的映射.您可以通过给出输入/输出对来训练分类器,例如颜色信息等特征向量和"捷克旗"等标签.实际上,标签表示为标量数字.在您的示例中,您有一个多类问题,这意味着有两个以上可能的标签(显然,因为有两个以上的国家/地区标志).训练多类分类器可能比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色彩空间也应该很容易.如果未达到预期效果,可以尝试改进特征向量或分类器.