Octree - Octree

Слева: Рекурсивное разбиение куба на октанты. Справа: соответствующее октодерево.

An октодерево это древовидная структура данных в котором каждый внутренний узел ровно восемь дети. Октодеревья чаще всего используются для разбиения трехмерное пространство от рекурсивно деление это в восемь октантов. Октодеревья являются трехмерным аналогом квадродеревья. Название образовано от окт + дерево, но учтите, что обычно пишется "октодерево"только с одним" t. Октодеревья часто используются в 3D графика и 3D игровые движки.

Для пространственного представления

Каждый узел в октодереве делит пространство, которое он представляет, на восемь октанты. В октодереве точечной области (PR) узел хранит явное трехмерная точка, который является «центром» подразделения для этого узла; точка определяет один из углов для каждого из восьми детей. В октодереве на основе матрицы (MX) точка подразделения неявно является центром пространства, которое представляет узел. Корневой узел октодерева PR может представлять бесконечное пространство; корневой узел октодерева MX должен представлять конечное ограниченное пространство, чтобы неявные центры были четко определены. Обратите внимание, что Octrees - это не то же самое, что k-d деревья: k-d деревья разбиваются по размеру, а октодеревья разбиваются вокруг точки. Также k-d деревья всегда являются двоичными, чего нельзя сказать о октодеревьях. поиск в глубину узлы должны быть пересечены, и должны быть просмотрены только требуемые поверхности.

История

Использование октодеревьев для 3D компьютерная графика был впервые предложен Дональдом Мигером в Политехнический институт Ренсселера, описанный в отчете 1980 года «Кодирование октодерева: новый метод представления, манипулирования и отображения произвольных трехмерных объектов с помощью компьютера»,[1] на который он имеет патент 1995 г. (с 1984 г. дата приоритета ) «Высокоскоростное создание изображений сложных твердых объектов с использованием кодирования октодерева» [2]

Общее использование

Применение к квантованию цвета

Октодерево цветное квантование Алгоритм, изобретенный Герваутцем и Пургатхофером в 1988 году, кодирует данные цвета изображения как октодерево глубиной до девяти уровней. Октодеревья используются, потому что и есть три цветовых компонента в RGB система. Индекс узла, от которого требуется ответвление на верхнем уровне, определяется формулой, в которой используются наиболее значимые биты компонентов красного, зеленого и синего цветов, например 4р + 2г + б. Следующий более низкий уровень использует значение следующего бита и так далее. Менее значимые биты иногда игнорируются, чтобы уменьшить размер дерева.

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

Реализация точечной декомпозиции

Схема рекурсивного алгоритма ниже (MATLAB синтаксис) разбивает массив 3-х мерных точек на ячейки стиля октодерева. Реализация начинается с одного бина, окружающего все заданные точки, который затем рекурсивно разделяется на 8 областей октодерева. Рекурсия останавливается, когда выполняется заданное условие выхода. Примеры таких условий выхода (показаны в коде ниже):

  • Когда в корзине меньше заданного количества точек
  • Когда бункер достигает минимального размера или объема в зависимости от длины его краев
  • Когда рекурсия достигла максимального количества подразделений
функция[binDepths, binParents, binCorners, pointBins] =OcTree(точки)binDepths = [0]     % Инициализировать массив глубин бункеров с помощью этого единственного бина базового уровняbinParents = [0]    % Эта ячейка базового уровня не является дочерней по отношению к другим ячейкамbinCorners = [мин(точки) Максимум(точки)] % Он окружает все точки в пространстве XYZpointBins(:) = 1    % Первоначально все точки назначаются этой первой ячейкеделить(1)           % Начните разделение этой первой корзиныфункцияделить(binNo)% Если этот лоток удовлетворяет каким-либо условиям выхода, не разделяйте его дальше.binPointCount = nnz(pointBins==binNo)binEdgeLengths = binCorners(binNo,1:3) - binCorners(binNo,4:6)binDepth = binDepths(binNo)exitConditionsMet = binPointCount<ценность || мин(binEdgeLengths)<ценность || binDepth>ценностьесли exitConditionsMet    вернуть; % Выход из рекурсивной функцииконец % В противном случае разделите эту ячейку на 8 новых вложенных ячеек с новой точкой разделения.newDiv = (binCorners(binNo,1:3) + binCorners(binNo,4:6)) / 2для я = 1:8    newBinNo = длина(binDepths) + 1    binDepths(newBinNo) = binDepths(binNo) + 1    binParents(newBinNo) = binNo    binCorners(newBinNo) = [один из то 8 пары из то newDiv с участием minCorner или maxCorner]    oldBinMask = pointBins==binNo    % Вычислить, какие точки в pointBins == binNo теперь принадлежат newBinNo     pointBins(newBinMask) = newBinNo    % Рекурсивно разделите эту вновь созданную корзину    делить(newBinNo)конец

Пример цветового квантования

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

% Прочитать исходное изображение RGBImg = я читал('IMG_9980.CR2');% Извлечь пиксели как тройные точки RGBбаллы = изменить форму(Img,[],3);% Создать объект декомпозиции OcTree с использованием целевой емкости бункераОТ = OcTree(баллы,'BinCapacity',потолок((размер(баллы,1) / 256) *7));% Найдите ячейки, которые являются "листовыми узлами" объекта октодеревалистья = найти(~член(1:ОТ.BinCount, ОТ.BinParents) & ...    член(1:ОТ.BinCount,ОТ.PointBins));% Найдите центральное расположение RGB каждой корзины для листьевbinCents = значить(изменить форму(ОТ.BinBoundaries(листья,:),[],3,2),3); % Создайте новое "проиндексированное" изображение с картой цветовImgIdx = нули(размер(Img,1), размер(Img,2));для i = 1: длина (листы)    pxNos = найти(ОТ.PointBins==листья(я));    ImgIdx(pxNos) = я;конецImgMap = binCents / 255; % Преобразование 8-битного цвета в значения MATLAB rgb % Отобразить исходное 532818-цветное изображение и получить 184-цветное изображение фигураподзаговор (1,2,1), imshow (Img)заглавие(спринт("Исходное цветное изображение% d", размер(уникальный(баллы,'строки'),1)))подсюжет(1,2,2), imshow(ImgIdx, ImgMap)заглавие(спринт('Цветное изображение, квантованное по октодереву% d', размер(ImgMap,1)))

Смотрите также

использованная литература

  1. ^ Мигер, Дональд (октябрь 1980 г.). «Кодирование октодерева: новый метод представления, манипулирования и отображения произвольных трехмерных объектов с помощью компьютера». Политехнический институт Ренсселера (Технический отчет IPL-TR-80-111).
  2. ^ Мигер, Дональд. «Высокоскоростное создание изображений сложных твердых объектов с использованием кодирования октодерева». USPO. Получено 20 сентября 2012.
  3. ^ Дэвид П. Любке (2003). Уровень детализации 3D-графики. Морган Кауфманн. ISBN  978-1-55860-838-2.
  4. ^ Эльзеберг, Ян и др. "Сравнение стратегий поиска ближайшего соседа и реализаций для эффективной регистрации формы. "Журнал программной инженерии для робототехники 3.1 (2012): 2-12.
  5. ^ Акенин-Мёллер, Томас; Хейнс, Эрик; Хоффман, Нэти (2018-08-06). Рендеринг в реальном времени, четвертое издание. CRC Press. ISBN  978-1-351-81615-1.
  6. ^ Хеннинг Эберхард, Веса Клумпп, Уве Д. Ханебек, Деревья плотности для эффективного нелинейного оценивания состояния, Материалы 13-й Международной конференции по слиянию информации, Эдинбург, Великобритания, июль 2010 г.
  7. ^ В. Древелле, Л. Жаулин и Б. Зерр, Гарантированная характеристика исследуемого пространства мобильного робота с помощью вспомогательных материалов, NOLCOS 2013.
  8. ^ Блумберг, Дэн С. «Цветовое квантование с использованием октодеревьев»., 4 сентября 2008 г. Проверено 12 декабря 2014 г.

внешние ссылки