【问题标题】:Is there an easy way to compare how close two colors are to each other?有没有一种简单的方法可以比较两种颜色彼此的接近程度?
【发布时间】:2010-10-04 06:44:44
【问题描述】:

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

【问题讨论】:

  • 我们这些色盲的人,可能不同意什么颜色接近或不同......

标签: image-processing comparison colors


【解决方案1】:

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

【讨论】:

  • 我认为这是一个比大卫更好的答案,因为在不知道其他情况下,我猜用 OP 会发现基于 HSL 的比较比基于 RGB 的比较有用。
  • @Adam Bellaire,你能解释一下为什么会这样吗?我自己也不太清楚 RGB 和 HSL 的区别
  • +1。 HSL 可以很容易地从/到 RGB 转换:130.113.54.154/~monger/hsl-rgb.html
  • @matt:请参阅我对大卫回答的评论。基本上,我认为人们在比较颜色时自然会认为色调比饱和度或亮度更重要。 RGB 在表示中混合了这些属性,因此很难在数字上进行比较。 HSL 将它们分开,使其更容易。
  • 好主意;但是您需要处理一些极端情况,例如,如果饱和度非常低,则色调并不重要。如果亮度非常低,饱和度可能就没那么重要了。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 那么其他维度呢?从人类的角度来看,在 H 值相同的情况下,两种颜色可能完全不同(例如红色和粉红色)。
    【解决方案4】:

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

    希望这对某人有所帮助

    【讨论】:

    • 不错!我也喜欢 Kotlin - 你已经开始了一个不错的库:)
    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2012-02-10
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多