Jor*_*ith 2 c++ algorithm colors detection
我有点坚持设计一个颜色检测系统 - 我无法想办法轻松地做到这一点.
-
基本上,我有一个图像库,我想按颜色排序.因此,如果用户指定"按蓝色排序",则最蓝色的图像将显示在结果的顶部,最少的蓝色显示在底部.
问题是图像不是一种颜色,所以它同时做两件事:
1 - 找到图像
2的最蓝色部分- 对此蓝色进行排名(基于颜色色调和此颜色的数量).
我尝试了大约3种或4种不同的方法,结果各不相同 - 虽然没有效果,但其中2种是相当数学算法(在纸上的效果都比在实践中好得多).
-
我可以采取哪些不同的方式来处理整个过程?我可能错过了一些非常明显的方法 - 任何帮助或想法都会非常感激:)
-
编辑:感谢所有的回复 - 这是我到目前为止所尝试的:
获取整个图像的平均rgb值并将其与蓝色进行比较.使用归一化的rgb 3空间矢量并找到它们之间的距离来进行比较.这种效果最差,没有蓝色的图像很容易出现在部分非常强烈的蓝色图像上方.
寻找主色并将其与蓝色进行比较(再次使用3个空间矢量距离).这不起作用,因为可能有一个大的蓝色部分的图像不是最主要的颜色部分(或顶部的一对).
找到接近蓝色的像素,平均所有这些并将答案与实际蓝色进行比较.
查找所有接近蓝色的像素,递增计数并根据计数/总像素查找百分比.
想到两个想法:
廉价版本:将图像转换为HSV颜色空间,并为每个像素计算cos(H - target_hue)或合理的近似(对于蓝色,target_hue将是240度),乘以饱和度,并在图像中的所有像素上平均该数量.高价值是最好的.注意,接近黄色而不是蓝色的颜色具有"负蓝色",并且黑色,白色和纯灰色具有相同的"零蓝色".请注意,在这种情况下,您确实需要HSV,而不是HSL,因为HSL中的"S"不能很好地映射到感知饱和度.例如,颜色#f8f8ff(RGB 248,248,255)在HSL中具有100%的饱和度(即纯蓝色),但它看起来几乎是白色.HSV中的相同颜色的"S"坐标仅为3%,这是合理的.
少廉价版本:图像转换成CIELAB色彩空间,丢弃L,并且计算在每个像素和所述目标颜色,然后平均或RMS在每个像素之间的*b*空间的距离.低值是最好的.