Python中的主要颜色检测

7
我有大约3000张图片和13种不同的颜色(其中大部分图片的背景是白色)。如果一张图片的主要颜色是这13种不同的颜色之一,我希望它们能够关联起来。
我看到了类似的问题,例如使用Python进行图像颜色检测,它要求使用平均颜色算法。我几乎复制了那段代码,使用Python图像库和直方图,并使其正常工作 - 但我发现它对于确定主要颜色并不太可靠。
有什么想法吗?或者有哪些库可以解决这个问题?
提前感谢!
:编辑: 谢谢大家 - 你们几乎都说了同样的话,要创建“桶”,并通过每个最近像素的增加桶计数来实现。我似乎得到了很多返回“白色”或“米色”的图片,这也是大多数这些图片的背景。有没有办法绕过或忽略这个背景?
再次感谢。

你如何定义颜色?是RGB三元组(红/绿,蓝/绿)吗?或者是HSV空间中的色调? - Simon Bergot
抱歉,我的表述有些含糊 - 我的意思是 RGB 三元组。 - dchang
3个回答

11
你可以使用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值(有关详细信息,请参见文档)。

现在图像库被称为其他什么名称了吗? - Arindam Roychowdhury
我明白了。from PIL import Image - Arindam Roychowdhury

2

个人建议将颜色空间分成8-16个主要颜色,然后对于每个像素,将其最接近的颜色桶增加一个计数。最后,具有最高像素数量的桶的颜色获胜。

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


1

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

至于如何进行匹配,我建议先将每个图像调整为较小的尺寸,以减少每个图像所需的工作量;我们对图像颜色的感知并不太依赖于细节的数量。对于较小图像的每个像素,请找出最接近的13种颜色中的哪一种。如果它在某个阈值内,则为该颜色增加一个计数器。最后,拥有最高计数的13种颜色中的哪一种就是获胜者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接