检测图像是否普遍为红色、绿色、蓝色或黑色。

4
我正在处理小图像,它们可能是红色、绿色、蓝色或黑色(类似于四色扑克牌中的花色)。有什么好的、快速的算法可以确定图像的颜色?
对于一组示例输入,请参见此处,但图像可能会被缩放等,因此不会那么清晰明了。
3个回答

2
这些是你使用的确切图像吗?如果是,所有图像上都有一个像素点被涂上颜色吗?我想到了西装的位置。看看应该是西装的像素点,这样就能知道牌的“颜色”了。
更一般的方法可能包括分析整个图像(缓慢但有效),将图像缩小并分析每个像素(如果最终图像较小,则更可行,但缩放可能会影响颜色),或随机取样n个像素(或像素的行/列),也许在已知颜色阴影的情况下进行一些掩蔽操作,但你需要一个通用的方法吗?
哦——另一个想法:你控制输入图像的来源吗?也许你可以用一个数字覆盖一些图像元数据标签来指示“颜色”。这有点欺骗性,因为没有真正的图像处理涉及到,而且它容易受到标签被剥离/修改的影响,但这可能是最快的方法。

我确实需要一种通用的方法 - 我不会特别使用那些图片,事先也不知道它们是什么。假设给定一个像素,那么怎样才能判断该像素是红色、绿色、蓝色还是黑色呢?考虑到红色像素可能是(255,0,0)或(255,31,12)或(253,127,114),等等。 - Claudiu
@Claudiu:啊,所以你也有“红色”的像素?我想你得定义一个“红色”的范围。考虑一下,如果有人输入橙色或粉色,你会怎么做? - FrustratedWithFormsDesigner
1
@Claudiu:你可能想要研究一下颜色直方图:http://en.wikipedia.org/wiki/Color_histogram - FrustratedWithFormsDesigner
我会把粉色算作浅红色,但不包括橙色。我想我只能分析我使用的图像,并查看它们通常被视为“红色”。 - Claudiu
啊,感谢直方图链接。看起来我应该将其转换为HSV颜色空间并在那里查找范围。 - Claudiu

1

对于一个像素,这个方法运行得足够好:

def get_ishness(r,g,b):
    h,s,v = rgb_to_hsv(r,g,b) #h from 0-360, s and v from 0-100
    if v < 50: return 'black'
    if s < 15: return None
    if h < 10: return 'red'
    if 80 < h < 100: return 'green'
    if 210 < h < 230: return 'blue'
    return None

对于整张图片,我将红色、绿色、蓝色和黑色像素相加,并返回像素最多的颜色。

1

这篇文章似乎已经解决了,但如果您不介意我的两分钱...

我理解您需要一种通用方法,并且您事先不知道图像是什么。虽然已经发布的答案应该足够快速编码,可能需要进行一些调整,但如果您仍然遇到问题,我建议您使用自组织映射:http://davis.wpi.edu/~matt/courses/soms/http://www.ai-junkie.com/ann/som/som1.html

它可能需要一些(无监督)训练时间才能获得一个不错的地图/识别器(毕竟它是一个神经网络),但我遇到过类似于您的问题,它们对我很有效(易于适应,具有不同的照明灵活性等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接