Octree - Octree
An октодерево это древовидная структура данных в котором каждый внутренний узел ровно восемь дети. Октодеревья чаще всего используются для разбиения трехмерное пространство от рекурсивно деление это в восемь октантов. Октодеревья являются трехмерным аналогом квадродеревья. Название образовано от окт + дерево, но учтите, что обычно пишется "октодерево"только с одним" t. Октодеревья часто используются в 3D графика и 3D игровые движки.
Для пространственного представления
Каждый узел в октодереве делит пространство, которое он представляет, на восемь октанты. В октодереве точечной области (PR) узел хранит явное трехмерная точка, который является «центром» подразделения для этого узла; точка определяет один из углов для каждого из восьми детей. В октодереве на основе матрицы (MX) точка подразделения неявно является центром пространства, которое представляет узел. Корневой узел октодерева PR может представлять бесконечное пространство; корневой узел октодерева MX должен представлять конечное ограниченное пространство, чтобы неявные центры были четко определены. Обратите внимание, что Octrees - это не то же самое, что k-d деревья: k-d деревья разбиваются по размеру, а октодеревья разбиваются вокруг точки. Также k-d деревья всегда являются двоичными, чего нельзя сказать о октодеревьях. поиск в глубину узлы должны быть пересечены, и должны быть просмотрены только требуемые поверхности.
История
Использование октодеревьев для 3D компьютерная графика был впервые предложен Дональдом Мигером в Политехнический институт Ренсселера, описанный в отчете 1980 года «Кодирование октодерева: новый метод представления, манипулирования и отображения произвольных трехмерных объектов с помощью компьютера»,[1] на который он имеет патент 1995 г. (с 1984 г. дата приоритета ) «Высокоскоростное создание изображений сложных твердых объектов с использованием кодирования октодерева» [2]
Общее использование
- Уровень детализации рендеринг в 3D компьютерная графика[3]
- Пространственная индексация
- Поиск ближайшего соседа[4]
- Эффективный обнаружение столкновения в трех измерениях
- Просмотр усеченной выбраковки
- Быстрый мультипольный метод
- Неструктурированная сетка
- Анализ методом конечных элементов
- Редкое воксельное октодерево[5]
- Оценка состояния[6]
- Установить оценку[7]
Применение к квантованию цвета
Октодерево цветное квантование Алгоритм, изобретенный Герваутцем и Пургатхофером в 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)))
Смотрите также
- Разделение двоичного пространства
- Иерархия ограничивающих интервалов
- Куб 2: Зауэрбратен, трехмерный игровой движок, в котором геометрия почти полностью основана на октодеревьях
- id Tech 6 это движок трехмерной игры, использующий воксели, хранящиеся в октодеревьях
- Irrlicht Engine, поддерживает узлы сцены октодерева
- Клее проблема меры
- Линейное октодерево
- ОГРЭ, имеет реализацию менеджера сцены октодерева
- Подмощение
- Воксель
- Quadtree
использованная литература
- ^ Мигер, Дональд (октябрь 1980 г.). «Кодирование октодерева: новый метод представления, манипулирования и отображения произвольных трехмерных объектов с помощью компьютера». Политехнический институт Ренсселера (Технический отчет IPL-TR-80-111).
- ^ Мигер, Дональд. «Высокоскоростное создание изображений сложных твердых объектов с использованием кодирования октодерева». USPO. Получено 20 сентября 2012.
- ^ Дэвид П. Любке (2003). Уровень детализации 3D-графики. Морган Кауфманн. ISBN 978-1-55860-838-2.
- ^ Эльзеберг, Ян и др. "Сравнение стратегий поиска ближайшего соседа и реализаций для эффективной регистрации формы. "Журнал программной инженерии для робототехники 3.1 (2012): 2-12.
- ^ Акенин-Мёллер, Томас; Хейнс, Эрик; Хоффман, Нэти (2018-08-06). Рендеринг в реальном времени, четвертое издание. CRC Press. ISBN 978-1-351-81615-1.
- ^ Хеннинг Эберхард, Веса Клумпп, Уве Д. Ханебек, Деревья плотности для эффективного нелинейного оценивания состояния, Материалы 13-й Международной конференции по слиянию информации, Эдинбург, Великобритания, июль 2010 г.
- ^ В. Древелле, Л. Жаулин и Б. Зерр, Гарантированная характеристика исследуемого пространства мобильного робота с помощью вспомогательных материалов, NOLCOS 2013.
- ^ Блумберг, Дэн С. «Цветовое квантование с использованием октодеревьев»., 4 сентября 2008 г. Проверено 12 декабря 2014 г.
внешние ссылки
- Квантование октодерева в Microsoft Systems Journal
- Квантование цвета с использованием октодеревьев доктора Добба
- Квантование цвета с использованием октодеревьев в исходном коде доктора Добба[постоянная мертвая ссылка ]
- Обзор квантования цвета октодерева
- Параллельная реализация алгоритма генерации октодерева, П. Соджан Лал, А. Унникришнан, К. Пулозе Якоб, ICIP 1997, IEEE Digital Library
- Генерация октодеревьев из растрового сканирования с уменьшенной потерей информации, П. Соджан Лал, А. Унникришнан, К. Пулозе Джейкоб, Международная конференция IASTED VIIP 2001 [1][постоянная мертвая ссылка ]
- Параллельные октодеревья для приложений с конечными элементами
- Видео: Использование октодерева в оценке состояния