Алгоритм перевірки подібності кольорів


85

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

Будь-які ідеї?

РЕДАГУВАТИ :

Оскільки я вже не можу відповісти, я вирішив поставити своє "рішення" як редагування питання.

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

Оскільки це був додаток для iPhone, я працював з object-C, і реалізація є більш-менш матрицею, що представляє таблицю нижче, яка показує відстань між кольорами.

введіть тут опис зображення


Порівняння значень R, G та B недостатньо?
BlackBear

@Kai: Я намагаюся реалізувати те саме. ти пішов із YUV або ти обрав інший тип кольорового простору та космічної відстані?
Thariama

3
@Thariama Я вирішив використати (дуже) невелику підмножину справжнього кольору у своєму додатку, щоб я міг самостійно обробляти порівняння кольорів. Я працюю приблизно з 50 кольорами і використовую жорстко закодовані відстані між ними. Однак із усього, що я читав і випробовував, використовуючи 2 ^ 24 кольори, YUV зробив найкращу роботу.
Kai Huppmann

@Kai: велике спасибі, що повідомили мені про ваше рішення та його причини. це означає, що ви використовуєте RGB і створюєте гістограму, використовуючи 50 кольорів, і прискорюєте свій алогітм із використанням заздалегідь визначених відстаней, правильно? якою мовою ви користувались для реалізації свого алгоритму?
Thariama

@Thariama Помістіть це як редагування у вихідному питанні.
Kai Huppmann

Відповіді:


57

Відстань RGB в евклідовому просторі не дуже "схожа на середнє сприйняття людиною"

Ви можете використовувати кольоровий простір YUV , він враховує цей фактор:

|  Y' |      |  0.299    0.587    0.114   | | R |
|  U  |  =   | -0.14713 -0.28886  0.436   | | G |
|  V  |      |  0.615   -0.51499 -0.10001 | | B |

Для цього також можна використовувати кольоровий простір CIE .

РЕДАГУВАТИ:

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


3
Дякую! Чи можу я тоді підійти до евклідової космічної відстані значень Y'UV?
Kai Huppmann

Звичайно, але ви можете використовувати і інші відстані.
Ghassen Hamrouni

2
Швидше за все, ви хочете розрахувати евклідову відстань між ультрафіолетовими компонентами лише тому, що Y 'є компонентом люми.
Росс

17
Хто-небудь може цитувати джерело для твердження, що евклідова відстань у ЮВ відображає сприйняття людьми відмінностей?
Білл

4
@Bill це не робить. дивіться розділ "результати" тут: compuphase.com/cmetric.htm
kritzikratzi

23

Я б рекомендував використовувати CIE94 (DeltaE-1994), це, як кажуть, гідне відображення сприйняття кольором людини. Я досить багато використовував його у своїх програмах, пов’язаних із комп’ютерним зором, і я дуже задоволений результатом.

Однак провести порівняння досить обчислювально:

  1. RGB to XYZ для обох кольорів
  2. XYZ to LAB для обох кольорів
  3. Diff = DeltaE94(LABColor1,LABColor2)

Формули (псевдокод):


Я віддав перевагу цьому методу через використання кольорового простору CIELAB, дякую.
Сергій Воронезький

XYZ до LAB, як у "Hunter-Lab"?
Zuks

1
Неважливо ... Я бачу, що Delta E 1994 використовує значення CIE-L * ab
Zuks

15

Тут є чудова публікація на тему кольорових відстаней: http://www.compuphase.com/cmetric.htm

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

typedef struct {
   unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
  long rmean = ( (long)e1.r + (long)e2.r ) / 2;
  long r = (long)e1.r - (long)e2.r;
  long g = (long)e1.g - (long)e2.g;
  long b = (long)e1.b - (long)e2.b;
  return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

14

Людське сприйняття слабше за насиченістю, ніж інтенсивність.

Наприклад, у комерційному відео кольорові простори YCbCr / YPbPr (також звані Y'UV) зменшують роздільну здатність інформації про кольоровість, але зберігають яскравість (Y). При цифровому стисненні відео, такому як 4: 2: 0 та 4: 2: 2, зменшується бітрейт кольоровості через відносно слабше сприйняття.

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

Крім того, за низької інтенсивності людський зір практично чорно-білий. Тому функція пріоритету є нелінійною, оскільки для низької яскравості (Y) ви додаєте все менше і менше ваги кольоровості.

Інші наукові формули: http://en.wikipedia.org/wiki/Color_difference


3

Сприйняття кольору не євклідове. Будь-яка формула відстані буде одночасно і досить хорошою, і жахливою. Будь-яка міра, заснована на евклідовій відстані (RGB, HSV, Luv, Lab, ...), буде достатньо хорошою для подібних кольорів, показуючи, що аква близька до чирок. Але для не близьких значень це стає довільним. Наприклад, червоний ближче до зеленого чи до синього?

З поширених запитань про кольори Чарльза Пойнтона :

Системи XYZ та RGB далеко не демонструють одноманітність сприйняття. Знайшовши перетворення XYZ у досить сприйнятливий для сприйняття простір, витрачений десять років і більше на CIE, і врешті-решт жодної системи не вдалося узгодити.


Дякую. І це чудове, цікаве посилання. Для моєї мети не так важливо сказати, чи ближче червоний до зеленого чи синього, але що світло-сірий ближче до білого, ніж світло-червоний, і я сподіваюся (але ще не впевнений), що YUV це зробить.
Kai Huppmann

-5

Подібність кольорів у кубі RGB вимірюється евклідовою відстанню (використовуйте формулу Піфагора).

РЕДАГУВАТИ: Якщо замислитися, це повинно бути справедливим і для більшості інших кольорових просторів.


6
Ні, евклідова відстань у просторі RGB не відповідає тому, як людське око сприймає відмінності між кольорами. Це вся причина створення кольорових просторів, таких як Lab.
Білл

ні. евклідова відстань - це один із способів виміряти відстань у будь-якому декартовому просторі. він вимірює відстань, а не схожість! тепер ви можете або вибрати інший векторний простір (наприклад, cie або yuv), де евклідова відстань та подібність сортування збігаються, або ви використовуєте інший показник. але rgb + евклідова не дають задовільних результатів.
kritzikratzi

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