我有一个场景,我从图像中获得了一种或多种颜色,但现在我需要确定它最接近哪一个现有的颜色选项。
例如,我可能有红色(255,0,0),绿色(0,255,0)和蓝色(0,0,255)作为我的三个选项,但图像可能包含橙色(255,165,0)。
我需要的是一种方法来确定我应该选择哪三个值作为输出颜色来替换橙色。
我考虑过的一种方法是测量这三个值的范围,看看哪一个是最小的&选择那种颜色。
示例:
橙色 - >红色
abs(255 - 255) = 0, abs(165 - 0) = 165, abs(0 - 0) = 0
0 + 165 + 0 = 165
橙色 - >绿色
abs(255 - 0) = 255, abs(165 - 255) = 90, abs(0 - 0) = 0
255 + 90 + 0 = 345
橙色 - >蓝色
abs(255 - 0) = 255, abs(165 - 0) = 165, abs(0 - 255) = 255
255 + 165 + 255 = 675
根据这种方法,我会选择红色。
然而,我不确定这是否是最好的,甚至是特别有效的,所以我们想知道是否有更准确的东西。将更好地扩展到增加的颜色托盘。
更新此处链接的缩减答案无济于事,因为它可以全面减少所有内容。我需要能够将各种颜色链接到几个特定选项。
答案 0 :(得分:4)
我认为你应该代表并比较不同颜色空间的颜色。我建议代表人类色彩感知的空间。因此L * a * b颜色空间将是最好的。
https://en.wikipedia.org/wiki/Lab_color_space/
该坐标空间中的颜色距离由 delta e 值表示。您可以在下面找到 delta e 的不同标准:
https://en.wikipedia.org/wiki/Color_difference#CIELAB_Delta_E.2A/
要更改色彩空间,您必须使用cv::cvtColor()
方法。单个像素的颜色转换如下所述:
https://stackoverflow.com/a/35737319/8682088/
在计算L * a * b空间中的像素坐标后,您可以轻松计算 delta e 并将颜色与任何参考进行比较,并选择具有最小误差的颜色。