Ответ 1
Ваш общий подход должен работать, но я бы выделил некоторые детали.
Вместо данного списка цветов создайте несколько цветовых "бункеров" в цветовом спектре для подсчета пикселей. Вот еще один вопрос, который имеет некоторые алгоритмы для этого: Создание цветовых палитров спектра. Сделайте количество бункеров настраиваемым, чтобы вы могли экспериментировать, чтобы получить нужные результаты.
Далее, для каждого пикселя, который вы рассматриваете, вам нужно найти "ближайший" бит для увеличения. Вам нужно будет определить "ближайшее"; см. эту статью о "цветовой разнице": http://en.wikipedia.org/wiki/Color_difference
Для производительности вам не нужно смотреть на каждый пиксель. Так как элементы изображения обычно покрывают большие области (например, небо, трава и т.д.), Вы можете получить желаемый результат, только сэмплируя несколько пикселей. Я бы предположил, что вы можете получить хорошие результаты, отбирающие каждый 10-й пиксель, или даже каждые 100-е. Вы также можете поэкспериментировать с этим фактором.
[Примечание редактора: абзац ниже был отредактирован для комментария Майка Фэрхерста.]
Также можно сделать усреднение пикселей, как в этой демонстрации: jsfiddle.net/MUsT8/