В сущности, вокселы представляют собой трехмерное расширение пикселей («объемных пикселей»), и они действительно могут использоваться для представления объемных данных.
Что объемное данные
Математически, объемные данные можно рассматривать как трехмерный функцию Р (х, у, г). Во многих приложениях эта функция является скалярной функцией, т. Е. Имеет одно скалярное значение в каждой точке (x, y, z) в пространстве. Например, в медицинских целях это может быть плотность определенных тканей.Чтобы представить это в цифровой форме, один общий подход состоит в том, чтобы просто сделать фрагменты данных: представить изображения на (X, Y) -плоскости и сдвинуть значение z, чтобы иметь несколько изображений. Если срезы близко друг к другу, изображения могут отображаться в видеопоследовательности, например, на вики-странице для МРТ-сканирования (https://upload.wikimedia.org/wikipedia/commons/transcoded/4/44/Structural_MRI_animation.ogv/Structural_MRI_animation.ogv.360p.webm). Как вы можете видеть, каждая точка в пространстве имеет одно скалярное значение, которое представлено как оттенки серого.
Вместо фрагментов или видео можно также представлять эти данные с помощью вокселей. Вместо того, чтобы делить 2D-плоскость в правильной сетке пикселей, мы теперь разделим трехмерную область в регулярной сетке вокселей. Опять же, скалярное значение может быть дано каждому вокселу. Тем не менее, визуализация это не так тривиально: тогда как мы могли бы просто дать серое значение пикселам, это не работает для вокселей (мы бы увидели только цвета самого окна, а не его интерьера). На самом деле эта проблема вызвана тем, что мы живем в трехмерном мире: мы можем смотреть на двумерное изображение из третьего измерения и полностью наблюдать за ним; но мы не можем смотреть на 3D-воксельное пространство и наблюдать за ним полностью, поскольку у нас нет 4-го измерения, из которого можно смотреть (если вы не подсчитаете время как 4-е измерение, т. е. создаете видео).
Таким образом, мы можем смотреть только на части данных. Один из способов, как указано выше, состоит в том, чтобы делать срезы. Другой способ - посмотреть на так называемые «изо-поверхности»: мы создаем поверхности в трехмерном пространстве, для которых каждая точка имеет одно и то же скалярное значение. Для медицинского сканирования это позволяет извлечь, например, часть мозга из объемных данных (а не только как срез, а как трехмерную модель).
Наконец, обратите внимание, что поверхности (сетки, террасы, ...) не являются объемными, они 2D-формы изогнуты, скручены, растянуты и деформированы для встраивания в 3D-пространство. В идеале они представляют границу объемного объекта, но не обязательно (например, данные о местности, вероятно, не будут закрытыми сетками). Способ представления поверхностей с использованием объемных данных заключается в том, что поверхность снова является изо-поверхностью некоторой функции. В качестве примера: F (x, y, z) = x^2 + y^2 + z^2 - R^2 может представлять сферу с радиусом R, центрированную вокруг начала координат. Для всех точек (x ', y', z ') сферы F (x', y ', z') = 0. Более того, для точек внутри сферы F < 0 и для точек за пределами сфера, F> 0.
Способ создания такой функции заключается в создании карты расстояния , т. е. создания объемных данных, так что каждая точка F (x, y, z) указывает расстояние до поверхность. Разумеется, поверхность представляет собой совокупность всех точек, для которых расстояние равно 0 (так, опять же, iso-surface со значением 0, как и с сферой выше).
Как реализовать
Как уже отмечалось другими, это действительно зависит от использования. По сути, данные могут быть представлены в трехмерной матрице. Однако, это огромный! Если вы хотите, чтобы разрешение удвоилось, вам нужно 8-кратное хранилище, поэтому, в общем, это не эффективное решение. Это будет работать для меньших примеров, но не очень хорошо масштабируется.
Структура octree, afaik, наиболее распространенная структура для хранения этого. Существует множество реализаций и оптимизаций для octrees, поэтому посмотрите, что можно использовать (re). Как отметил Андреас Калер, редкие октеты вокселов являются недавним подходом.
Octrees позволяют легче перемещаться по соседним ячейкам, родительским клеткам, дочерним ячейкам, ... (теперь я предполагаю, что понятие осей (или квадрантов в 2D) известно?) Однако, если многие листовые клетки расположены на лучшие решения, эта структура данных будет иметь огромные накладные расходы! Итак, это лучше, чем 3D-массив: это зависит от того, с какими объемными данными вы хотите работать, и с какими операциями вы хотите работать.
Если данные используются для представления поверхности, octrees будет вообще быть гораздо лучше: как указано выше, поверхности не очень объемные, поэтому не потребуют много вокселей иметь соответствующие данные (отсюда: «разреженный» octrees). Возвращаясь к картам расстояний, единственными релевантными данными являются точки, имеющие значение 0. Другие точки также могут иметь любое значение, но это не имеет значения (в некоторых случаях знак все еще рассматривается, для обозначения «внутренних» и «внутренних», экстерьер ", но само значение не требуется, если требуется только поверхность).
Как использовать
Если на «использование», вы задаетесь вопросом, как их делают, то вы можете посмотреть на «походных кубов» и его оптимизации. MC создаст треугольную сетку из объемных данных, которая будет отображаться любым классическим способом. Вместо перевода в треугольники вы также можете посмотреть рендеринг тома для рендеринга «3D-выборки данных» (то есть вокселей) как таковых (https://en.wikipedia.org/wiki/Volume_rendering). Я должен признать, что я не настолько разбираюсь в рендеринг тома, поэтому я оставлю его только на wiki-ссылке.
Для простоты: трехмерный массив. Для исполнения: [octree] (http://en.wikipedia.org/wiki/Octree) Я думаю. – BWG