25

有没有办法比较两种颜色彼此的接近程度?如果说他们两个都是蓝色的。
目前我们比较它们的方式是手动将每种可能的颜色分配给一个颜色系列(红色、绿色、蓝色......)。然后只比较字符串 :)
但可以肯定的是,手动任务可以分配给一个简洁的小算法。

4

4 回答 4

21

您可能希望将颜色转换为 HSL 模型(色相、饱和度、亮度),然后按 HSL 顺序比较阈值内的值。如果色调在被视为“接近”的容差范围内,则检查饱和度的“接近度”,然后检查亮度。

于 2009-01-29T16:03:31.807 回答
9

我不确定任何算法,您可能需要考虑将 RGB(红色、绿色、蓝色)值转换为 HSB(色相、饱和度、亮度)。

色调本质上是“颜色”,因此您可以简单地比较色调值的接近程度。

http://en.wikipedia.org/wiki/HSV_color_space

于 2009-01-29T16:06:06.607 回答
9

Delta-e是一个数字,表示两种颜色之间的感知“距离”。数字越小,颜色越接近人眼。

有几种不同的计算方法...CIE76(又名 CIE 1976 或 dE76)是最受欢迎的。

每个人都以不同的方式处理事情,但在大多数情况下,它们都要求您转换为比 RGB 更好(用于比较)的颜色模型。

对于 CIE76,您基本上只需将颜色转换为 LAB 颜色空间,然后计算它们之间的 3 维距离。

维基百科有所有的公式:http ://en.wikipedia.org/wiki/Color_difference

您可以使用在线颜色计算器检查您的工作:

于 2013-07-20T18:18:30.943 回答
2

我知道这个问题已有 10 年历史,但扩展了 Joe Zack 的答案:

这是我的 Kotlin 代码

//Entry point here
//Color must be hexa for example "#829381"
fun calculateColorDistance(colorA: String, colorB: String): Double {
    val aColorRGBArray = getColorRGBArray(colorA)
    val bColorRGBArray = getColorRGBArray(colorB)
    val aColorLAB = getColorLab(aColorRGBArray)
    val bColorLAB = getColorLab(bColorRGBArray)
    return calculateColorDistance(aColorLAB, bColorLAB)
}

private fun calculateColorDistance(aColorLAB: DoubleArray, bColorLAB: DoubleArray): Double {
    val lab = aColorLAB[0] - bColorLAB[0]
    val aab = aColorLAB[1] - bColorLAB[1]
    val bab = aColorLAB[2] - bColorLAB[2]
    val sqrtlab = lab.pow(2)
    val sqrtaab = aab.pow(2)
    val sqrtbab = bab.pow(2)

    val sum = sqrtlab + sqrtaab + sqrtbab
    return sqrt(sum)
}

private fun getColorRGBArray(color: String): IntArray {
    val cleanColor = color.replace("#", "")
    val colorInt = Integer.parseInt(cleanColor, 16)
    val r = Color.red(colorInt)
    val g = Color.green(colorInt)
    val b = Color.blue(colorInt)
    return intArrayOf(r, g, b)
}

private fun getColorLab(colorRGB: IntArray): DoubleArray {
    val outLab = doubleArrayOf(0.0,0.0,0.0)
    ColorUtils.RGBToLAB(colorRGB[0], colorRGB[1], colorRGB[2], outLab)
    return outLab
}

calculateColorDistance将返回一个 Double 值。该值越低,颜色越相似。

希望这可以帮助某人

于 2019-09-11T16:56:05.577 回答