c++ - 量化两种颜色之间相似性的方法?

标签 c++ colors

这个问题可能更多的是和人的心理有关

我正在尝试制作一个程序,使用有限的调色板重新创建位图图像。我天真地认为我可以简单地找到红/绿/蓝值的平方差,并用它来量化颜色之间的平方差。然而在实践中,这似乎不太奏效,红色阴影与紫色阴影等相匹配。

有人对我可以使用的替代比较方法有任何建议吗?

int squaredDistance(colour a, colour b)
{
    return (a.r - b.r)*(a.r - b.r) + (a.g - b.g)*(a.g - b.g) + (a.b - b.b)*(a.r - b.b);
}

int findClosestColour(colour a) //Returns id of colour that most closely matches
{
    int smallestColourDistance = 195075;
    int colourId = -1;
    for(int i=0; i<NUMOFCOLOURS; i++)
    {
        if( squaredDistance(a, coloursById[i]) < smallestColourDistance)
        {
            smallestColourDistance = squaredDistance(a, coloursById[i]);
            colourId = i;
            if(smallestColourDistance == 0)
                break;
        }
    }
    return colourId;
}

最佳答案

这叫做 colour difference在色彩科学中,有多种算法可以计算它,这里是其中的一些:

  • Delta E CIE 1976
  • Delta E CIE 1994
  • Delta E CIE 2000
  • Delta E CMC

Bruce Lindbloom 有一个 calculatorColour提供矢量化的 Python implementation .在能够使用任何 Delta E 实现之前,您必须将 RGB 值转换为 CIE Lab

还有可用的colour difference 之上实现的计算 CIECAM02 颜色外观模型,尤其是 CIECAM02 底层颜色空间的更统一版本的 CAM02-UCS 颜色空间。

关于c++ - 量化两种颜色之间相似性的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31879087/

相关文章:

c++ - C++ 中 mt19937 的平台依赖状态?

c++ - 快速找到不开心号码的方法

C++ 通过引用传递变量(SFML 窗口)

Java for循环迭代并列出颜色

java - 是否可以更改 JOptionPane.showMessageDialog() 中的字符串颜色

c++ - 无法通过串行重复写入字符串

c++ - 为什么在复制 rapidjson::Document 时出现链接器错误而不是编译错误?

javascript - 重现色彩效果

德尔福编辑器。光标样式

html - 随机颜色 CSS - 防止使用两次