Сортировка по цветам

23 апреля 2010 г.

Доброго времени суток!
Недавно, разрабатывая галерею изображений, я наткнулся на интересную задачу: заказчик просил, чтобы я реализовал сортировку по цвету, как в галерее яндекса. То есть, имея фиксированные цвета, например, зеленый, желтый, оранжевый, зеленый, красный и другие, а также исходное изображение, я должен был посчитать количество пикселей каждого из линейки цветов в картинке. Дальше задача становилась тривиальная- сортировка по полю, соответствующему выделенному цвету. Однако количество цветов нужно еще посчитать, ведь цвет каждого пикселя изображения, как известно, в php определяется в rgb формате, и границы принадлежности к определенному цвету из линейки становятся достаточно размытыми, ведь для определения цвета необходимо знать все 3 составляющие rgb.

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

if(($red>12)and($green<50)and($blue<50))
$countRed++;

для части спектра красного цвета. Но этот способ решения в лоб мне кажется неуместным, так как для нечетких цветов, например, розового таких диапазонов становится достаточно много, да и их определение занятие достаточно эмпирическое, не говоря уже о возможности отнести оттенок в rgb к разным цветам из линейки. Тогда было принято решение попробовать через другие модели представления цветов организовать подсчет. В процессе изучения я обратил внимание на HSL. Аббревиатура HSL обозначает hue, saturation, and luminance (цветовой тон, насыщенность и светлость).

То есть по цветовому тону мы можем спокойно определить цвет, так как он лежит в плоскости, а выделив границы насыщенности и светлости можно задаться четким диапазоном цветов.  Еще немного поискав я нашел и код перевода из rgb в hsl. Если подходить к делу на практике, то, например, для определения количества красного цвета, нужно выполнить проверку по 3-м условиям: принадлежность к оттенку, ограничение минимума насыщенности и максимума светлости. Для черного и белого цветов задача еще проще- фильтрация по светлости.

Теги:
рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики