有没有一种简单的方法来比较两种颜色彼此的接近程度

时间:2009-01-29 15:59:31

标签: image-processing comparison colors

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

4 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:9)

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

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

请参阅http://en.wikipedia.org/wiki/HSV_color_space

答案 2 :(得分:9)

Delta-e是一个单独的数字,表示两种颜色之间的感知“距离”。数字越低,人眼的颜色越相似。

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

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

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

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

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

答案 3 :(得分:1)

我知道这个问题已有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值。该值越低,颜色越相似。

希望这对某人有帮助