Определите цвет «сколько одного цвета на изображении» - PullRequest
1 голос
/ 26 октября 2011

Я пытаюсь рассчитать среднее значение одного цвета по всему изображению, чтобы определить, как цвет, насыщенность или интенсивность или другое значение, описывающее это, изменяется между частями видео. Однако я хотел бы получить только одно значение, которое будет описывать весь кадр (и сигил, выбранный цвет в нем). Вычисление простого среднего значения цвета в кадре дает мне очень небольшую разницу между видеокадрами, всего 2-3 на интервале 0..255.

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

Ответы [ 2 ]

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

Какую библиотеку вы используете для обработки изображений?Если это OpenCV (или Matlab), то шаги здесь будут довольно простыми.В противном случае вам нужно будет осмотреться и немного поэкспериментировать.

  1. Используйте фильтр Mean Shift для RGB (или серого, в зависимости от того), чтобы сгруппировать цвета в изображении - почти одинаковые цвета сгруппированы вместе.Это уменьшает количество цветов, с которыми приходится иметь дело.
  2. Перейдите на уровень серого и вычислите частотную гистограмму с ячейками [0 ... 255] значений пикселей, которые присутствуют в изображении
  3. Самая высокая частота - медиана - будет соответствовать корзине (цвету), которая присутствует больше всего.Частота каждого бина даст вам нет.пикселей того цвета, который присутствует в кадре.
  4. Примите значение медианы как один цвет для описания вашего кадра - цвет, присутствующий в наибольшем количестве в кадре.

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

0 голосов
/ 26 октября 2011

В худшем случае вы можете перебрать все пиксели изображения и сделать подсчет. Не уверен, что вы используете в программировании, но я использую Python с Numpy, что-то похожее на это. Где pb - это gtk pixbuf с моим изображением.

def pull_color_out(self, pb, *args):
    counter = 0
    dat = pb.get_pixels_array().copy()
    for y in range(0,pb.get_width()):
        for x in range(0,pb.get_height()):
            p = dat[x][y]
            #counts pure red pixels
            if p[1] = 255 and p[2] = 0 and p[3] = 0:
               counter += 1

    return counter

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...