Предположим, у нас есть заранее известный набор из 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, и я искал документацию, но я, кажется, не могу найти, если эта проблема уже решена.