обнаружение основного цвета в Python - PullRequest
7 голосов
/ 14 октября 2011

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

Я видел похожие вопросы, такие как Определение цвета изображения с использованием python , которые запрашивают алгоритм среднего цвета. Я в значительной степени скопировал этот код, используя библиотеку изображений Python и гистограммы, и заставил его работать - но я обнаружил, что он не слишком надежен для определения основных цветов.

Есть идеи? Или библиотеки, которые могли бы решить эту проблему?

Заранее спасибо!

: EDIT: Спасибо, ребята - вы все в значительной степени сказали одно и то же, чтобы создать «сегменты» и увеличить количество сегментов с каждым ближайшим пикселем изображения. Я, кажется, получаю много изображений, возвращающих «Белый» или «Бежевый», который также является фоном для большинства этих изображений. Есть ли способ обойти или игнорировать фон?

Еще раз спасибо.

Ответы [ 3 ]

9 голосов
/ 15 октября 2011

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

(N, COLOR)

, где N - количество раз, когда цвет COLOR встречается на изображении.Чтобы получить максимально возможный цвет, вы можете передать список функции max :

>>> from PIL import Image
>>> im = Image.open("test.jpg")
>>> max(im.getcolors(im.size[0]*im.size[1]))
(183, (255, 79, 79))

Обратите внимание, что я передал im.size[0]*im.size[1] функции getcolors, потому что это максимум maxcolors значение (подробнее см. документы ).

2 голосов
/ 14 октября 2011

Лично я бы разделил цветовое пространство на 8-16 основных цветов, а затем для каждого пикселя я бы увеличивал ближайший цветной блок на единицу.В конце выигрывает цвет сегмента с наибольшим количеством пикселей.

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

1 голос
/ 14 октября 2011

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

Что касается соответствия, я бы начал с изменения размера каждого изображения до меньшего размера, чтобы уменьшить объем работы, которую вы будете выполнять для каждого; наше восприятие цвета изображения не слишком зависит от количества деталей. Для каждого пикселя меньшего изображения найдите, какой из 13 цветов является самым близким. Если это в пределах некоторого порога, увеличьте счетчик для этого цвета. В конце, какой из 13 имеет наибольшее количество победителей.

...