2015-04-03 2 views
2

Я пытаюсь найти алгоритм определения доминирующего цвета изображения (либо из камеры устройства, либо путем выбора существующей фотографии в библиотеке фотографий). Я написал приложение iOS 8 в Swift, которое может захватить значение RGB каждого пикселя в изображении, но я действительно не знаю, что делать дальше.Определить доминантный цвет изображения

Для пикселей с четким доминирующим цветом, например RGB (230, 15, 30), довольно легко определить доминирующий цвет. Тем не менее, я действительно не знаю, что делать для пикселей с RGB-значениями, где 2 из 3 значений похожи, скажем, RGB (200, 215, 30).

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

Просто глядя на некоторые мысли и предложения

+2

для RGB (200, 215, 30) доминирующий цвет желтый. Считаете ли вы, что работаете с цветовыми моделями HSL/HSV? – MBo

+0

Цветовая модель не имеет значения. Я пытаюсь разработать алгоритм определения доминирующего цвета пикселя. Я мог бы использовать чрезвычайно грубый алгоритм и сказать, что красный цвет является доминирующим цветом RGB (130, 129, 129), но это не принесло бы большого успеха для меня. С более чем 16,5 миллионами комбинаций цветов самая точная модель не будет работать. Я пытаюсь найти что-то достаточно точное, но не слишком конкретное. Например, красный цвет является доминирующим цветом RGB (65, 0, 0). У него определенно есть красный оттенок, но это не то, что люди считают красным. – steveclark

+1

Какова основная цель определения доминирующего цвета? Насколько доминанта определенного пикселя соответствует общей доминанте? Является ли что-то вроде среднего арифметического цветов надежной оценкой? – MBo

ответ

1

идея:

  1. Первый шаг, чтобы уменьшить количество цветов, например "Color Quantization using K-Means". В примере из ссылки количество цветов было уменьшено до 64 с 96K.

  2. Второй шаг - рассчитать коэффициент для каждого цвета и выбрать наибольшее значение.

1

Вы можете проверить мое хобби проект, чтобы найти доминирующий цвет в UIImage: https://github.com/ruuki/ColorFinder

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

+0

Это сумасшествие! Большое спасибо !! – Zl3n

+0

любой шанс работать в Swift для этого в ближайшее время? – Pangu

+0

У меня нет времени. но PR приветствуются! :) –

1

я имел подобную задачу сделать, вот мой питон код:

import picamera 
import picamera.array 
import numpy as np 
from math import sqrt, atan2, degrees 

def get_colour_name(rgb): 
    rgb = rgb/255 
    alpha = (2 * rgb[0] - rgb[1] - rgb [2])/2 
    beta = sqrt(3)/2*(rgb[1] - rgb[2]) 
    hue = int(degrees(atan2(beta, alpha))) 
    std = np.std(rgb) 
    mean = np.mean(rgb) 
    if hue < 0: 
     hue = hue + 360 
    if std < 0.055: 
     if mean > 0.85: 
      colour = "white" 
     elif mean < 0.15: 
      colour = "black" 
     else: 
      colour = "grey" 
    elif (hue > 50) and (hue <= 160): 
     colour = "green" 
    elif (hue > 160) and (hue <= 250): 
     colour = "blue" 
    else: 
     colour = "red" 
    if DEBUG: 
     print rgb, hue, std, mean, colour 
    return str(int(hue)) + ": " + colour 

def scan_colour: 
    with picamera.PiCamera() as camera: 
     with picamera.array.PiRGBArray(camera) as stream: 
      camera.start_preview() 
      camera.resolution = (100, 100) 
      for foo in camera.capture_continuous(stream, 'rgb', use_video_port=False, resize=None, splitter_port=0, burst=True): 
       stream.truncate() 
       stream.seek(0) 
       RGBavg = stream.array.mean(axis=0).mean(axis=0) 
       colour = get_colour_name(RGBavg) 
       print colour 

scan_colour() 

Что я думал, что это построить средний цвет всех пикселей и определить цвет из угла цветового тона. Для получения ответов в оттенках серого я хотел проверить, находится ли цвет рядом с средней строкой корпуса Color.

Смежные вопросы