Найти лучшие подходящие цвета из базы данных - PullRequest
5 голосов
/ 08 декабря 2010

У нас есть таблица базы данных, в которой мы управляем различными цветами.В этой таблице мы сохраняем следующие атрибуты для цвета:

  • RBG-значения
  • HSV-значения
  • и Lab-значения

Каждое из этих значений находится в отдельном поле.Что мы хотели бы достичь сейчас, так это найти наиболее подходящие цвета, если вы будете искать эти значения.

Пользователь может выбрать, какую из этих цветовых моделей он хочет выполнить.Наш первый подход заключался в поиске этих значений в базе данных с диапазоном (поэтому, если пользователь ищет значение 150 красного цвета (RGB), мы запрашиваем базу данных с помощью BETWEEN 100 AND 200.

Результат не оченьхорошо, поскольку объединенные значения всегда отличаются от того, когда вы их ищете и находите подходящие строки.

Есть ли лучший подход для поиска в нашей базе данных наиболее подходящих цветов?

Объяснениеof "best match":
Мы хотим найти ближайший цвет, поэтому, если мы ищем красный, нам просто нужны красные. Может быть, возможно рассчитать процент соответствия, чтобы пользователь мог выбрать, если он имеетбыть 100% совпадением или если 50% тоже нормально.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Я работал над подобным проектом ранее ... Они использовали простую формулу, чтобы определить, какой цвет самый близкий ...

Скажите Rm,Gm,Bm - это цвет для сопоставления .... а Rx,Gx,Bx - это другой цвет ....

Итак, мы рассчитываем e = (Rm-Rx)^2 + (Gm-Gx)^2 + (Bm-Bx)^2 .... Тот, у кого наименьшее значение считается близким ... Наша цель - найти (Rx,Gx,Bx) с минимальным e.

Наш запрос выглядел следующим образом Select ColorName from Colortable order by (Rm-Rx)*(Rm-Rx)+...(Bm-Bx) TOP 10 (я не помню точный запрос eithor ...)

Это дало вам 10 лучших лучших цветов ...

Примечание: я не поддерживаю формулу, но в практических случаях она отлично работает.

0 голосов
/ 08 декабря 2010

Наиболее близким совпадением будет совпадение с самым коротким вектором между запрошенными ($ r, $ g, $ b) и сохраненными значениями. например,

SELECT c.id, c.r, c.g, c.b
FROM colours c
ORDER BY ((c.r-$r)*(c.r-$r)) 
   + ((c.g-$g)*(c.g-$g))
   + ((c.b-$b)*(c.b-$b)) ASC
LIMIT 0,1;

(тот же метод будет работать для HSV)

Но размещение границ в запросе позволило бы использовать любые индексы для уменьшения результирующего набора:

SELECT c.id, c.r, c.g, c.b
FROM colours c
WHERE c.r BETWEEN ($r-$t) AND ($r+$t)
AND c.g BETWEEN ($g-$t) AND ($g+$t)
AND c.b BETWEEN ($b-$t) AND ($b+$t)
ORDER BY ((c.r-$r)*(c.r-$r)) 
   + ((c.g-$g)*(c.g-$g))
   + ((c.b-$b)*(c.b-$b)) ASC
LIMIT 0,1;

(значение для $ t зависит от того, сколько цветов у вас есть и представляет собой максимальное векторное расстояние между любыми двумя соседними точками. (Попробуйте несколько значений и посмотрите, что произойдет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...