Подтвердить что ты не робот

Есть ли простой способ сравнить, насколько близки два цвета друг к другу?

Есть ли способ сравнить, насколько близки два цвета друг к другу? Если сказать, что оба они синие.
В настоящий момент мы сравниваем их с тем, чтобы вручную назначить каждый возможный цвет семейству цветов (красный, зеленый, синий...). А потом просто сравните строки:)
Но, безусловно, эта ручная задача может быть привязана к аккуратным небольшим алгоритмам.

4b9b3361

Ответ 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 (оттенок, насыщенность, яркость).

Оттенок по существу "цвет", поэтому вы можете просто сравнить, насколько близки значения оттенков.

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

Ответ 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. чем ниже это значение, тем более похожи цвета.

Надеюсь, это поможет кому-то