在Python中检测图像中使用最频繁的颜色
我想用Python找出一张图片中最常用的颜色。例如,检测下面这张图片中物体的颜色。
http://www.shopcrazy.com.ph/wp-content/images/2007/02/shiny-bags-01.jpg。
怎么从RGB代码中检测出基本颜色(比如上面图片中的红色)。
6 个回答
我会使用Python图像库。这段代码可以计算一张图片中白色像素和非白色像素的数量。
import sys
from PIL import Image
im = Image.open(sys.argv[1])
white = 0
black = 0
for i in im.getdata():
if i == (255,255,255):
white += 1
else:
# we assume black everything that is not white:
black += 1
print im.size[0],im.size[1],white,black
在你的情况下,我会用一个字典来记录每个RGB颜色组合和它的计数,所以我会把程序改成这样(这个版本没有测试过)。
import sys
from PIL import Image
im = Image.open(sys.argv[1])
count= {}
for i in im.getdata():
if not count.has_key(i):
count[i] = 0
count[i] += 1
现在你可以查看计数最高的那个,找到使用最频繁的RGB颜色组合。当然,如果你还想检查相近的颜色,就需要把颜色转换成HSV格式,然后检查不同HSV点之间的距离,最后决定哪个距离算太远。在HSV空间中,距离足够近的点(特别是色相部分)很可能是同一种颜色,因此可以把它们加在一起。
暴力破解的方法就是遍历图像中的每一个像素,统计红色(R)、绿色(G)和蓝色(B)的值。更高级一点的方法是使用Python图像库中的直方图功能,来计算所有颜色的平均值。
因为你可能不想要一个包含二十四位颜色空间中所有百万种颜色的直方图,所以我建议把图像转换成HSV颜色空间。这样,你可以把这个空间中的色相部分分成几个小区间,这些小区间可以用来描述你想要找到的颜色,比如“深红色”、“橙红色”等等。然后,你可以根据这些小区间制作一个直方图,找出哪种颜色是最主要的,也就是你想要的“颜色”。
你可以参考维基百科上的文章 http://en.wikipedia.org/wiki/HSL_and_HSV 来了解更多。如果你在使用图像处理库,通常会有一个将RGB转换为HSV或HSL的函数。
另外,如果你的图像很大,而且处理速度是个问题,你可以考虑先把图像缩小再制作直方图。