Есть ли способ сравнить, насколько близки два цвета друг к другу? Если сказать, что оба они синие.
В настоящий момент мы сравниваем их с тем, чтобы вручную назначить каждый возможный цвет семейству цветов (красный, зеленый, синий...). А потом просто сравните строки:)
Но, безусловно, эта ручная задача может быть привязана к аккуратным небольшим алгоритмам.
Есть ли простой способ сравнить, насколько близки два цвета друг к другу?
Ответ 1
Delta-e - это единственное число, которое представляет воспринимаемое расстояние между двумя цветами. Чем меньше число, тем больше похожи цвета на человеческий глаз.
Есть несколько различных способов его расчета... CIE76 (aka CIE 1976 или dE76) является самым популярным.
Каждый идет о вещах по-другому, но по большей части все они требуют, чтобы вы преобразовали в лучшую (для сравнения) цветовую модель, чем RGB.
Для CIE76 вы в основном просто конвертируете свои цвета в цветовое пространство LAB, а затем вычисляете трехмерное расстояние между ними.
В Википедии есть все формулы: http://en.wikipedia.org/wiki/Color_difference
Вы можете проверить свою работу с онлайн-калькуляторами цветов:
Ответ 2
Вероятно, вы хотите преобразовать цвета в модель HSL (Hue, Saturation, Lightness), а затем сравнить значения в пределах пороговых значений в порядке HSL. Если оттенок находится в пределах допуска, считающегося "закрытым", тогда проверьте "близость" насыщенности, а затем легкость.
Ответ 3
Я не уверен в каких-либо алгоритмах, вы можете подумать о преобразовании значений RGB (красный, зеленый, синий) в HSB (оттенок, насыщенность, яркость).
Оттенок по существу "цвет", поэтому вы можете просто сравнить, насколько близки значения оттенков.
Ответ 4
Я знаю, что этому вопросу 10 лет, но он расширяет ответ джо Зака:
Вот мой код Котлин
//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. чем ниже это значение, тем более похожи цвета.
Надеюсь, это поможет кому-то