OpenCV Python Какая карта подходит от полного цветового пространства до уменьшенной цветовой палитры? - PullRequest
0 голосов
/ 20 февраля 2020

Предположим, у нас есть заранее известный набор из n цветов C. Нам дан список цветов l.

Цель для каждого цвета l, сопоставить его с цветом в C, чтобы он минимизировал функцию расстояния D.

Самый простой Подход заключается в использовании евклидова расстояния, однако это не очень хорошая идея из-за следующего примера:

Предположим, что цвет ввода (0,1, 0, 0) очень темно-красный. Предположим, что коричневый (0,5, 0,5, 0) и чистый красный (1,0,0) оба находятся в C.

Евклидово расстояние дает:

  • расстояние до коричневого = = (0,4 ^ 2 + 0,5 ^ 2) = 0,41

  • расстояние до красного = (0,9 ^ 2) = 0,81

Таким образом, темно-красный отображается на коричневый вместо красного, что визуально не имеет смысла.

Мы могли бы попробовать чебычёвское расстояние:

  • расстояние до коричневого = макс. (0,4, 0,5, 0) = 0,5

  • расстояние до красного = макс. (0,9, 0, 0) = 0,9

или расстояние до Манхэттена:

расстояние до коричневого = макс. (0,4 + 0,5) = 0,9

расстояние до красного = макс. (0,9 + 0 + 0) = 0,9

Первый по-прежнему выбирает коричневый цвет по сравнению с красным, а второй выбирает оба одинаково допустимых варианта. Хотя это и улучшение, но это не идеал.

Однако я не уверен, как измерить «визуальное расстояние», то есть, если цвет будет «выглядеть зеленым» для человека, например, как сопоставить этот цвет с зеленым. .

Я использую opencv, и я искал документацию, но я, кажется, не могу найти, если эта проблема уже решена.

1 Ответ

1 голос
/ 20 февраля 2020

Добро пожаловать в мир цветов! Если вы используете RGB, упомянутые метрики расстояния вряд ли будут работать, потому что RGB не является перцепционно однородным цветовым пространством (расстояния между векторами в цветовом пространстве не похожи на воспринимаемые человеком изменения). CIELAB Цветовое пространство предположительно является однородным по восприятию.

Популярная метрика цветового расстояния c, которая подверглась нескольким изменениям в течение времени: CIELAB \ deltaE *

Эти метрики расстояния доступны в colormath пакет.

из документов:

from colormath.color_objects import LabColor
from colormath.color_diff import delta_e_cie1976

# Reference color.
color1 = LabColor(lab_l=0.9, lab_a=16.3, lab_b=-2.22)
# Color to be compared to the reference.
color2 = LabColor(lab_l=0.7, lab_a=14.2, lab_b=-1.80)
# This is your delta E value as a float.
delta_e = delta_e_cie1976(color1, color2)

В вашей задаче, если размер вашего известного набора цветов (C) невелик (скажем, 10), даже delta_E может работать не так, как ожидалось. Более надежным способом было бы собрать новый набор S, который имеет множество оттенков каждого цвета в C (можно использовать Цветовые словари ) и сопоставить каждый цвет в l с его шкаф в S, а затем в C. Вы можете ускорить поиск, используя структуру данных, такую ​​как kd-tree, предварительно рассчитав метрики расстояния.

...