我在设计颜色检测系统方面有点陷入困境 - 我不太想出一种轻松完成它的方法。
-
基本上,我有一个图像库,我想按颜色排序。因此,如果用户指定“按蓝色排序”,则蓝色最多的图像将出现在结果的顶部,蓝色最少的图像将出现在底部。
问题是图像并不全是一种颜色,所以它同时做两件事:
1- 找到图像中最蓝的部分
2- 对该蓝色进行排名(基于色调和该颜色的数量)。
我尝试了大约 3 或 4 种不同的方法,但结果各不相同 - 但没有一个能很好地工作,其中 2 种是相当数学的算法(它们在纸上的效果都比实践中好得多,哈哈)。
-
我可以采取哪些不同的方式来完成整个过程?我可能错过了一些非常明显的工作方式 - 任何帮助或想法将不胜感激:)
-
EDIT:感谢您的所有回复 - 这是我迄今为止尝试过的:
获取整个图像的平均 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,并计算 a*b* 空间中每个像素与目标颜色之间的距离,然后对每个像素求平均值或 RMS。低值是最好的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)