【发布时间】:2013-06-18 17:53:23
【问题描述】:
我尝试根据给定的十六进制值获取最匹配的颜色名称。例如,如果我们有十六进制颜色#f00,我们必须得到颜色名称red。
'#ff0000' => 'red'
'#000000' => 'black'
'#ffff00' => 'yellow'
我目前使用 levenshtein-distance 算法来获取最接近的颜色名称,目前效果很好,但有时不如预期。
例如:
'#0769ad' => 'chocolate'
'#00aaee' => 'mediumspringgreen'
那么有什么想法可以让结果更接近吗?
这是我为获得最接近的颜色所做的:
Array.closest = (function () {
// http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript
function levDist(s, t) {
if (!s.length) return t.length;
if (!t.length) return s.length;
return Math.min(
levDist(s.substring(1), t) + 1,
levDist(t.substring(1), s) + 1,
levDist(s.substring(1), t.substring(1)) + (s[0] !== t[0] ? 1 : 0)
);
}
return function (arr, str) {
// http://stackoverflow.com/q/11919065/1250044#comment16113902_11919065
return arr.sort(function (a, b) {
return levDist(a, str) - levDist(b, str);
});
};
}());
http://jsfiddle.net/ARTsinn/JUZVd/2/
另一件事是性能!似乎有一个非常大的问题使得这非常慢(是算法吗?)。
【问题讨论】:
-
对于更相似的颜色,最好使用HSL颜色。
-
如果您在排序前预先计算距离,您可以使排序步骤加快 很多。
-
我也不确定你为什么不使用简单的笛卡尔距离计算。 (实际上我想我会转换为角坐标空间并在 HSL 或 HSV 燕鸥中计算距离。)
-
我将通过平均每个 R、G 和 B 通道上两种颜色的差异来计算两种颜色的差异。 ex (3,4,5) 和 (10,14,18) 的平均差异为 10。
-
我敢打赌,您会发现您有一些问题颜色,您可以将其排除在列表之外。我不知道您的问题域,但也许少即是多。如果我提出一种绿色,而你称它为薄荷绿、浅绿或春绿,那可能并不重要。
标签: javascript performance colors levenshtein-distance