обнаружьте наиболее используемый, раскрашивают изображение с помощью Python

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

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

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

8
задан Hannes Ovrén 11 March 2010 в 09:42
поделиться

6 ответов

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

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

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

5
ответ дан 5 December 2019 в 15:22
поделиться

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

3
ответ дан 5 December 2019 в 15:22
поделиться

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

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

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

1
ответ дан 5 December 2019 в 15:22
поделиться

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

0
ответ дан 5 December 2019 в 15:22
поделиться

Я бы использовал библиотеку изображений 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 triple. Конечно, если вы хотите проверить также вицинальные цвета, вам нужно будет преобразовать в HSV и проверить расстояния между разными точками HSV, а затем решить, какое расстояние слишком велико. Точки, расположенные достаточно близко в пространстве HSV (и, в частности, компонент оттенка), скорее всего, имеют один и тот же цвет и, следовательно, могут быть суммированы.

2
ответ дан 5 December 2019 в 15:22
поделиться

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

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

0
ответ дан 5 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: