Московский государственный университет имени М.В.Ломоносова
Опубликован: 23.04.2007 | Доступ: свободный | Студентов: 3275 / 437 | Оценка: 4.18 / 3.71 | Длительность: 17:54:00
ISBN: 978-5-9556-0098-7
Специальности: Программист
Лекция 12:

Алгоритмы квантования для полутоновых и цветных изображений

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

12.4. Алгоритм медианного сечения

Построим алгоритм, который сформирует палитру так, чтобы каждое значение из нее отвечало равному количеству значений атрибутов пикселей в исходном изображении. Это достигается путем последовательного разбиения цветового пространства на параллелепипеды со сторонами, параллельными осям цветового пространства RGB [35].

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

На втором шаге используется так называемое адаптивное разбиение, состоящее из следующих шагов: выбор самой длинной стороны (точнее, направления) параллелепипеда, сортировки значений вдоль выбранного направления, нахождения медианы множества значений вдоль выбранного направления, разделения параллелепипеда по найденной медиане на две части. Таким образом, получится два параллелепипеда, которые содержат примерно равное количество значений.

// Image - исходное изображение, newImage - результат
// Colors, Colors1, Colors2 - множества цветов
// Palette - палитра, NNewColors - желаемое количество цветов
// BBox - параллелепипед
// BBox1, BBox2 - получаемые на шаге разбиения параллелепипеды
// BSPtree - бинарное дерево, представляющее разбиение
// цветового пространства

{
      // 1. Находим минимальный параллелепипед
      BBox = FindBBox( Image );
      // 2. Разбиение
      i = 1;
      // получить отсортированное множество значений цветов
      // изображения
      Colors = sort( Image.colors );
      // создаем родительский узел дерева
      BSPTree.rootNode = { AllColors, BBox };
      DoPartition( i, BSPTree.rootnode );
      // 3. Заполним палитру и сформируем итоговое изображение,
      // терминальные вершины дерева содержат искомое разбиение
      foreach( pixel in Image )
      {
            paletteIndex = BSPTree.FindNode( pixel.color );
            newImage[pixel].index = paletteIndex;
      }
}

DoPartition( i, node )
{
      // нужно ли проводить разбиение? pow(2,i) - 2 в степени i
      if ( pow(2,i+1) > NNewColors ) // остановить разбиение
           return;
      else
      { // находим медианное значение вдоль самой длинной
            // стороны параллелепипеда
            FindMedian( mvalue, direction, node.Colors,
                                                            node.BBox );
            // границы новых параллелепипедов (разбиение вдоль
            // самой длинной стороны параллелепипеда)
            GetNewBBoxes( node.BBox, BBox1, BBox2, value,
                                                                                    direction );
            // копируем все значения меньшие value по
            // соответствующей координате
            Colors1 = { color in node.Colors
                                                     if( color[direction] < value ) };
            // копируем все значения большие или равные value
            // по соответствующей координате
            Colors2 = { color in node.Colors
                                                     if( color[direction] >= value ) };
            // добавим к узлу дерева детей
            BSPTree.node.AddСhildNode( { Colors1, BBox1 } );
            BSPTree.node.AddСhildNode( { Colors2, BBox2 } );
            foreach( childnode in node )
                  DoPartition( i+1, childnode );
      }
}
Листинг 12.4. Квантование методом медианного сечения

Предыдущая процедура повторяется для каждого из параллелепипедов до тех пор, пока не сформируется N параллелепипедов, где N равно желаемому размеру палитры.

Результат работы алгоритма медианного сечения.

Рис. 12.4. Результат работы алгоритма медианного сечения.

Если же на каком-то шаге потребуется разделить параллелепипед, содержащий лишь одно значение, то следует получившийся пустой параллелепипед присоединить к самому большому параллелепипеду для последующего разделения.

Следующий шаг выполняется после формирования N параллелепипедов и призван заполнить палитру. Палитра заполняется либо центральными точками параллелепипедов, либо средними арифметическими значений, попавших в данные параллелепипеды.

Далее проводится процедура нахождения соответствующего параллелепипеда для данного значения атрибута исходного изображения и замены значения на новое.

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

Часто реализации алгоритма используют специальные структуры для хранения разбиения цветового пространства. Примером такой структуры может служить BSP дерево (подробнее см. [23]).

Результаты работы алгоритма являются очень хорошими (см. рис. 12.4); при этом скорость работы данного алгоритма высока. Различные вариации данного алгоритма используются в известных приложениях для обработки изображений, например в GNU ImageManipulation Program (GIMP).

12.5. Методы кластеризации для квантования изображений

В данном разделе будут рассмотрены методы, производящие кластеризацию значений атрибутов изображения для дальнейшего построения палитры. В общем случае кластеризация - это процесс разбиения объектов на группы (кластеры) на основе свойств, описывающих сущность объектов [38]. В применении к квантованию изображений это означает процесс разбиения значений атрибутов на группы (кластеры) так, что внутри каждой группы находятся лишь близкие значения.

Метод K-средних

Это один из самых популярных алгоритмов для кластеризации. Зафиксируем число K - размер палитры - и будем разбивать все значения атрибутов изображения на K кластеров.

// K - число центров кластеров = размер палитры
// moves - число перемещений при перестройке кластеров
// I - структура, содержащая изображение и информацию
// о принадлежности значений кластерам.
// Clusters - кластеры, Clasters.centers - центры кластеров

K = NOldColors;
// Выберем случайно К центров кластеров
Clusters.centers = GetRandomFromSet(I,k);
// Вычисляем принадлежность значений атрибутов кластерам
foreach( pixel in Image )
{
      pixel.cluster = Clusters.getClosest( pixel.color );
}
// Основная итерация алгоритма
// T1, T2 - пороги, iter - счетчик итераций
iter = 0;
while( ( moves != 0 ) OR ( moves < T1 AND iter > T2 ) )
{
      moves = 0;
      // пересчитываем центры кластеров
      foreach( cluster in Clusters )
      {
            colorSet = { pixel.color for pixels in I
                                          if( pixel.cluster = cluster ) };
            cluster.center = Average( colorSet );
      }
      foreach( pixel in I )
      {
            newcluster = Clusters.getClosest( pixel.color );
            if( newcluster != pixel.cluster )
           {
                  moves++;
                  pixel.cluster = newcluster;
            }
      }
      iter++;
}
// заполняем изображение
foreach( pixel in I )
{
      pixel.color = Clusters[pixel.cluster].center;
}
Листинг 12.5. Алгоритм кластеризации K-средних
Результат работы алгоритма K-средних.

Рис. 12.5. Результат работы алгоритма K-средних.

Выберем случайным образом K значений атрибутов из исходного изображения и положим их центрами кластеров. Сгруппируем точки по кластерам, т.е. отнесем значение к кластеру, центр которого находится ближе всего к значению. Далее для каждого кластера пересчитаем его центр (т.е. среднее арифметическое всех значений, входящих в кластер). Последнюю операцию нужно повторять до тех пор, пока либо перемещения значений из одного кластера в другой не прекратятся, либо после определенной (заданной наперед) итерации отношение перемещенных значений ко всем станет меньше, чем заданное наперед значение. Таким образом, будет сформировано K кластеров, соответствующих палитре. Палитру следует заполнить центрами кластеров. Заметим, что одновременно нам становится известна вся информация о квантовании, т.е. не только палитра, но и индивидуальная принадлежность значений атрибутов исходного изображения к конкретному кластеру (см. алгоритм 12.5).

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

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >