有没有办法识别由十六进制代码给出的颜色作为某种颜色的阴影?
我想我找到了一种方法,不确定准确度如何 - 但我如何判断我发现的颜色是否不够好?
我需要能够识别特定颜色的颜色匹配 - 固定集(红色,黄色,橙色,蓝色,绿色,棕色,紫色,灰色,黑色,白色).
目前我正在根据距离进行颜色匹配:
鉴于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;
}
Run Code Online (Sandbox Code Playgroud)
问题是,因为这个匹配应该严格执行(对于某些标准),我必须返回特定颜色的阴影,如果我不能c,则失败.
我不是100%肯定颜色匹配是好的 - 虽然看起来相当不错.
但除了找到最佳的颜色匹配 - 什么是合理的距离值,我应该拒绝匹配?(期待distance0到765之间,765完美匹配).
我可以检查某些范围吗?
每种颜色的范围会不同吗?
注意 - 我发现了一些类似的问题,有些人提到了我无法理解的更复杂的算法 - 但是我没有看到任何可以告诉我如何拒绝匹配的内容......如果有的话,我会感激更好的解决方案.
基本上不可能告诉您哪些容差对于您的用例是可接受的,但我强烈建议在尝试匹配颜色之前转换为HSV.H分量是关键的,并且应该具有不超过20或30度的公差.S和V远没那么重要; 您可能要么忽略它们,要么只过滤掉色调完全消失的极端情况.
此处描述了转换:将RGB转换为HSV和HSV转换为RGB的算法,范围为0-255