有没有办法将十六进制代码给出的颜色识别为某种颜色的阴影? 我想我找到了一种方法,不确定准确度如何 - 但我如何判断我发现的颜色匹配不够好?
我需要能够识别特定颜色的颜色匹配 - 固定集(红色,黄色,橙色,蓝色,绿色,棕色,紫色,灰色,黑色,白色)。
目前我正在根据距离进行颜色匹配:
从上面的固定颜色列表中给出一个颜色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>
答案 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。