определить наиболее используемый цвет в изображении с помощью Python - PullRequest
8 голосов
/ 11 марта 2010

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

http://www.shopcrazy.com.ph/wp-content/images/2007/02/shiny-bags-01.jpg.

как определить основной цвет по кодам RGB (пример - красный на изображении выше).

Ответы [ 6 ]

5 голосов
/ 11 марта 2010

Поскольку вам, скорее всего, не понадобится гистограмма всех миллионов цветов, которые возможны при использовании 24-битного цветового пространства, я предлагаю вместо этого преобразовать изображение в пространство HSV. Затем вы можете разделить часть Hue этого пространства на несколько ячеек, которые описывают оттенки, которые вы хотите найти («темно-красный», «оранжевый-красный» или любой другой). Затем составьте гистограмму этих корзин и найдите, какой цвет является доминирующим, а какой - «цвет».

Статья в Википедии http://en.wikipedia.org/wiki/HSL_and_HSV должна помочь вам начать. Если вы используете библиотеку обработки изображений, скорее всего, существует функция rgb-to-hsv / hsl.

Кроме того, если изображения имеют большой размер и скорость - это проблема, перед гистограммированием можно рассмотреть возможность уменьшения размера изображения до меньшего размера.

3 голосов
/ 11 марта 2010

Метод грубой силы состоит в том, чтобы зациклить все пиксели в изображении и вести подсчет значений R, G, B. Более изощренный подход заключается в использовании Python Image Library функции гистограммы и вычислении среднего значения всех цветов.

2 голосов
/ 03 апреля 2010

Я бы использовал библиотеку изображений Python. Это фрагмент кода, который вычисляет количество белых / не белых пикселей на изображении.

import sys

from PIL import Image

im = Image.open(sys.argv[1])
white = 0
black = 0
for i in im.getdata():
  if i == (255,255,255):
    white += 1
  else:
    # we assume black everything that is not white:
    black += 1
print im.size[0],im.size[1],white,black

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

import sys

from PIL import Image

im = Image.open(sys.argv[1])
count= {}
for i in im.getdata():
  if not count.has_key(i):
      count[i] = 0

  count[i] += 1

Теперь вы можете проверить тот, у кого наибольшее количество очков, и получить наиболее часто используемую тройку RGB. Конечно, если вы хотите проверить также вицинальные цвета, вам придется преобразовать в HSV и проверить расстояния между различными точками HSV, а затем решить, какое расстояние слишком много. Точки, достаточно близко расположенные в пространстве ВПГ (и, в частности, компонент оттенка), скорее всего, одного цвета и, следовательно, могут суммироваться вместе.

1 голос
/ 11 марта 2010

Если вы действительно уверены, что у вас всегда будет только один доминирующий цвет (нет сумок в двух цветах, например), тогда достаточно приблизительной гистограммы для размеров H & S HSV .

В противном случае вы можете (и должны) использовать среднее смещение . Это довольно просто, делает именно то, что вы хотите, и есть библиотеки, которые вы можете использовать, хотя я не смог найти ничего в Python. Вы можете либо реализовать его, либо вызвать код C ++.

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

0 голосов
/ 03 апреля 2010

Как предложено, будет удобнее конвертировать ваше изображение из RGB в HSV. Модуль стандартной библиотеки colorsys содержит функцию rgb_to_hsv для этого. Затем вы можете отобразить цвета на изображении, скажем, с H как x и S как y. Выберите точки в этом пространстве и дайте им имена; чем больше очков, тем лучше. Затем для каждого пикселя в вашем изображении найдите ближайшую из выбранных вами точек и используйте ее имя в качестве значения пикселя. Подсчитайте, какое имя встречается чаще всего.

Вы хотите, чтобы я дал код?

0 голосов
/ 11 марта 2010

Сортируйте пиксели на месте, затем прокрутите изображение и найдите самый длинный пробег.

...