Алгоритм модифікації кольору, щоб зробити його менш схожим, ніж фон


23

Я створюю демонстрацію з 20 кульок, підстрибуючи один одного, з фоном, наповненим суцільним кольором. Колір для кожної кульки вибирається випадковим чиномrandint(0, 255) для кожного компонента R, G, B кортежу.

Проблема полягає в тому, що деякі кульки закінчуються кольором, який дуже схожий на фон, що робить їх важкими. Я хотів би цього уникнути, або перекинувши інший колір, якщо обраний занадто схожий (у межах заданого порогу), або перемістивши його від кольору фону.

Як обчислити індекс подібності, який слід використовувати як поріг? Або як перетворити колір, щоб зробити його, скажімо, менш блакитним ?

Явна відмова від відповідальності: я нічого не знаю про теорію кольорів, тому не знаю, чи існують вищезазначені поняття!

Я кодую в python, але шукаю концепції та стратегії, тому псевдо-код добре (або просто теорія).

Редагувати:

Для уточнення кількох моментів:

  • Кожна куля має свій випадковий колір. Я хотів би, щоб вони залишалися якомога випадковішими та досліджували якнайбільше кольорового простору (будь то RGB або HSV, pygameприймаючи обидва формати для визначення кольору)

  • Я просто хотів би уникати того, щоб кожен колір був "занадто близьким" до фону. Проблема полягає не лише у відтінку: я цілком гаразд зі світло-блакитною кулькою на темно-синьому тлі (або «повністю-синій» на тлі «біло-іш» синього тощо)

  • Поки що мені байдуже, чи куля закінчується кольором, схожим (або навіть ідентичним) іншому. Уникнення цього - бонус, але це другорядне питання.

  • Колір фону - це постійний, єдиний колір RGB. Наразі я використовую "базовий" синій колір (0, 0, 255), але я з цим не змирився. Тому вважайте фон довільним кольором (з довільним відтінком, яскравістю, насиченістю тощо).

EDIT2:

Версія TL, DR: Просто дайте спосіб створити X випадкових кольорів, щоб жодне "не затухало" на тлі довільного (але єдиного та постійного) кольору



1
Чому б просто не поставити контур навколо кожного кулі?
ashes999

1
Тоді може виникнути проблема з тим, щоб зробити контурний колір, відмінний від кольору фона та кулі;)
Кромстер каже, що підтримує Моніку

1
@AlexM: важко повірити, що не існує простого рішення "генерувати випадкові кольори, уникаючи довільного"
MestreLion

1
@MestreLion просто використовуйте чорний колір для контуру та генеруйте кольори із мінімальним значенням RGB 128. Це так просто.
ashes999

Відповіді:


33

Можна використовувати той факт, що кольори складають (тривимірний) кольоровий простір і обчислюють відстань у цьому кольоровому просторі. Потім потрібно визначити показник у цьому кольоровому просторі, щоб знайти відстань між двома кольорами.

Наприклад, відстань в евклідовому просторі між двома точками x = (x1, x2, x3) і y = (y1, y2, y3) задається d (x, y) = sqrt ((y1-x1) * (y1- x1) + (y2-x2) * (y2-x2) + (y3-x3) * (y3-x3)).

Тепер ви можете обчислити відстань між кольором кульки та кольором тла, і якщо він занадто малий, створіть новий випадковий колір і повторіть тест.

Ви побачите, що ні RGB, ні навіть HSV не є хорошими кольоровими просторами для цього завдання. Стаття у вікіпедії про різницю кольорів використовує кольоровий простір L a b і дає кілька можливих показників.

Існує також дискусія щодо stackoverflow по темі.


Це дуже приємний підхід, я міг би це зробити :) Дякую! Також слід подбати про те, щоб трохи розібратися, як знайти адекватний поріг "мінімальної відстані"? Якщо RGB не є адекватним, як перетворити на L a b? Я не прагну до точних метрик сприйняття, тому будь-які «досить добрі» типові параметри будуть робити.
MestreLion

1
Любіть цю відповідь, добре продуману, добре пояснення, як виконати завдання, надаючи необхідні рівняння та посилання. Гарна перша відповідь.
Том 'Блакитний' Піддок

1
Якщо ви шукаєте "достатньо хорошого" наближення людського сприйняття, ви можете заглянути в кольоровий простір YUV , який має пряме перетворення з RGB.
трм

5
Економте трохи часу і не приймайте квадратний корінь (дорого). Просто зробіть мінімальне значення відстані кольорів, яке ви порівнюєте з квадратом.
Кріс Кадмор

1
@MestreLion Колірний простір L a b * був винайдений для сприйняття рівномірно, що означає, що сприйнята відстань між двома кольорами є такою ж, як і фактична відстань у кольоровому просторі. Оскільки кольори RGB залежать від пристрою, ви не можете безпосередньо конвертувати між лабораторією та RGB. Однак якщо ви використовуєте певний абсолютний колірний простір RGB, ви можете їх перетворити. Дивіться цю статтю: en.wikipedia.org/wiki/SRGB_color_space та цю статтю: en.wikipedia.org/wiki/Lab_color_space
jwir3

8

Сторінка стандартів Організації Об'єднаних Націй для веб-доступності ( http://www.un.org/webaccessibility/1_visual/13_colourcontrast.shtml ) вказує на стандарт забезпечення належного тексту контрастності на веб-сайтах, маючи на увазі, що деякі користувачі мають кольорові сліди. Це може бути особливо важливо для вас, оскільки деякі ваші користувачі можуть бути і кольоровими сліпами (було б важко сказати червону кулю із зеленого фону, якщо вони мають однакову яскравість).

Сторінка ООН вказує на аналізатор контрастності кольорових коефіцієнтів освітленості Juicy Studios за адресою ( http://juicystudio.com/services/luminositycontrastratio.php#specify ), який констатує, що текст на фоні повинен мати співвідношення контрастності 4,5: 1, за винятком того, що я вважаєте, що це схоже на ваш випадок:

  • Великий текст: Масштабний текст і зображення великомасштабного тексту мають коефіцієнт контрасту принаймні 3: 1

Тепер яке співвідношення контрастності? Після подальшого гіперпосилання (це весело!) Ми переходимо до сторінки W3, яка визначає коефіцієнт контрасту як:

Contrast Ratio = (L1 + 0.05)/(L2 + 0.05)

Де L1 і L2 - відносна яскравість кольорів. L1 - більш світлий колір, L2 - менше світлий колір. Знову ми переходимо за посиланням на ту саму сторінку W3, яка вказує:

L = 0.2126 * R + 0.7152 * G + 0.0722 * B where R, G and B are defined as:

if RsRGB <= 0.03928 then R = RsRGB/12.92 else R = ((RsRGB+0.055)/1.055) ^ 2.4
if GsRGB <= 0.03928 then G = GsRGB/12.92 else G = ((GsRGB+0.055)/1.055) ^ 2.4
if BsRGB <= 0.03928 then B = BsRGB/12.92 else B = ((BsRGB+0.055)/1.055) ^ 2.4
and RsRGB, GsRGB, and BsRGB are defined as:

RsRGB = R8bit/255
GsRGB = G8bit/255
BsRGB = B8bit/255

ПРИМІТКА : Символ каретки ^ вище відноситься до експоненції (x²)

У нас є досить гарна рамка для алгоритму контрастності (це дружно з кольоровими слідами!)

  • Визначте значення R, G, B для кожного кольору
  • Визначте яскравість для кожного кольору
  • Якщо коефіцієнт контрастності більш світлого кольору до найменшого кольору світла менше 3, перейдіть!

2
Можна зауважити, що ^ передбачається експоненцією. Для нас божевільних користувачів, схожих на C, це означає xor (я щиро думав, що ви намагаєтесь виконати побітну операцію над значеннями з плаваючою комою протягом хвилини).
Фарап

Це дивовижний підхід, мені це подобається! :)
MestreLion

І не хвилюйтеся ^, я б ніколи не замислювався над побітним XOR в цьому контексті. (або в будь-якому насправді. C'mon C phreaks ^- це фактичний символ для експоненції в псевдокодах (хоча дуже мало мов насправді використовують його ... у python це** )
MestreLion

1
Просто фіксація помилок друку. Плюс, якщо одна людина має проблеми з ^, шанси на те, що хтось ще може, Не завадить бути конкретним.
Джон

1
@John Не хвилюйтесь,. Я не впевнений, звідки випливає плутанина (тобто, з якої мови спочатку використовується ^). Я знаю, що ^ іноді використовується для експоненціації через мій досвід роботи з VB (я не знаю жодної іншої мови, яка використовує це як експоненцію, але, мабуть, є деякі). Так само як голова вгору, це символ карети , а не символ моркви . Можливо, хочете змінити це, перш ніж хтось зробить якогось бога жахливим жартом про програмування з овочами (зокрема, той, що стосується квадратних коренів).
Фарап

2

Використання RGB-значень, генеруючи випадкове 0-255значення для кожного компонента, може створювати не тільки кольори, подібні до фону, але також можна отримати дуже схожі кольори для кульок.

Я, мабуть, вибрав би менш випадковий підхід і створив кольори, які гарантовано будуть різними. Ви можете створити колір для кожного ~ 32 градуса в діапазоні відтінків і чергувати яскравість або насиченість (використовуйте кольорову модель HSV замість RGB).

Тож щось подібне:

numColors = 20;
stepSize = 360 / (numColors / 2 + 1); // hue step size
for(i = 0; i < numColors; i++){
    color = HSV(i / 2 * stepSize, 0.5 + (i % 2) * 0.5, 1.0) 
}

який створить 20 кольорів, добре розподілених. Це передбачає, що ви використовуєте математику з цілим числом, i = 0і i = 1створить те саме значення відтінку.

Звичайно, це не надто масштабується. Якщо у вас є 100 значень кольорів для створення, інтервал відтінку може бути недостатньо, і ви знову виявите подібні кольори. У цьому випадку ви також можете змінити значення V(яскравість).

Я не знаю, як виглядає ваш колір фону, але HSV полегшує порівняння кольорів (просто порівняйте 3 компоненти і не забувайте, що HUE круговий (0 == 360)).

ОНОВЛЕННЯ:

Оскільки я насправді не відповів на ваше запитання, але запропонував інший підхід, ось як може виглядати алгоритм довільного тла та абсолютно випадкових кольорових кульок (це підхід грубої сили, але він повинен добре працювати у вашому випадку використання):

// background color, currently equals RGB(0, 0, 255)
bg = HSV(240, 1.0, 1.0)

// number of colors to create is equal to the amount of balls
numColors = balls.length

// set threshold to compare colors. you can tweak this to your liking
threshold = 0.15

for(i = 0; i < numColors; i++){
    do {
        // assuming rnd returns a random float 0-1 inclusive
        color = HSV(rnd() * 360, rnd(), rnd())
        // calculate delta values, normalize hue to 0-1
        dH = (180 - abs(abs(bg.h - color.h) - 180)) / 360
        dS = bg.s - color.s
        dV = bg.v - color.v
        // "distance" between bg and color
        difference = sqrt(dH * dH + dS * dS + dV * dV)
    } while(difference < threshold)

    ball[i].color = color
}

Щодо вашого алгоритму, як це враховувати колір фону?
MestreLion

Наразі він не враховує колір тла ... ви можете налаштувати його, порівнявши створені кольори (як описано в останньому абзаці), а потім створити колір з іншим V(оскільки поточний алгоритм цього не змінює).
bummzack

@MestreLion Додано оновлення з альтернативним алгоритмом
bummzack

Чудово, це здається приємною стратегією. Сила грубої дії нормальна, кольори генеруються лише один раз при ініціалізації, а не в циклі гри. Здається, ви використовуєте той самий підхід, що і Рене, з простою евклідовою дистанцією у ВПГ, правда? Будь-які посилання на відповідний поріг для HSV? Чи мають значення H, S та V однакові відстані, як у RGB?
MestreLion

@MestreLion Так, мій другий алгоритм - це майже те, що пояснив Рене у своїй відповіді. На жаль, для хорошого порогу немає остаточного значення, оскільки зміни кольору сприймаються не рівномірно. Ми розпізнаємо зміни в зеленому набагато швидше, ніж у синьому ... тому для зелених тонів може бути менший поріг, але він не буде достатнім для інших кольорів тощо. Наскільки я знаю, кольоровий простір лабораторії близький до сприйняття кольорів людини та можливо, найкраще підходить, якщо ви не отримаєте бажаних результатів за допомогою кольорового простору HSV.
bummzack

1

Оскільки ви згадали, що у вас є стаціонарне тло, колір кульок все ще може бути випадковим, але вони повинні випадати в певних діапазонах, які все ще компліментують фон.

Основи. Перш ніж ми це зробимо, ви повинні знати основи. Розглянемо наступні кольори:

Black   #000000 rgb(0,0,0)
Red     #FF0000 rgb(255,0,0)
Green   #00FF00 rgb(0,255,0)
Blue    #0000FF rgb(0,0,255)
Yellow  #FFFF00 rgb(255,255,0)
Cyan    #00FFFF rgb(0,255,255)
Pink    #FF00FF rgb(255,0,255)
Gray    #C0C0C0 rgb(192,192,192)
White   #FFFFFF rgb(255,255,255)

Суміш кольорів RGB [(0..255), (0..255), (0..255)] створює нові кольори, як вище.

Обчислення негативних кольорів Обчислення негативного кольору так само, як перетворення червоного в блакитний, зеленого у фіолетовий, синього в жовтий.

Red     #FF0000 rgb(255,0,0) ->     Cyan    #00FFFF rgb(0,255,255)
Green   #00FF00 rgb(0,255,0) ->     Purple   #FF00FF    rgb(255,0,255)
Blue    #0000FF rgb(0,0,255) ->     Yellow  #FFFF00 rgb(255,255,0)

Додатковий колір

Відповідно до посилань на обчислення додаткових кольорів: http://serennu.com/colour/rgbtohsl.php

Про HSL

HSL виражає кольори за їх відтінком, насиченістю та легкістю, даючи число кожному з цих трьох атрибутів кольору.

Відтінок - це колір кольору на кольоровому колесі, виражений у градусах від 0 ° до 359 °, що представляє 360 ° колеса; 0 ° - червоний, 180 ° - червоний, протилежно-кольоровий, тощо.

Насиченість - це інтенсивність кольору, наскільки він тьмяний або яскравий. Чим нижча насиченість, тим виглядає темніше (сірий) колір. Це виражається у відсотках, 100% - це повна насиченість, найяскравіша, а 0% - відсутність насичення, сіра.

Легкість - такий світлий колір. Трохи відрізняється від насичення. Чим більше білого кольору, тим вище його значення світлоти, тим більше чорного, тим менша його легкість. Так 100% легкість перетворює колір у білий, 0% легкість перетворює колір у чорний, а "чистий" колір - 50% легкість.

Простіше помітити різницю між насиченістю та легкістю, ніж пояснити це. Якщо ви хочете уточнити, спробуйте переглянути варіанти світлості та насиченості на сторінці кольорового калькулятора, вибравши досить яскравий колір як ваш початковий колір.

Отже, позначення HSL виглядає так, даючи значення відтінку, насиченості та легкості в такому порядку: t

Червоний: 0 ° 100% 50% Блідо-рожевий: 0 ° 100% 90% Блакитний: 180 ° 100% 50% Ось такі кроки:

  1. Перетворіть свій колір у HSL.

  2. Змініть значення відтінку на значення відтінку Hue (наприклад, якщо ваш відтінок становить 50 °, протилежне буде на 230 ° на колесі - на 180 ° далі).

  3. Залиште значення Насиченості та Легкості такими, якими вони були.

  4. Перетворіть це нове значення HSL назад у своє початкове позначення кольорів (RGB або інше).

Такі сайти, як EasyRGB.com, можуть зробити для вас загальну конверсію з RGB в HSL або навпаки.

Приклад програмування, виконаний у PHP згідно з довідкою

Перетворення з RGB в HSL

Значення вище синього # 0000FF rgb (0,0255) можна представити як червоний шістнадцятковий 00 + зелений шістнадцятковий 00 + синій шістнадцятковий FF

$redhex  = substr($hexcode,0,2);
$greenhex = substr($hexcode,2,2);
$bluehex = substr($hexcode,4,2);

Він також може бути представлений у вигляді червоного десятичного 0 + зеленого десятичного 0 + синього десятичного 255

$var_r = (hexdec($redhex)) / 255;
$var_g = (hexdec($greenhex)) / 255;
$var_b = (hexdec($bluehex)) / 255;

Тепер підключіть ці значення до програми rgb2hsl. Нижче наведено мою PHP-версію загального коду EasyRGB.com для цієї конверсії:

Введення - $ var_r, $ var_g і $ var_b зверху. Вихід HSL еквівалентний як $ h, $ s і $ l - вони знову виражаються у вигляді дробів 1, як вхідні значення

$var_min = min($var_r,$var_g,$var_b);ttt
$var_max = max($var_r,$var_g,$var_b);
$del_max = $var_max - $var_min;

$l = ($var_max + $var_min) / 2;

if ($del_max == 0)
{
        $h = 0;
        $s = 0;
}
else
{
        if ($l < 0.5)
        {
                $s = $del_max / ($var_max + $var_min);
        }
        else
        {
                $s = $del_max / (2 - $var_max - $var_min);
        };

        $del_r = ((($var_max - $var_r) / 6) + ($del_max / 2)) / $del_max;
        $del_g = ((($var_max - $var_g) / 6) + ($del_max / 2)) / $del_max;
        $del_b = ((($var_max - $var_b) / 6) + ($del_max / 2)) / $del_max;

        if ($var_r == $var_max)
        {
                $h = $del_b - $del_g;
        }
        elseif ($var_g == $var_max)
        {
                $h = (1 / 3) + $del_r - $del_b;
        }
        elseif ($var_b == $var_max)
        {
                $h = (2 / 3) + $del_g - $del_r;
        };

        if ($h < 0)
        {
                $h += 1;
        };

        if ($h > 1)
        {
                $h -= 1;
        };
};

Отже, тепер у нас є колір у вигляді значення HSL у змінних $ h, $ s та $ l. Ці три вихідні змінні на цій стадії знову вважаються дробами 1, а не як градуси та відсотки. Так, наприклад, циан (180 ° 100% 50%) виходив би як $ h = 0,5, $ s = 1, і $ l = 0,5.

Далі знайдіть значення протилежного відтінку, тобто того, яке на 180 °, або 0,5, (я впевнений, що математики мають більш елегантний спосіб зробити це, але):

Обчисліть протилежний відтінок, $ h2

            $h2 = $h + 0.5;

            if ($h2 > 1)
                    {
                            $h2 -= 1;
                    };

Значення додаткового кольору HSL зараз у $ h2, $ s, $ l. Тож ми готові перетворити це назад у RGB (знову ж таки, моя PHP-версія формули EasyRGB.com). Зверніть увагу, що формати введення та виведення цього разу різні, дивіться мої коментарі вгорі коду:

Вхід - значення HSL додаткового кольору, що міститься у $ h2, $ s, $ l у вигляді дробів 1 Вихід RGB у нормальному форматі 255 255 255, утримується у $ r, $ g, $ b Відтінок перетворюється за допомогою функції hue_2_rgb, показаної в кінці цього коду

    if ($s == 0)
    {
            $r = $l * 255;
            $g = $l * 255;
            $b = $l * 255;
    }
    else
    {
            if ($l < 0.5)
            {
                    $var_2 = $l * (1 + $s);
            }
            elset
            {
                    $var_2 = ($l + $s) - ($s * $l);
            };

            $var_1 = 2 * $l - $var_2;
            $r = 255 * hue_2_rgb($var_1,$var_2,$h2 + (1 / 3));
            $g = 255 * hue_2_rgb($var_1,$var_2,$h2);
            $b = 255 * hue_2_rgb($var_1,$var_2,$h2 - (1 / 3));
    };

   // Function to convert hue to RGB, called from above

    function hue_2_rgb($v1,$v2,$vh)
    {
            if ($vh < 0)
            {
                    $vh += 1;
            };

            if ($vh > 1)
            {
                    $vh -= 1;
            };

            if ((6 * $vh) < 1)
            {
                    return ($v1 + ($v2 - $v1) * 6 * $vh);
            };

            if ((2 * $vh) < 1)
            {
                    return ($v2);
            };

            if ((3 * $vh) < 2)
            {
                    return ($v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6));
            };

            return ($v1);
    };

І після цього розпорядження ми нарешті маємо $ r, $ g і $ b у форматі 255 255 255 (RGB), які ми можемо перетворити на шість цифр шістнадцяткових:

    $rhex = sprintf("%02X",round($r));
    $ghex = sprintf("%02X",round($g));
    $bhex = sprintf("%02X",round($b));

    $rgbhex = $rhex.$ghex.$bhex;

$ rgbhex - наша відповідь - додатковий колір у шістнадцятковій формі.

Оскільки ваш кольоровий фон блакитний або 0,0255, це HSL

Відтінок (В): 240 градусів / насиченість (S): 100% / Легкість (L): 4,9%

навпаки 240 - це 60 у колі, тоді перетворення назад у RGB дає значення # 181800


Спасибі! Але посилання говорить про генерування «додаткового кольору» (що б там не було) самого себе . Я все ще не знаю, як це використовувати для вирішення моєї проблеми: переконайтеся, що кожен випадковий колір не схожий на колір тла. Колір фону є постійним, одноколірним, і є кілька кульок.
MestreLion

Дякую, що Кром робить це зараз. @MestreLion, оскільки фон постійний, ви можете вказати діапазон для ваших куль, який все ще доповнює фон.
Ейс Кейсерія

На даний момент викладаю свою відповідь.
Ейс Кейсерія

Зроблено. Мені не в чому сильно змінити пояснення на сайтах, оскільки це пояснено досить добре. Кредити хлопцям на EasyRGB.com
Ace Caserya


1

Я хотів би розширити ідею @ ashes999 створити контур.

Мій код буде таким же, як питон, як я можу відвернути голову (я ніколи в житті не писав рядка пітона, але раз або два раз переглядав книгу).

def lerp(a,b,value): # assuming your library was not kind enough to give you this for free
    return a + ((b - a) * value);

def drawRandomBall(bgColour,radius,point):
    var ballColour = Colour(random(0,255),random(0,255),random(0,255);
    var outlineColour = Colour(lerp(bgColour.R,255 - ballColour.R,0.5),lerp(bgColour.G,255 - ballColour.G,0.5),lerp(bgColour.B,255 - ballColour.B,0.5));
    fillCircle(point,radius+1,outlineColour);
    fillCircle(point,radius,ballColour);

Це може виглядати не особливо красиво, і це не дуже ідеально для виробничого коду, але його повинно вистачити для швидкого виправлення. Я не перевіряв код, оскільки у мене точно немає програми "кульки, що підстрибують по екрану", щоб я міг пошкодити, щоб перевірити його.


Редагувати:

Побачивши фактичний код, який використовується, ситуація перекинулася на голову, тому натомість я пропоную це рішення.

Рядки 276-284 замініть наступними:

# Colour generator
def generateColourNonBG(leeway):
    color = (randint(0,255), randint(0,255), randint(0,255))
    while color[0] >= BG_COLOR[0]-leeway and color[0] =< BG_COLOR[0] + leeway and
    color[1] >= BG_COLOR[1]-leeway and color[1] =< BG_COLOR[1] + leeway and
    color[2] >= BG_COLOR[2]-leeway and color[2] =< BG_COLOR[2] + leeway:
        color = (randint(0,255), randint(0,255), randint(0,255))

# Ball generator
def generateBall():
    Ball(generateColourNonBG(5),
                   radius=randint(10, radius),
                   position=[randint(100, screen.get_size()[0]-radius),
                             randint(100, screen.get_size()[0]-radius)],
                   velocity=[randint(50, 50+vel[0]), randint(50, 50+vel[1])],
                   )                       

# Create the balls
balls = pygame.sprite.Group()
for _ in xrange(BALLS):
    balls.add(generateBall())

У цій новій спрощеній версії заводський метод виплює кулі, а спеціалізований метод генерує кольори. Генератор кольорів тестує довільно генерований колір, щоб побачити, чи він знаходиться в певному діапазоні близькості до фонового кольору. Колір вважається занадто близьким до кольору BG, якщо всі три його кольорові канали знаходяться в leewayбудь-якій стороні BG. Тож якщо у вільному просторі 0, відмовляються лише ті кольори, які точно відповідають БГ. Я вибрав 5 за замовчуванням, який відмовляється від BG кольору та 5 кольорів з будь-якої сторони. Оскільки колір BG білий, я не впевнений, чи відмовиться він від чорного, оскільки цифри обертаються круглими. Цього можна уникнути, використовуючи функції min та max, але я їх залишив для короткості.


Я відкритий до будь-якої стратегії :) що стосується програми для каліцтва, я можу вам сказати, що: github.com/MestreLion/rainballs відповідні рядки будуть 279-284
MestreLion

Я використовую pygameяк бібліотеку. Ні Lerp, а лише основні перетворення RGB-HSV-CYMK: pygame.org/docs/ref/color.html
MestreLion

@MestreLion О боже, тепер мені доведеться встановити pygame та python, щоб перевірити його. Я застрелив себе в ногу цим XP. Лерпінг легко, lerpфункція в моїй відповіді - це все, що там є. (Лерп означає «Лінійна інтерполяція»).
Фарап

@MestreLion Нещодавно, зважаючи на те, що моя версія python не любить виклик друку без дужок. Виправлено це, але тепер у мене з’явилися помилки, що пігама не змогла знайти потрібні бібліотеки. Я перепишу свій код, щоб він відповідав тому, що у вас є, але я не можу перевірити його, поки не зафіксую пігаму. Я рекомендую додати цей файл до питання, якщо ви цього ще не зробили (якщо хтось почуває себе досить приємно, щоб написати якийсь питон для вас).
Фарап

Ви printвідрізняєтеся тим, що використовуєте Python 3, а я все ще в Python 2. І я не впевнений, чи pygameбув ще перенесений на Py3. Підсумок: не турбуйтеся :) Питання про кольори, вам не потрібні дійсні кулі, що підстрибують :)
MestreLion

1

Для формату RGB це, здається, працює досить добре і є тривіальним:

різноманітність_score = (abs (r1 - r2) + abs (g1 - g2) + abs (b1 - b2)) / 765.0

Це дасть вам бал від 0,0 до 1,0. Чим нижче, тим важче відрізнити два кольори.

Це повинно бути очевидним, але задля повноти: значення r, g, b слід спочатку привести до числа з плаваючою комою, і вважається, що їх максимальне значення дорівнює 255.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.