2011-10-14 82 views
7

我有大约3000个图像和13种不同的颜色(大多数这些图像的背景是白色的)。如果图像的主要颜色是13种不同颜色之一,我希望它们相关联。Python中的主要颜色检测

我见过类似的问题,如Image color detection using python要求平均颜色算法。我已经使用Python图像库和直方图非常复制了这些代码,并且使它可以正常工作 - 但是我发现确定主色不太可靠。

任何想法?或者可以解决这个问题的库?

在此先感谢!

:编辑: 谢谢你们 - 你们几乎都说过同样的事情,创建“桶”并增加每个最近像素的桶数。我似乎获得了许多图像,返回“白色”或“米色”,这也是大多数这些图像的背景。有没有办法解决或忽略背景?

再次感谢。

+0

什么是你定义的颜色?一个rgb三联体? (r/g,b/g)?从hsv空间的色调? – Simon

+0

抱歉的歧义 - 我的意思是RGB三联 – dchang

回答

9

您可以使用getcolors函数获取图像中所有颜色的列表。它返回形式元组的列表:

(N, COLOR) 

其中N是彩色COLOR的图像中出现的次数。为了获得最大的发生颜色,你可以将列表传递给max功能:

>>> from PIL import Image 
>>> im = Image.open("test.jpg") 
>>> max(im.getcolors(im.size[0]*im.size[1])) 
(183, (255, 79, 79)) 

注意,我通过im.size[0]*im.size[1]到getcolors功能,因为这是最大maxcolors值(见the docs了解详细信息)。

+0

图像库现在叫别的东西吗? –

+0

我明白了。 '从PIL导入图像' –

2

就我个人而言,我会将色彩空间分成8-16种主色,然后对于每个像素,我会将最接近的彩色桶增加一个。最后,具有最高像素量的桶的颜色获胜。

基本上,认为中位数而不是平均。你只关心颜色图像,而平均颜色通常会给你一个全新的颜色。

1

由于您试图匹配少量预先存在的颜色,因此您可以尝试不同的方法。根据所有颜色测试每个图像,并查看哪一个是最接近的匹配。

至于做比赛,我会开始调整每个图像的大小以减小每个图像的工作量;我们对图像颜色的感知不太依赖于细节的数量。对于较小图像的每个像素,找出最接近的13种颜色中的哪一种。如果它在一定的阈值内,就会碰到该颜色的计数器。最后的13支球队中,无论哪一支都是赢家。