Тематическое задание 12.7. Квантование цвета методом октодерева Уровень сложности III.
Напишите программу, которая позволит вам экспериментировать с методом квантования цвета с помощью октодерева. Напишите соответствующий алгоритм сами, скачайте код, выполняющий данный алгоритм, из Интернета, или возьмите из книг (например, [Lindley, 132]). Из файла читается полноцветное изображение. Затем пользователь выбирает допустимое число различных цветов К. Программа сканирует изображение, строит октодерево с К цветами-представителями, после чего просматривает дерево для присвоения индекса каждому его листу. Затем изображение просматривается повторно, для
12.7. Тематические задания каждого пиксела в дереве находится индекс и-отображается соответствующий цвет. На экране изображаются рядом две версии этого изображения: слева - полноцветная, а справа - после квантования. Вам может понадобиться следующий тип данных для узла октодерева:
class Node{
public:
int isLeaf: // 1 if this node is a leaf // 1. если данный узел является листом
int whichLevel: // the level this node is at // уровень, на котором находится данный узел
int index: // its LUT index - assigned in pass 2 // его индекс в таблице LUT - присваивается // при втором проходе
int numChildren: // number of children this node has // число потомков данного узла
long numTimes: // # colors seen in this sub-block // число цветов, представленных в данном подблоке
long Rsum. Gsum. BSum; // sum of color values accumulated // сумма накопленных значений цветов
Node* nextCand: // candidate for reducing at this level // кандидат на отсечение на данном уровне
Node* child[8]: // the 8 children of this node // 8 потомков данного узла }: Ниже приводятся скелеты некоторых основных подпрограмм метода:
insertTree(Node& node. BYTE rgb[]) {
// insert 24-bit color rgb into subtree
// добавляем 24-битовый цвет rgb в поддерево
if(node - NULL)
makeNewNode(node): // make & initialize a new node // создаем и инициализируем новый узел
if(node.isLeaf)
{
node.numTimes++: // inc # of pixels represented // увеличиваем число представленных цветов