Как преобразовать изображение RGB в индексированный формат?

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

RGBColor rgbPalette[256];
for (int i = 1; i <= 85; i++)
{
    rgbPalette[i].R = ((86 - i) * 255) / 85;
    rgbPalette[i + 85].G = ((86 - i) * 255) / 85;
    rgbPalette[i + 170].B = ((86 - i) * 255) / 85;
}

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

Я использую библиотеку изображений ImageMagick. Я знаю, что они предоставляют функции квантования, но мне нужно «принудить» эту палитру к изображению, а AFAIK ImageMagick не предоставляет никаких функций для этого.

Спасибо за вашу помощь.


person Noah Roth    schedule 25.03.2015    source источник
comment
Это может оказаться полезным.   -  person emlai    schedule 25.03.2015
comment
Таким образом, у пользователя, опубликовавшего этот вопрос, другая проблема, чем у меня. Насколько я понимаю, ему просто нужен способ преобразования изображения RGB в индексированное изображение, а также динамическое создание цветовой палитры, в результате чего изображение не теряет много качества (и ответы указывают на то, что он должен квантовать алгоритмы, такие как NeuQuant) . Моя проблема немного в другом: у меня уже есть цветовая палитра, которую я хочу использовать, и она будет ограничивать изображение только оттенками красного, синего и зеленого. Поэтому мне просто нужно выяснить, как рассчитать расстояние каждого пикселя от сгенерированной цветовой палитры.   -  person Noah Roth    schedule 25.03.2015
comment
Если у вас уже есть цветовая палитра, вы можете использовать метод map() Magick++ (imagemagick.org /Usage/quantize/#remap) или я неправильно понимаю, о чем вы спрашиваете?   -  person dlemstra    schedule 25.03.2015
comment
Но для этого в качестве параметра используется Magick::Image? Должен ли я преобразовать свою цветовую палитру в изображение? Просто кажется, что добавлено подслушано. Я, вероятно, должен отметить, что мне больше не нужен Magick::Image после того, как я вычислю проиндексированную информацию, потому что я все равно буду сериализовать палитру и индексы в файл. Вот почему расчет индексов вручную не будет проблемой. Мне просто нужно знать, как это вычислить.   -  person Noah Roth    schedule 26.03.2015