Python中的主要颜色检测
我有大约3000张图片,里面有13种不同的颜色(大部分图片的背景是白色的)。如果一张图片的主要颜色是这13种颜色中的一种,我希望能把它们关联起来。
我看到过类似的问题,比如使用Python进行图像颜色检测,他们在问关于平均颜色的算法。我基本上复制了那段代码,使用了Python图像库和直方图,并且让它运行起来了,但我发现它在判断主要颜色时并不是很可靠。
有没有什么好的主意?或者有什么库可以解决这个问题吗?
提前谢谢大家!
:编辑:
谢谢大家,你们基本上都说了同样的事情,就是创建“桶”,并随着每个最近像素的增加来增加桶的数量。我发现很多图片返回的颜色是“白色”或“米色”,而这些颜色也是大多数图片的背景。有没有办法绕过或忽略背景呢?
再次感谢。
3 个回答
既然你想要匹配一些已经存在的颜色,可以试试另一种方法。对每张图片进行测试,看看哪种颜色最接近。
关于如何进行匹配,我建议先把每张图片缩小,这样可以减少你需要处理的工作量;其实我们对图片颜色的感知并不太依赖于细节的多少。对于缩小后的每一个像素,找出哪种颜色在13种颜色中最接近。如果这个颜色在某个范围内,就给这个颜色的计数器加一。最后,计数最高的颜色就是最接近的颜色。
我个人会把颜色分成8到16种主要颜色,然后对每个像素来说,找到最接近的颜色桶,把它的数量加一。最后,像素最多的那个颜色桶就是赢家。
简单来说,想想中位数而不是平均数。你其实只关心图片里的颜色,而平均颜色通常会得到一种全新的颜色。
你可以使用 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
的值(具体细节可以查看 文档)。