Быстрый способ получить доминирующий цвет изображения

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


Если это важно, то это UIImage, снятый с камеры iPhone или iPod touch, размер не более 5 Mpx. Причина, по которой он должен быть быстрым, заключается в том, что простое отображение индикатора прогресса не имеет большого смысла, поскольку это приложение для людей с плохим зрением или вообще без него. Поскольку это мобильное устройство, оно может не занимать много памяти (не более 50 МБ).


person Community    schedule 19.02.2011    source источник


Ответы (1)


Ваш общий подход должен работать, но я бы выделил некоторые детали.

Вместо заданного вами списка цветов сгенерируйте несколько цветовых «ячеек» в цветовом спектре для подсчета пикселей. Вот еще один вопрос, в котором есть несколько алгоритмов для этого: Создание цветовых палитр спектра Сделайте количество ящиков настраивается, чтобы вы могли экспериментировать, чтобы получить желаемые результаты.

Затем для каждого рассматриваемого пикселя вам нужно найти «ближайшую» цветовую корзину для увеличения. Вам нужно будет определить «ближайший»; см. эту статью о «цветовой разнице»: http://en.wikipedia.org/wiki/Color_difference

Для повышения производительности вам не нужно смотреть на каждый пиксель. Поскольку элементы изображения обычно покрывают большие области (например, небо, траву и т. Д.), Вы можете получить желаемый результат, выбрав всего несколько пикселей. Я предполагаю, что вы можете получить хорошие результаты, выбирая каждый 10-й пиксель или даже каждый сотый. Вы также можете поэкспериментировать с этим фактором.

[Примечание редактора: приведенный ниже абзац был отредактирован с учетом комментария Майка Фэрхерста.]

Также можно выполнить усреднение пикселей, как в этой демонстрации: jsfiddle.net/MUsT8/

person payne    schedule 19.02.2011
comment
Демонстрация среднего цвета показывает зеленый фон, потому что есть опечатка, когда цвет фона RGB установлен так, что зеленые и синие значения находятся в неправильных положениях. После исправления средний цвет RGB будет синим, как и следовало ожидать от очень синего изображения в качестве примера. - person Gab; 20.04.2011
comment
Я только что выпустил небольшую библиотеку javascript (pieroxy.net/blog/pages/color- finder / index.html), который делает в значительной степени то, что вы описываете. Вы также можете передать метод обратной связи, чтобы изменить алгоритм в соответствии с вашими цветовыми предпочтениями. Вот живая демонстрация: pieroxy.net/blog/pages/color-finder/ demo.html. Надеюсь это поможет. - person pieroxy; 19.06.2013
comment
Обновите свой ответ, чтобы исправить ошибку, указанную в комментарии ниже. Исправленная скрипка находится здесь: jsfiddle.net/MUsT8 Наша команда потратила много времени, отреагировав на вашу демонстрацию, в которой просто есть ошибка. - person Mike Fairhurst; 27.03.2015