Определить преобладающий оттенок изображения с помощью PHP - PullRequest
2 голосов
/ 30 октября 2009

Я использовал GD раньше, но только когда-либо для изменения размера / генерации изображений на лету - хотя я весьма уверен, что у него есть возможности делать то, что я ищу.

Как можно проще, мне нужно проверить изображение, чтобы узнать, имеет ли оно светлый фон или темный фон. То есть если фон преимущественно «светлый», мне возвращается значение «1», а если фон «темный», возвращается «0».

За один раз в этом процессе будет проходить только 5 изображений, но я очень осторожен в отношении времени обработки - страницу будут часто вызывать.

Может ли кто-нибудь указать мне в правильном направлении, куда идти с этим?

1 Ответ

3 голосов
/ 30 октября 2009

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

Может быть, вы можете получить "достаточно хорошую" идею, посмотрев на некоторые ключевые пиксели и усреднив их.

Если что-то не так, работа, которую вам нужно сделать, начинает расти на порядки.

Одна хорошая идея, которую я имел, состояла в том, чтобы взять полосу пикселей, идущую по диагонали от верхнего левого угла к правому нижнему углу (возможно, взгляните на алгоритм линий Брезенхема ). Ищите пробежки темного и светлого цвета и, вероятно, сделайте самый длинный пробежку; если это не сработает, возможно, вам следует «забить» прогоны, основываясь на том, насколько они светлые и темные.

Если ваше изображение неоправданно велико (например, 1000x1000 или более), тогда используйте imagecopyresized, чтобы дешево уменьшить его до чего-то разумного (скажем, 80x80).

То, что будет работать, если MOST изображения имеет фоновый цвет, - это изменить выборку изображения до 1 пикселя и проверить цвет этого пикселя (или, возможно, что-то маленькое, 4x4 или около того, после чего вы подсчитываете количество пикселей, чтобы увидеть, изображение преимущественно светлое или темное).

Обратите внимание, что imagecopyresampled значительно дороже, чем imagecopyresized, поскольку «измененный размер только берет отдельные пиксели от оригинала, тогда как« повторно выбранный »фактически смешивает пиксели вместе.

Если вы хотите измерить «легкость», вы можете просто сложить значения R, G и B. Или вы можете использовать формулу для яркости, используемую в YCbCr :

Y' = 0.299 * R + 0.587 * G + 0.114 * B

Это дает более "ориентированный на человека" показатель легкости.

...