Алгоритмы квантования для полутоновых и цветных изображений
12.3. Алгоритм разбиения по частоте вхождения
Идея алгоритма
Идея алгоритма состоит в построении палитры, состоящей из N самых часто встречающихся значений атрибутов в исходном изображении. Для этого нужно построить гистограмму значений атрибутов, затем взять N самых часто встречающихся и провести собственно квантование [35]. Соответственно, возникает вопрос: что делать с теми значениями, которые не уместились в палитру? Естественно заменить &лишние& значения самыми близкими аналогами из тех, что попали в палитру. Близость понимается как квадрат евклидова расстояния, т.е. в пространстве RGB
dist(C1,C2) = (R1 - R2)2 + (G1 - G2)2 + (B1 - B2)2,
где C1, C2 - значения атрибутов ( "Основные понятия. Представление цвета в машинной графике" ).
Задача поиска ближайшего значения в таблице может быть решена несколькими способами. Самый простой: для каждого значения, не представленного в таблице, перебрать расстояния до всех имеющихся в таблице элементов и выбрать элемент с минимальным расстоянием. Однако такой метод очень трудоемок и потому не используется на практике. Вообще, задача поиска в n -мерном пространстве точки из некоторого набора, ближайшей к данной, является одной из классических задач вычислительной геометрии (см., например, [7], [23]). Здесь мы приведем одно из часто используемых решений, менее трудоемкое.
Метод разбиения цветового куба - локально отсортированный поиск
Разобьем цветовое пространство (RGB-куб, см. рис. 1.5) на K x K x K одинаковых кубиков. Разбиение проводится равномерно на K частей вдоль каждой базовой цветовой оси. С каждым кубиком свяжем отсортированный список значений (в нашем случае - элементов трехмерного евклидова пространства), которые попали в палитру. Элементом списка является структура из двух переменных: номера значения в палитре и расстояния до ближайшей точки данного кубика. Если значение из палитры лежит внутри кубика, то расстояние полагается равным 0. Для того чтобы создать список для кубика, требуется вычислить расстояние до всех значений в палитре. Затем этот список сортируется. Для того чтобы ограничить длину списка, применяется простая техника: не должны включаться те значения, которые явно не могут быть ближайшими к этому кубику, а значит, и к значениям, ему принадлежащим. Это означает, что сначала отыскивается значение из палитры, ближайшее к центру кубика, затем вычисляется расстояние от этого значения до наиболее удаленной точки кубика.
// Palette - палитра // Cubes - массив кубиков // Cube.palColorsList - список цветов и расстояний // для данного кубика // Cube.center - центр кубика // dist() - расстояние между кубиком и цветом // Предполагается, что палитра заполнена в // соответствии c используемым методом // Предварительные вычисления foreach( currentCube in Cubes ) { // Найти ближайшее значение из палитры к центру куба closestColor = Palette.FindClosest(currentCube.center, Palette); // пороговое расстояние maxDist = FindMaxDist( closestColor, currentCube ); // занести цвет в список, если требуется foreach( color in Palette ) if( dist( color, currentCube ) < maxDist ) currentCube.palColorsList.Add( { color, dist( color, currentCube ) } ); }Листинг 12.2. Предварительные вычисления для локально отсортированного поиска
// Image - исходное изображение, newImage - получаемое // Cubes - массив кубиков // Cube.palColorsList - список цветов и расстояний // для данного кубика // dist() - расстояние между кубиком и цветом // Предполагается, что палитра заполнена в соответствии c // методом, а также посчитана предварительная информация для // кубиков // Квантование foreach( pixel in Image ) { // кубик для данного пикселя // вычисляется делением координат на размер куба и // взятием целой части currentCube = GetCube(Cubes, pixel.color); // INF - бесконечность справа minDist = INF; foreach( entry in currentCube.palColorsList ) { if( minDist < entry.distance ) break; // выход из цикла if( dist(pixel.color, entry.color) < minDist ) { minDist = dist(pixel.color, entry.color); newImage[pixel].color = entry.color; } } }Листинг 12.3. Квантование по построенной палитре с помощью локально отсортированного поиска
Найденное расстояние полагается порогом, при превышении которого очередное значение из палитры не добавляется в список. Следует отметить, что не требуется обрабатывать кубики, состоящие из тех значений, которые не принадлежат исходному изображению. Выбор числа K является отдельным и достаточно сложным вопросом. Чем оно больше, тем больше требуется времени для предварительных вычислений, но тем меньше требуется времени на поиск ближайшего значения при квантовании. Соответственно, нужен некий компромисс. Общая рекомендация такова: выбирать
, где M - число значений атрибутов вдоль каждой из основных цветовых осей. Приведенный алгоритм называют локально отсортированным поиском (предварительные вычисления - см. алгоритм 12.2, процесс квантования - см. алгоритм 12.3.Алгоритм разбиения по частоте вхождения показывает хорошие результаты, но лишь тогда, когда квантование осуществляется в достаточно большое количество значений атрибутов изображения, либо когда значения атрибутов исходного изображения распределены равномерно. Если же мы квантуем полноцветную фотографию, большую часть которой занимает однородная текстурированная поверхность, в малое количество цветов, то вся палитра заполнится цветами, принадлежащими поверхности, а на остальные просто не хватит места. Однако часто такая поверхность - это фон, а передний план, сильно отличающийся от фона, будет передан с очень большими искажениями (см. рис. 12.3).