«Расстояние» между цветами в PHP

Я рекомендую использовать https://www.npmjs.com/package/fluent-ffmpeg для вызова ffmpeg из Node.js

13
задан Jon Seigel 4 April 2010 в 18:07
поделиться

5 ответов

Каждый цвет представлен в виде кортежа в HEX-коде. Чтобы определить близкие совпадения, вам нужно вычесть каждый компонент RGB отдельно.

Пример:

Color 1: #112233 
Color 2: #122334
Color 3: #000000

Difference between color1 and color2: R=1,  G=1   B=1  = 0x3 
Difference between color3 and color1: R=11, G=22, B=33 = 0x66

So color 1 and color 2 are closer than
1 and 3.

edit

Итак, вам нужен ближайший именованный цвет? Создайте массив с шестнадцатеричными значениями каждого цвета, повторите его и верните имя. Примерно так:

function getColor($rgb)
{
    // these are not the actual rgb values
    $colors = array(BLUE =>0xFFEEBB, RED => 0x103ABD, GREEN => 0x123456);

    $largestDiff = 0;
    $closestColor = "";
    foreach ($colors as $name => $rgbColor)
    {
        if (colorDiff($rgbColor,$rgb) > $largestDiff)
        {
            $largestDiff = colorDiff($rgbColor,$rgb);
            $closestColor = $name;
        }

    }
    return $closestColor;

}

function colorDiff($rgb1,$rgb2)
{
    // do the math on each tuple
    // could use bitwise operates more efficiently but just do strings for now.
    $red1   = hexdec(substr($rgb1,0,2));
    $green1 = hexdec(substr($rgb1,2,2));
    $blue1  = hexdec(substr($rgb1,4,2));

    $red2   = hexdec(substr($rgb2,0,2));
    $green2 = hexdec(substr($rgb2,2,2));
    $blue2  = hexdec(substr($rgb2,4,2));

    return abs($red1 - $red2) + abs($green1 - $green2) + abs($blue1 - $blue2) ;

}
19
ответ дан 1 December 2019 в 17:51
поделиться

Вот статья на тему , которая должна дать хороший ответ.

Я думал, что сначала было бы неплохо преобразовать в HSL / HSV, но потом я понял, что при экстремальных значениях S & L / V H не имеет значения, а в середине имеет наибольшее значение.

Я думаю, если вам нужно простое решение, разумнее будет оставаться в пространстве RGB. Я бы использовал декартово расстояние. Если вы рассматриваете цвет RGB против Ri Gi Bi для нескольких i , вам нужен i , который минимизирует

(R - Ri)^2 + (G - Gi)^2 + (B - Bi)^2
13
ответ дан 1 December 2019 в 17:51
поделиться

Сначала вы должны выбрать соответствующее цветовое пространство, в котором вы хотите проводить сравнения цветов (RGB, HSV, HSL, CMYK и т. Д.).

Предполагая, что вы хотите знать, насколько близко две точки в трехмерном пространстве RGB расположены друг относительно друга, вы можете вычислить расстояние между ними по Пифагору, то есть

d2 = (r1 - r2)**2 + (g1 - g2)**2 + (b1 - b2)**2;

Это фактически дает вам квадрат расстояния. (В извлечении квадратного корня нет необходимости, если вы сравниваете только квадраты значений.)

Это предполагает, что вы хотите одинаково обрабатывать значения R, G и B. Если вы предпочитаете взвешивать отдельные цветовые компоненты, например, что происходит при преобразовании RGB в оттенки серого, вы должны добавить коэффициент к каждому члену расстояния, то есть

d2 = 30*(r1-r2)**2 + 59*(g1-g2)**2 + 11*(b1-b2)**2;

Это предполагает популярное преобразование из RGB в градации серого 30% красный + 59% зеленый + 11% синий.

Обновление

Последнее уравнение, вероятно, должно быть

d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2;
8
ответ дан 1 December 2019 в 17:51
поделиться

Очень простой подход - вычислить суммарное расстояние между тремя измерениями. Например, simple_distance («12,10,255», «10,10,250») = 7

Более сложный подход состоит в том, чтобы взять квадрат расстояний для каждого компонента и просуммировать их - в этом случае компоненты, расположенные слишком далеко, будут: наказано "more: square_distance (" 12,10,255 "," 10,10,250 ") = 2 * 2 + 0 * 0 + 5 * 5 = 29.

Конечно, вам придется перебирать список цветов и находить ближайший.

4
ответ дан 1 December 2019 в 17:51
поделиться

вы можете преобразовать значение RGB в HSL или HSV. тогда цвета легко сравнивать: сначала отсортируйте цвета по оттенку, затем по насыщенности, а затем по яркости. в результирующем порядке 2 цвета рядом друг с другом будут казаться очень близкими по восприятию.

будьте осторожны, чтобы оттенок обтекал: для оттенка от 0 до 255, оттенок 0 и оттенок 255 очень близки.

см. Статью в Википедии о HSL http://en.wikipedia.org/wiki/HSL_and_HSV , чтобы узнать о формуле, которая позволит вам преобразовать RGB в HSL

(обратите внимание, что другие цветовые пространства, как Lab, может дать лучшие результаты, но преобразование более сложное)

давайте определим это математически:

distance(A(h,s,l), B(h,s,l)) = (A(h)-B(h)) * F^2 + (A(s)-B(s)) * F + (A(l)-B(l))

где F - тщательно выбранный коэффициент (что-то вроде 256 ...)

приведенная выше формула не учитывает учитывать оттенок, охватывающий ...

1
ответ дан 1 December 2019 в 17:51
поделиться
Другие вопросы по тегам:

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