2011-01-04 6 views
4

Мне нужно получить наиболее распространенный цвет в файле изображения png с помощью C#. Таким образом, я могу нарисовать текст с похожими цветами, содержащимися в изображении.получить наиболее часто используемый цвет в PNG

+2

Если ваш PNG содержит только белые пиксели, вы хотите нарисовать текст в белом? Вы уверены, что это то, что вы хотите? –

+2

@ Doc Brown Где он сказал, что он рисовал изображение? – Jess

+0

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

ответ

0

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

4

Вы можете использовать colour histogram, сэмплируя значения RGB или HSV (в зависимости от вашего цветового пространства) в категории. Однако, если вы хотите, чтобы в основном был указан цвет, определенный фактическими значениями, вам нужно будет посчитать наличие каждого цвета отдельно.

0

Если вы смотрите на фактических значений пикселей, я бы использовать упорядоченный словарь:

SortedDictionary<Color,int>

и петли через все пиксели. Если вы не знаете, как пройти через пиксели, проверьте Bitmap.LockBits. Для ваших целей GetPixel будет слишком медленным.

Edit:

Я не 100% уверен, сортировка. Я согласен с CodeInChaos - прямой словарь, вероятно, будет быстрее в любом случае. Вам нужно будет сделать один цикл через словарь, чтобы получить наиболее распространенное значение.

+1

Почему SortedDictionary вместо словаря? Выполняет ли сортировка даже работу над структурой Color без ручной поставки Comparer? И Dictinary, вероятно, тоже быстрее, так как нужно искать хэш-таблицу вместо бинарного поиска. – CodesInChaos

+0

Я изначально напечатал словарь, но потом подумал, что было бы здорово, если бы цвета автоматически сортировались. Теперь, когда вы упомянули об этом, сортировка может не сработать, но вы все равно получите подсчет каждого цвета. Хороший момент о скорости. Я отредактирую его. –

0

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

Я бы предложил использовать квантование цвета Octree, которое автоматически уменьшит количество цветов, поскольку оно учитывает, группируя подобные цвета в один ведро. Одно описание алгоритма: http://www.cubic.org/docs/octree.htm

Забыл упомянуть: этот совет предназначен только для 24-битного PNG. Для 8-битного PNG у вас уже есть палитра, которая выполняет группировку цветов. Необходимо только построить таблицу значений 256 и сохранить счетчик каждого индекса палитры, когда вы его встретите.

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