По сути, что цвет, что ключевое слово - это всё тэги, то есть вполне уместно использовать связь многие-ко-многим. То есть отдельная таблица с изображениями, отдельная таблица с цветами, отдельная с ключевыми словами. И две таблицы для связей, одна связывает цвета с изображениями, другая ключевые слова с изображениями. Таким образом можно делать очень сложные выборки.
SELECT * FROM `images` WHERE
`images`.`id` = `keyword-to-image`.`image_id` AND
`images`.`id` = `colors-to-image`.`image_id` AND
`keyword-to-image`.`keyword_id` = 234 AND
`colors-to-image`.`color_id` = 345 AND
`colors-to-image`.`color_id` <> 543;
То есть мы получим все изображения, к которым привязано ключевое слово с id 234 и цвет с id 345, но при этом не привязан цвет с id 543. Количество этих AND можно легко менять в скрипте. Кроме того, сравнение целых чисел намного быстрее сравнения строк.
Правда, это потребует перестройки всей базы данных, но только один раз, достаточно написать скрипт.