找到最佳颜色匹配 - 如果没有可用的颜色阴影则拒绝

时间:2016-07-26 21:00:04

标签: c++ qt colors

有没有办法将十六进制代码给出的颜色识别为某种颜色的阴影? 我想我找到了一种方法,不确定准确度如何 - 但我如何判断我发现的颜色匹配不够好

我需要能够识别特定颜色的颜色匹配 - 固定集(红色,黄色,橙色,蓝色,绿色,棕色,紫色,灰色,黑色,白色)。

目前我正在根据距离进行颜色匹配:

从上面的固定颜色列表中给出一个颜色c(我使用十六进制颜色设置,希望在该颜色的范围中间,我不太清楚如何获得 - 现在我我使用的颜色看起来很好"),以及可用的颜色列表list,我尝试从列表中找到最接近颜色的索引。

int matchColor(QColor c, QList<QColor> list)
{
    int bestIndex = 0;
    int distance;
    int bestMatch = 0;
    int sz = list.size() - 1;

    for (int i = 0; i <= sz; ++i)
    {
        int Rdiff = 255 - qAbs(c.red() - list.at(i).red());
        int Gdiff = 255 - qAbs(c.green() - list.at(i).green());
        int Bdiff = 255 - qAbs(c.blue() - list.at(i).blue());
        distance = Rdiff + Gdiff + Bdiff;

        if (distance > bestMatch)
        {
            bestMatch = distance;
            bestIndex = i;
        }
    }

    // if(bestMatch < 600 ? or something ?) return -1;

    return bestIndex;
}

问题是,因为这个匹配应该严格执行(对于某些标准),我必须返回特定颜色c失败的阴影,如果我能&#39;吨。
我不是100%肯定颜色匹配是好的 - 尽管看起来还不错。

但除了找到最佳的颜色匹配 - 什么是合理的距离值,我应该拒绝匹配? (期望distance介于0到765之间,其中765是完美匹配 我可以查看某些范围吗?

每种颜色的范围会不同吗?

注意 - 我发现了一些类似的问题,有些问题引用了我无法理解的更复杂的算法 - 但我没有看到任何可以告诉我如何拒绝匹配的内容......如果有的话,我会感激更好的解决方案。< / p>

2 个答案:

答案 0 :(得分:6)

基本上不可能告诉您哪些容差对于您的用例是可接受的,但我强烈建议在尝试匹配颜色之前转换为HSV。 H分量是关键的,并且应该具有不超过20或30度的公差。 S和V远没那么重要;你或许可以忽略它们,或者只过滤出色调完全消失的极端情况。

此处描述了转化:Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both

答案 1 :(得分:4)

测量色差的最标准方法是称为Delta E. Delta E是根据2 Lab值计算的,其中Lab是描述颜色的标准方法。

DeltaE=sqrt(pow(L1-L2,2)+pow(a1-a2,2)+pow(b1-b2,2))

有三个Lab值,L,a和b。 L是发光度的量度。 a和b确定色调和饱和度。将a和b视为向量。长度是颜色饱和度,角度是色调。

选择产生最小Delta E的颜色。有一个稍好的版本称为DeltaE2000,可以改善小色差的匹配,但数学更复杂,DeltaE足以满足大多数用途。

请参阅此处将sRGB值转换为Lab。

RGB to CIE LAB