【问题标题】:OpenCV Python what's an appropriate map from a full color space to a reduced color palette?OpenCV Python 什么是从完整色彩空间到缩小调色板的合适映射?
【发布时间】:2020-02-19 22:15:28
【问题描述】:

假设我们有一组先前已知的 n 个颜色 C。我们得到一个颜色列表 l。

目标是对于每种颜色 l,将其与 C 中的颜色相匹配,使其最小化距离函数 D。

最直接的方法是使用欧几里得距离,但这不是一个好主意,因为以下示例:

假设输入颜色是 (0.1, 0, 0) 所以非常深的红色。假设棕色(0,5,0.5,0)和纯红色(1,0,0)都在C中。

欧式距离给出:

  • 到棕色的距离 = (0.4^2 + 0.5^2) = 0.41

  • 到红色的距离 = (0.9^2) = 0.81

因此,深红色被映射为棕色而不是红色,这在视觉上并没有什么意义。

我们可以试试切比雪夫距离:

  • 到棕色的距离 = max(0.4, 0.5, 0) = 0.5

  • 到红色的距离 = max(0.9, 0, 0) = 0.9

或者曼哈顿距离:

到棕色的距离 = max(0.4 + 0.5) = 0.9

到红色的距离 = max(0.9 + 0 + 0) = 0.9

第一个仍然选择棕色而不是红色,第二个选择两者作为同样有效的选择。虽然有所改进,但并不理想。

但是我不确定如何测量“视觉距离”,即如果一种颜色对人类来说“看起来是绿色”,例如如何将所述颜色映射到绿色。

我正在使用opencv,我已经搜索了文档,但我似乎没有找到这个问题是否已经解决。

【问题讨论】:

标签: python algorithm math colors computer-vision


【解决方案1】:

欢迎来到色彩的世界!如果您使用 RGB,则上述距离度量不太可能起作用,因为 RGB 不是感知上统一的颜色空间(颜色空间中向量之间的距离与人类感知的变化不相似)。 CIELAB 色彩空间据说是一种感知统一的。

一个流行的颜色距离度量标准是CIELAB \deltaE*

colormath 包中提供了这些距离指标。

来自文档:

from colormath.color_objects import LabColor
from colormath.color_diff import delta_e_cie1976

# Reference color.
color1 = LabColor(lab_l=0.9, lab_a=16.3, lab_b=-2.22)
# Color to be compared to the reference.
color2 = LabColor(lab_l=0.7, lab_a=14.2, lab_b=-1.80)
# This is your delta E value as a float.
delta_e = delta_e_cie1976(color1, color2)

在您的问题中,如果您已知的一组颜色 (C) 的大小很小(比如 10 个),那么即使是 delta_E 也可能无法按预期工作。更可靠的方法是收集一个新的集合S,在C 中每种颜色都有很多阴影(您可以使用Color Dictionaries)并将l 中的每种颜色映射到S 中的壁橱然后到C。您可以通过预先计算距离指标来使用 kd-tree 等数据结构来加快搜索速度。

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 2010-09-26
    • 2016-12-03
    • 2013-01-02
    • 2018-08-19
    • 2016-06-04
    • 2018-01-17
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多