Mysql Алгоритм для определения ближайшего соответствия цветов - PullRequest
1 голос
/ 07 мая 2010

Я пытаюсь создать настоящее мозаичное приложение. На данный момент у меня есть одно мозаичное изображение, то есть то, на котором основана мозаика, и около 4000 изображений из моей библиотеки iPhoto, которые действуют как библиотека изображений. Я уже провел свое исследование и проанализировал мозаичное изображение. Я преобразовал его в фрагменты размером 64x64 каждый из 8 пикселей. Я рассчитал средний цвет для каждого среза и установил значения r, g, b и яркости ( Яркость (воспринимается вариант 1) = (0,299 * R + 0,587 * G + 0,114 * B) ). Я сделал то же самое для каждой фотографии библиотеки изображений.

Таблица мозаичных ломтиков выглядит так.

slice_id, slice_image_id, slice_slice_id, slice_image_column, slice_image_row, slice_colour_hex, slice_rgb_red, slice_rgb_blue, slice_rgb_green, slice_rgb_brightness

Таблица библиотеки изображений выглядит так.

upload_id, upload_file, upload_colour_hex, upload_rgb_red, upload_rgb_green, upload_rgb_blue, upload_rgb_brightness

Итак, в основном я читаю кусочки изображений из таблицы кусочков в PHP, а затем вытаскиваю соответствующие изображения из таблицы библиотеки на основе цветовых гексов. Моя проблема в том, что я занимался этим слишком долго и, возможно, выпил слишком много энергетических напитков, поэтому не могу правильно сконцентрироваться, я не могу найти способ выбрать ближайшего соседа по цвету, если соответствующий шестнадцатеричный код не существует.

Есть идеи по поводу идеального запроса?

NB. Я знаю, что вытягивать кусочки по одному не идеально, однако мозаика перестраивается периодически, поэтому внезапный всплеск загрузки mysql меня не особо беспокоит, однако, если у нас есть способ вытащить изображения все это одновременно было бы огромным бонусом.

Обновление Сравнение яркости.

с яркостью

alt text

без яркости

alt text

Ответы [ 2 ]

1 голос
/ 07 мая 2010

Один из способов минимизировать разницу между цветами (с точки зрения их компонентов RGB) - это индивидуально минимизировать разницу в каждом компоненте. Таким образом, вы ищете запись с наименьшим

(targetRed - rowRed)^2 + (targetGreen - rowGreen)^2 + (targetBlue - rowBlue)^2
0 голосов
/ 07 мая 2010

Я думаю, что вам может быть лучше использовать HSL вместо RGB в качестве цветового пространства. Формулы для вычисления HSL из RGB доступны в Интернете (и в связанной статье Википедии), они могут дать вам то, что вам нужно для вычисления наилучшего соответствия.

...