2012-04-29 2 views
4

Итак, я начинаю рассматривать «простое» уменьшение цвета для применения к изображениям. Я провел последний день, исследуя, как это работает, и сумел найти то, что кажется достойным алгоритмом для экспериментов здесь: Median cut algorithmПрименение выходной палитры алгоритма сокращения цвета срединной резки к исходному изображению

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

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

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

Примечание. Я просмотрел различные библиотеки (ImageMagick), но они кажутся немного излишними; самое большее, что я буду делать с манипуляциями с изображениями, будет уменьшать цветовую палитру - ничего сложнее этого. Вот почему я думаю, что реализация этого алгоритма будет самым простым подходом для моих нужд.

+0

Просто FYI для всех пользователей Qt собрата - этот алгоритм прекрасно интегрируется в Qt и прекрасно работает. Нулевые изменения необходимы, чтобы заставить его работать. – giraffee

+0

Если вы хотите сыграть с Median Cut, вы можете настроить существующую реализацию: https://github.com/pornel/improved-pngquant/ (он имеет быстрое переназначение и поддержку PNG) – Kornel

ответ

1

Я считаю его жизнеспособным. Разница, которую вы вычисляете, должна быть евклидовой разницей, как показано here Однако вы можете сделать небольшую оптимизацию. Вам не нужно каждый раз вычислять новую разницу. Например, вы можете заполнить таблицу поиска, чтобы правильно использовать правильный цвет, если вы уже рассчитали его.

+0

Awesome - я заметил, что в вики чтение. И спасибо за предложение справочной таблицы - я об этом не думал. – giraffee

2

Самый быстрый способ - использовать дерево oct для поиска цветов.

Идея заключается в том, что вы добавляете все цветовые индексы палитры в дерево oct, а затем запрашиваете корневой узел для ближайшего цвета. При запросе ближайшего цвета каждый узел (имеющий доступ к палитре) возвращает свой собственный индекс цвета, если он находится на самом глубоком уровне, или запрашивает соответствующий дочерний элемент (запрашиваемому цвету) для своего ближайшего индекса цвета. Если нет соответствующего ребенка, он запрашивает все его дочерние элементы для ближайшего индекса цвета и возвращает тот, чей цвет имеет наименьшее расстояние.

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

Вот моя реализация ... http://www.codeproject.com/Tips/1046574/OctTree-Based-Nearest-Color-Search

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

  • Нет связанных вопросов^_^