最近,我从中央情报局世界事实手册下载了一些标志。现在我想把它们分类。
在浏览时,我看到了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)), ...)]
奇怪的是,奥地利国旗中只有两种颜色,但上面的输出显示了十多个颜色。你知道为什么吗?我的想法是只计算前5种颜色,因为我对每种颜色都不感兴趣,所以我会对64的倍数进行一些“规范化”(所以(236,145,146)变成(192,128,128))。
然而,目前我不知道提取更多信息的最佳方法是什么(如果图像中有一颗恒星)。否则)。你能给我一些怎么做的提示吗?
提前感谢
发布于 2010-07-14 15:32:34
PIL只做基本的图像操作-打开、一些转换或过滤器,并保存到其他格式。
模式识别,是一个先进的图像处理领域的一部分和进化-它使用的算法远远不同于目前的PIL。
在Python中可以使用一些库和框架来进行模式识别(识别星星和卫星等等),尽管我向您提出了这样的建议:如果您希望这样做只是为了对一个0和几个coutnry标志进行分类,您应该手动进行,而不是尝试深入模式识别。
您对颜色数量的评论说明您根本不使用计算机图像。模式识别是硬核心,即使是python前端也是如此。(你不能指望现有的框架事先知道什么是“月亮”或“恒星”)
因此,对于少于500个图像,您可以求助于允许您手动标记图像并编写一些代码将标记链接到每个标志的软件。
至于颜色:计算机光栅图像是由像素组成的。这些是广场。在不同颜色之间的边界,如果一个像素在一种颜色上(比如白色),而它的邻居是一个完全不同的颜色(比如红色),那么这个边界就会出现锯齿状。这就是所谓的“混叠”。为了减少这一点,计算机软件在硬边界上混合颜色,创建中间颜色--这就是为什么一个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图像识别
发布于 2010-07-14 18:27:04
首先是一些简单的术语,以防万一:
分类器学习输出的输入映射。通过提供输入/输出对来训练分类器,例如,特征向量(如颜色信息)和标签(如“捷克国旗”)。在实践中,标签被表示为标量数。在您的示例中,您有一个多类问题,这仅仅意味着有两个以上可能的标签(显然,因为有两个以上的国旗)。多类分类器的训练可能比普通的二进制分类器要复杂一些,所以您可能需要搜索诸如“多类分类器”或“一对多分类器”这样的术语来为您研究最佳的方法。
关于这个问题:
我认为使用一个简单的分类器,比如k近邻,以颜色直方图作为特征向量,可以很容易地解决问题。特别是,我将使用HSV特征向量,而不是RGB特征向量。使用这种简单的分类器系统,例如:基于直方图的图像分类支持向量机,在文献中得到了一些很好的结果。本文使用了一种特殊的分类器--支持向量机(SVM)和HSV特征向量。HSV特征向量也避免了图像缩放和旋转的问题,例如,一个标志是1024x768 vs 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颜色空间以及。如果你没有达到你想要的结果,你可以尝试改进你的特征向量或分类器。
https://stackoverflow.com/questions/3251069
复制