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

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

26
задан martineau 22 September 2019 в 19:23
поделиться

3 ответа

Вы, вероятно, хотите преобразовать цвета в модель HSL (Оттенок, Насыщенность, Легкость) и затем сравнить значения в порогах в порядке HSL. Если оттенок в рамках допуска, который считают как "близко", то проверьте "близость" насыщенности и затем легкость.

21
ответ дан Jeff Yates 28 November 2019 в 07:25
поделиться

Я не уверен ни в каких алгоритмах, можно хотеть считать преобразование RGB (Красный, Зеленый, Синий) значения в к HSB (Оттенок, Насыщенность, Яркость).

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

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

9
ответ дан nicholaides 28 November 2019 в 07:25
поделиться

Я знаю, что этому вопросу 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, возвратит Двойное значение. чем ниже это значение, тем более подобны цвета.

Hope это помогает кому-то

1
ответ дан 28 November 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: