【问题标题】:main color detection in PythonPython中的主要颜色检测
【发布时间】:2026-01-16 12:50:01
【问题描述】:

我有大约 3000 张图像和 13 种不同的颜色(这些图像的大部分背景是白色)。如果图像的主要颜色是这 13 种不同颜色之一,我希望将它们关联起来。

我看到过类似的问题,例如Image color detection using python,要求使用平均颜色算法。我已经使用 Python 图像库和直方图几乎复制了该代码,并让它工作 - 但我发现它对于确定主要颜色不太可靠。

有什么想法吗?或者可以解决这个问题的图书馆?

提前致谢!

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

再次感谢。

【问题讨论】:

  • 您对颜色的定义是什么? RGB三胞胎? (r/g,b/g)?来自 hsv 空间的色调?
  • 抱歉含糊不清 - 我的意思是 RGB 三元组

标签: python colors detection


【解决方案1】:

您可以使用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)。

【讨论】:

  • 图像库现在是否被称为其他名称?
  • 我明白了。 from PIL import Image
【解决方案2】:

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

基本上,考虑 median 而不是 average。您只真正关心图像中的颜色,而平均颜色通常会给您一种全新的颜色。

【讨论】:

    【解决方案3】:

    由于您尝试匹配少量预先存在的颜色,您可以尝试不同的方法。针对所有颜色测试每张图片,看看哪一张最匹配。

    至于进行匹配,我会先将每张图片调整为更小的尺寸,以减少您为每张图片所做的工作量;我们对图像颜色的感知并不太依赖于细节的数量。对于较小图像的每个像素,找出 13 种颜色中最接近的颜色。如果它在某个阈值之内,请为该颜色添加一个计数器。最后,13 人中得分最高的为获胜者。

    【讨论】: