我想使用python在图像中找到最常用的颜色。例如,检测下图中对象的颜色
http://www.shopcrazy.com.ph/wp-content/images/2007/02/shiny-bags-01.jpg
如何从RGB代码中检测基色(例如 - 上图中的红色)。
答案 0 :(得分:5)
由于您很可能不希望使用24位色彩空间的所有百万种颜色的直方图,我建议将图像转换为HSV空间。 然后,您可以将该空间的Hue部分划分为多个描述您要查找的色调的区域(“深红色”,“橙红色”或其他)。然后制作这些箱子的直方图,找出哪个是主色调,这就是“颜色”。
维基百科文章http://en.wikipedia.org/wiki/HSL_and_HSV应该让你入门。如果您使用的是图像处理库,则可能存在rgb-to-hsv / hsl函数。
此外,如果图像很大且速度有问题,您可以考虑在直方图编码之前将图像缩小采样到较小的尺寸。
答案 1 :(得分:3)
蛮力方法是循环图像中的所有像素并保持R,G,B值的计数。更精确的方法是使用Python Image Library直方图函数并计算所有颜色的平均值。
答案 2 :(得分:2)
我会使用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空间中足够接近的点(特别是色调分量)很可能是相同的颜色,因此可以加在一起。
答案 3 :(得分:1)
如果您确定您将始终只有一种主色(例如,没有两种颜色的包),那么H& S尺寸HSV上的粗略直方图就足够了。
否则,您可以(并且应该)使用mean shift。它非常简单,完全符合您的要求,并且您可以使用库,尽管我在Python中找不到任何东西。您可以实现它,也可以调用C ++代码。
算法的基本思想是:每个像素查看相似颜色的附近像素,并将其颜色更改为所有颜色的加权平均值;冲洗并重复。很快你就可以将图像中的所有颜色紧紧围绕几种主要颜色聚集在一起。
答案 4 :(得分:0)
对像素进行原位排序,然后遍历图像并找到最长的运行。
答案 5 :(得分:0)
根据建议,将图像从RGB转换为HSV会更方便。标准库模块colorsys包含该效果的函数rgb_to_hsv
。然后,您可以在图像上映射颜色,例如H为x,S为y。选择该空间中的点,并给它们命名;积分越多越好。然后,对于图像中的每个像素,找到最接近的点,并使用其名称作为像素值。计算大多数时间出现的名称。
你要我提供代码吗?