Дизайн базы данных для хранения шаблона цвета изображения в MySQL для поиска изображения по цвету

Я создаю галерею изображений с использованием PHP и MySQL, где я хочу реализовать поиск изображений по его цвету . Следуя Imagick :: getImageHistogram, я получил самые представленные цвета из изображений.

<?php $image = new Imagick("thing.png"); $pixels=$image->getImageHistogram(); foreach($pixels as $p){ $colors = $p->getColor(); foreach($colors as $c){ print( "$c\t" ); } print( "\t:\t" . $p->getColorCount() . "\n" ); } ?> This will print out something like: Red Green Blue Alpha : No of times appeared 252 250 252 1 : 125 194 156 182 1 : 126 109 18 79 1 : 11440 2 117 162 1 : 12761 255 255 255 1 : 40769 

Хотя я покончил с получением цветов, я застрял в разработке базы данных для хранения информации о цвете вместе с образом пути изображения в базе данных.

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

Обновить:

Во-вторых, как я могу получить изображения с соответствующим цветом. Предположим, что пользователь ищет цвет # ff0000, то как я могу получить все ближайшие согласованные изображения из базы данных.

Спасибо

Вы должны нормализовать это.

3 Таблицы:

 Image {image_id, name} Colors {color_id, red, green, blue, alpha} ImageHasColor {image_id, color_id, number_of_times_appeared} 

Вставка данных должна быть простой, используйте ...insert_id функции ...insert_id чтобы получить идентификатор из строки, которую вы только что вставили.

Выберите с помощью таких объединений, как:

 SELECT * FROM Image i JOIN ImageHasColors h ON i.image_id = h.image_id JOIN Colors c ON c.color_id = h.color_id ORDER BY i.image_id 

Проверьте эту ссылку о том, как преобразовать цвет HEX в значения RGB: http://bavotasan.com/2011/convert-hex-color-to-rgb-using-php/

Поиск топ-10 действительно красных картин:

 SELECT * FROM Image i JOIN ImageHasColors h ON i.image_id = h.image_id JOIN Colors c ON c.color_id = h.color_id WHERE c.red > 200 AND c.green < 50 AND c. green < 50 ORDER BY h.number_of_times_appeared LIMIT 10 

Поиск довольно черных изображений:

 SELECT * FROM Image i JOIN ImageHasColors h ON i.image_id = h.image_id JOIN Colors c ON c.color_id = h.color_id WHERE c.red < 30 AND c.green < 30 AND c. green < 30 ORDER BY h.number_of_times_appeared LIMIT 10 

Почему бы вам не создать таблицу базы данных со следующими полями:

Таблица изображений

 id name red green blue alpha 

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

Например:

 total red = ((252*125)+(194*126)+(109*11440)+(2*12761)+(255*40769)) / (125 + 126 + 11440 + 12761 + 40769) = 180 

Затем просто сохраните их в базе данных, например

  id red green blue image_path Image 1 1 225 134 4 /dir/ Image 2 2 143 0 145 /dir/ Image 3 3 239 200 111 /dir/ 

Если вы искали красные изображения, вы могли бы сделать что-то вроде:

 SELECT id, image_path WHERE red > 200 AND blue < 100 AND green < 100 

Я не уверен в специфике, но вы можете обходиться со значениями.