Листинг 12.2. Загрузка таблицы LUT
#def1ne numRed 6 #def1ne numGreen 7 #def1ne numBlue 6
#def1ne pack(r.g.b) (256 * (r)+ 16 * (g) + (b)) for(rd » 0: rd < numRed: rd++)
for(grn - 0: gm < numGreen: grn++)
fortblu - 0: blu < numBlue: blu++)
{
index - numRed * numGreen * rd + numBlue * grn + blu: LUT[index] - pack(r[rd].g[grn].b[blu]):
}
Макрокоманда pack умножает значение красного цвета на 256, чтобы сдвинуть его в самые верхние четыре бита элемента таблицы LUT. Аналогично сдвигается и значение для зеленого цвета. Если, например, rd=3, grn=2, Ыи-5, то индекс таблицы равен 133, а величина, составленная из г[3]=9, д[2]=5, Ь[5]=15, равна 2399, что составляет 95F в шестнадцатеричной системе, как и должно быть.
Теперь при повторном просмотре списка пиксельных троек (г;, gp b) файла изображения каждое значение г. сравнивается с шестью представителями красного цвета, и определяется ближайший из них. Ищем такой индекс j_r, для которого г является ближайшим к элементу массива r[j_r]. Если, например, г{ - 8,23, то ближайшим значением будет 9, откуда j_r - 3. Предпримем такие же шаги для определения значений индексов j_gn j_b. После этого вычисляем значение индекса в самой таблице LUT следующим образом: j = 42 * j ± г + 6 *j_g + j_b.
Метод равномерного квантования является в значительной степени неудачным: в нем не учитывается совокупность используемых цветов и не сохраняется никакой информации о просмотре исходного файла цветов (за исключением значений rmax, g^, ЬШ1). Однако для некоторых изображений он работает адекватно, особенно когда число бит на пиксел велико и в таблице LUT содержится большая палитра.
Практическое упражнение 12.5.2. Проверка некоторых значений Покажите первые 20 элементов таблицы LUT из примера 12.5.1. Выглядят ли они упорядоченно? Что хранится в элементе LUT[29]? А в LUT[231]?
12.5.2. Алгоритм популярности В алгоритме популярности (popularity algorithm) [Heckbert, 102] по крайней мере предпринимается попытка определить, какие цвета чаще всего встречаются в файле. Алгоритм присваивает таким цветам