我对设计一个色彩检测系统感到有些困惑 - 我无法轻易找到一种方法。
-
基本上,我有一个图像库,我想按颜色排序。因此,如果用户指定“按蓝色排序”,则最蓝色的图像将显示在结果的顶部,最少的蓝色显示在底部。
问题是图像并非都是一种颜色,所以它同时做两件事:
1 - 找到图像中最蓝的部分
2 - 对此蓝色进行排名(根据色调和此颜色的数量)。
我尝试了大约3种或4种不同的方法,结果各不相同 - 虽然没有效果,但其中2种是相当数学算法(在纸上的效果都比在实践中好得多)。
-
我可以采用哪些不同的方式来完成整个过程?我可能错过了一些非常明显的方法 - 任何帮助或想法都会非常感激:)
-
编辑:感谢所有回复 - 这是我到目前为止所尝试的内容:
获取整个图像的平均rgb值并将其与蓝色进行比较。使用归一化的rgb 3空间矢量并找到它们之间的距离来进行比较。这种效果最差,没有蓝色的图像很容易出现在部分非常强烈的蓝色图像上方。
找到主色并将其与蓝色进行比较(再次使用3个空间矢量距离)。这不起作用,因为可能有一个大的蓝色部分的图像不是主要颜色部分中最多(或顶部的一对)。
找到接近蓝色的像素,平均所有这些并将答案与实际蓝色进行比较。
找到所有接近蓝色的像素,递增计数并根据计数/总像素查找百分比。
答案 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.