有没有一种方法可以比较两个颜色彼此之间的相似度? 如果说它们两个都是蓝色的话。
目前我们比较它们的方式是手动将每个可能的颜色分配到一个颜色家族(红色,绿色,蓝色...)。 然后只需比较字符串 :)
但肯定可以将这个手动任务分配给一个整洁小巧的算法。
有没有一种方法可以比较两个颜色彼此之间的相似度? 如果说它们两个都是蓝色的话。
目前我们比较它们的方式是手动将每个可能的颜色分配到一个颜色家族(红色,绿色,蓝色...)。 然后只需比较字符串 :)
但肯定可以将这个手动任务分配给一个整洁小巧的算法。
你可能希望将颜色转换为HSL模型(色相、饱和度、亮度),然后按照HSL顺序在阈值内比较值。如果色相在被认为“接近”的容差范围内,则检查饱和度和亮度的“接近程度”。
Delta-E(差异度)是一个代表两种颜色之间视觉“距离”的单一数字,数字越低,颜色对于人眼来说越相似。
有几种不同的计算方法…其中最流行的是CIE76(又称CIE 1976或dE76)。
每个方法使用不同的方式计算,但大多数都要求您将颜色转换为比RGB更好的(用于比较的)颜色模型。
对于CIE76,您基本上只需要将您的颜色转换为LAB颜色空间,然后计算它们之间的三维距离即可。
Wikipedia中有所有的公式:http://en.wikipedia.org/wiki/Color_difference
您可以使用在线颜色计算器检查您的工作:
我不确定有哪些算法,你可以考虑将RGB(红色、绿色、蓝色)值转换为HSB(色调、饱和度、亮度)。
色调本质上是“颜色”,因此您可以简单地比较色调值的接近程度。
//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类型的值。这个值越低,颜色就越相似。
希望这能帮到有需要的人。