我有大约3000张图像和13种不同的颜色(大多数图像的背景是白色的)。如果图像的主要颜色是13种不同颜色中的一种,我希望它们相关联。
我见过像Image color detection using python这样的类似问题要求平均颜色算法。我几乎使用Python图像库和直方图复制了这些代码,并使其工作 - 但我发现它对于确定主要颜色并不太可靠。
有什么想法吗?或者可以解决这个问题的图书馆?
提前致谢!
:编辑: 谢谢你们 - 你们几乎都说同样的事情,创建“桶”并增加每个最近像素的桶数。我似乎得到了很多图像返回“白色”或“米色”,这也是大多数这些图像的背景。有办法解决或忽略背景吗?
再次感谢。
答案 0 :(得分: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)。
答案 1 :(得分:2)
我个人将颜色空间分成8-16种主色,然后对于每个像素,我将最近的彩色桶增加一个。最后,具有最高像素数的桶的颜色获胜。
基本上,请考虑中位数而不是平均值。您只关心图像中的颜色,而平均颜色通常会为您提供全新的颜色。
答案 2 :(得分:1)
由于您尝试匹配少量预先存在的颜色,因此您可以尝试不同的方法。根据所有颜色测试每个图像,并查看哪个是最接近的匹配。
至于进行比赛,我首先将每张图片的大小调整为较小的尺寸,以减少您为每张图片所做的工作量;我们对图像颜色的感知并不太依赖于细节的数量。对于较小图像的每个像素,找到最接近的13种颜色中的哪一种。如果它在某个阈值内,则碰撞该颜色的计数器。最后13个中最重要的一个是赢家。