颜色检测算法 - 我该怎么做?

时间:2011-03-18 03:50:44

标签: c++ algorithm colors detection

我对设计一个色彩检测系统感到有些困惑 - 我无法轻易找到一种方法。

-

基本上,我有一个图像库,我想按颜色排序。因此,如果用户指定“按蓝色排序”,则最蓝色的图像将显示在结果的顶部,最少的蓝色显示在底部。

问题是图像并非都是一种颜色,所以它同时做两件事:

1 - 找到图像中最蓝的部分
2 - 对此蓝色进行排名(根据色调和此颜色的数量)。

我尝试了大约3种或4种不同的方法,结果各不相同 - 虽然没有效果,但其中2种是相当数学算法(在纸上的效果都比在实践中好得多)。

-

我可以采用哪些不同的方式来完成整个过程?我可能错过了一些非常明显的方法 - 任何帮助或想法都会非常感激:)

-

编辑:感谢所有回复 - 这是我到目前为止所尝试的内容:

  • 获取整个图像的平均rgb值并将其与蓝色进行比较。使用归一化的rgb 3空间矢量并找到它们之间的距离来进行比较。这种效果最差,没有蓝色的图像很容易出现在部分非常强烈的蓝色图像上方。

  • 找到主色并将其与蓝色进行比较(再次使用3个空间矢量距离)。这不起作用,因为可能有一个大的蓝色部分的图像不是主要颜色部分中最多(或顶部的一对)。

  • 找到接近蓝色的像素,平均所有这些并将答案与实际蓝色进行比较。

  • 找到所有接近蓝色的像素,递增计数并根据计数/总像素查找百分比。

6 个答案:

答案 0 :(得分:7)

想到两个想法:

便宜版:将图像转换为HSV颜色空间,并为每个像素计算cos(H - target_hue)或合理近似(对于蓝色,target_hue将为240度),乘以饱和度,并平均该数量覆盖图像中的所有像素。高价值是最好的。注意,接近黄色而不是蓝色的颜色具有“负蓝色”,并且黑色,白色和纯灰色具有相同的“零蓝色”。请注意,在这种情况下,您确实需要HSV,而不是HSL,因为HSL中的“S”不能很好地映射到感知饱和度。例如,颜色#f8f8ff(RGB 248,248,255)在HSL中具有100%的饱和度(即纯蓝色),但它看起来几乎是白色。 HSV中的相同颜色的“S”坐标仅为3%,这是合理的。

不太便宜的版本:将图像转换为CIELAB颜色空间,丢弃L,并计算每个像素与目标颜色之间的* b *空间中的距离,然后计算每个像素的平均值或RMS。低值是最好的。

答案 1 :(得分:2)

我认为要衡量“蓝色”,你需要考虑所有三个组件,而不仅仅是蓝色。例如,[255,255,255]是纯白色,而不是蓝色 - 但[0,0,30]是纯蓝色,即使其蓝色成分的价值要低得多。

或者,您可以转换为类似HSL或HSV的东西,在这种情况下,“蓝色”应该更容易测量(仅限色调和饱和度)。

答案 2 :(得分:1)

我想谷歌用于从24位图像创建256个调色板(参见http://en.wikipedia.org/wiki/Color_quantization了解更多信息)然后看看如果图像映射到它,这个调色板中的哪些颜色占主导地位。即,为每个256个调色板条目运行一个计数器,其中有多少像素被映射到它中。

笔记, 你当然不需要整个256,它只是说256来帮助解释我的想法。 通过直接研究这个调色板生成的algorythim可能会直接给你一个答案。

答案 3 :(得分:0)

你真的需要找到图像中最蓝的部分吗?为什么不将图像的“蓝色”排列为所有像素的平均蓝色分量值?

另一种可能性是找到通过阈值的像素密度,或者有资格作为蓝色像素所需的最小蓝色值。

答案 4 :(得分:0)

如果你有一个像素,我会说它的RGB蓝色是B /(R + G + B)的值,所以1完全是蓝色而0根本不是蓝色而白色是1 / 3蓝色。 (注意黑色,这是一种特殊情况。)图像的蓝色是其像素的平均蓝色。如果这太昂贵,只需取一定数量的随机选择像素的平均值。

答案 5 :(得分:0)

我想说在整个画面中取RGB值本身的平均值。我会说下面的伪应该给你图片的“平均蓝色”。

SUMr
SUMg
SUMb    
for pixel <- image
  SUMr += pixel.r
  SUMg += pixel.g
  SUMb += pixel.b    
SUMr / pixelcount
SUMg / pixelcount
SUMb / pixelcount

如果这样做不成功;那么我认为你需要根据G / B值将“蓝色”像素排列为更高/更低的加权。然后将您的加权值相加并进行比较。

weight
for pixel <- image
  tweight = b
  b -= r
  b -= g
  b = 0 if b < 0
  weight += tweight
compare weights of all images.