Разъяснение по алгоритму марширующих кубов

Что касается Marching Cubes, у меня есть некоторые сомнения относительно его алгоритма и реализации. Я прочитал прекрасную статью Пола Бурка о Marching Cubes, а также доступный исходный код на сайте, но все же столкнулся с некоторыми проблемами с точки зрения понимания, а также того, как реализовать алгоритм по-своему. Вопросы следующие:

  • Размер сетки — я читал, что размер сетки влияет на качество создаваемой 3D-модели. Например, если у меня есть набор рентгеновских изображений с размером (200 * 200 * 200), поэтому плита ячеек сетки будет построена из 2 соседних фрагментов изображения. Таким образом, общее количество ячеек сетки в плите будет (200-1)*(200-1), причем каждый угол ячейки сетки соответствует значению/плотности пикселя изображения. Это правильно?? Кроме того, как нам реализовать различный размер для gridcell??

  • Размер вокселя. Я прочитал несколько ссылок на Marching Cubes и, похоже, не могу найти, как в алгоритме учитывается размер вокселя. Пожалуйста, поправьте меня, если я ошибаюсь, в моем случае зазор между соседним слоем изображений составляет 1 мил; таким образом, как мне позаботиться о тех, кто находится в алгоритме Marching Cubes, или это тупик ?? Учитывается ли это как размер Gridcell ?? (Предположение: размер одного пикселя по координате xy составляет 19 микрон, а длина gap/z составляет 25,4 микрона/1 ​​мил)

  • Координаты угла сетки (координаты вершин куба) - я пытаюсь назначить координаты углов ячеек сетки с индексом i j k путем вложенного цикла размера набора изображений (200 * 200 * 200). Это правильно?? Есть ли способ сделать это быстрее??

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


person vincent911001    schedule 02.06.2015    source источник


Ответы (1)


Много вопросов. Я постараюсь дать несколько советов. First of 200^3 — довольно маленький набор данных для ct! как насчет 1024^3? :)

Маршевые кубики построены для регулярных сеток. Таким образом, не имеет значения, определены ли данные в вершинах или центрах куба: просто сдвиньте их на половину размера куба! Если у вас есть нерегулярные данные, используйте что-то другое или сначала выполните повторную выборку в обычную сетку.

Вы также, кажется, упускаете из виду «походную» часть: идея состоит в том, чтобы найти один куб с поверхностью и залить оттуда. Кубики, которые все снаружи или все внутри, останавливают поиск. Таким образом, на большинство кубов в вашей огромной регулярной сетке даже не нужно смотреть.

Масштабирование до реальных единиц должно быть последним шагом. Думайте о входном объеме как о нормализованном до 1x1x1. Затем масштабируйте выходные вершины до физических единиц. Данные, которые у вас есть, — это данные, которые у вас есть. Любая передискретизация должна выполняться перед реконструкцией или фильтрацией. Ей нет места на этапе геометрии.

Я не уверен, что понял последний вопрос, но одна вещь, которая действительно важна для дальнейшей обработки, — это создание связанной индексированной сетки. Один важный трюк — просто сохранить своего рода хэш-таблицу предыдущего слайса/строки/соседнего элемента. Таким образом, вы можете быстро найти уже созданные вершины и повторно использовать их индекс. В результате должна получиться связная сетка с уникальными вершинами. Затем вы можете использовать его в любой обработке геометрии.

person starmole    schedule 02.06.2015
comment
Привет, да, указанный размер изображения довольно мал, но на самом деле у меня был бы набор изображений размером около 2000 * 2000 * 201 с чем-то. Что касается ячейки сетки, состоят ли восемь углов ячейки сетки из значений пикселей из соседних срезов (2 пикселя из n среза + 2 пикселя из n+1 среза)?? - person vincent911001; 02.06.2015
comment
действительно, спасибо за ваш совет, он действительно развеял некоторые мои сомнения. Большое спасибо - person vincent911001; 02.06.2015
comment
@vincent911001: не говоря уже о размере кусочка. ваш куб всегда x, y, z - x + 1, y + 1 + z + 1. Итак, 4 значения из среза z в точке (x, y)-(x+1,y+1) и 4 значения из среза z+1 в точке (x,y)-(x+1,y+1) — это ваш куб. Любое масштабирование должно быть постобработкой или предварительной обработкой. - person starmole; 02.06.2015
comment
Привет, стармоле, спасибо за четкое описание, оно действительно помогает. Кстати, вершины ячейки сетки созданы с использованием индекса счетчика цикла (например: i, j, k, который используется для цикла по всему объему)?? - person vincent911001; 02.06.2015
comment
Один простой способ — всякий раз, когда вы создаете вершину в кубе (x, y, z) плюс (1/0,1/0,1/0): найдите ее в хэш-таблице, индексированной уникальным ключом (x, y, z, 0/1,0/1,0/1). Если его нет, создайте его, в противном случае используйте файл index. Теперь первый трюк состоит в том, чтобы понять, что для любых x, y, z вам нужны только 3 возможные вершины: вниз x, вниз y, вниз z. Второй трюк заключается в том, чтобы знать, что когда вы проходите через сетку тура сверху вниз, слева направо, спереди снизу, этот стол очень мал. Вы просто проверяете, используете ли ( havevertex(x,y,z,down/left/back) ), иначе addit(). А hasvertex — это просто хэш-таблица. - person starmole; 02.06.2015
comment
Большое спасибо, starmole, если я правильно понял ваш совет, он заключается в том, чтобы поместить или сохранить интерполированные вершины, сгенерированные из MC, в хеш-таблицу, чтобы иметь возможность повторно использовать их или экспортировать в какой-либо формат файла геометрии, это правильно? ? Прежде чем я получу вывод вершин или граней, мне нужно будет обработать 8 углов вершин в MC, чтобы определить, какие ребра пересекаются, и после этого применить интерполяцию для получения вершин, верно?? что я хотел бы знать, так это как создать начальные вершины ячеек сетки ?? - person vincent911001; 02.06.2015
comment
я имею в виду, что если вы создаете вершины для первого куба, соседние кубы должны повторно использовать их (индексированная сетка). Делайте по одному кубику за раз. Но перед созданием новой вершины на ребре (x,y,z) - (x+dx, y+dy, z+dz) сначала найдите ее в хэше - если она есть, выведите этот индекс. Если не добавить. Таким образом, вы получите связную сетку, которую легко обрабатывать. - person starmole; 02.06.2015
comment
Привет, starmole, я думаю, я знаю, что ты пытаешься мне сказать, большое спасибо за твое предложение, кстати. - person vincent911001; 02.06.2015
comment
НП. Марширующие кубы — один из алгоритмов, который мне очень нравится. :) Так что я люблю говорить об этом! Удачи! И если у вас есть еще вопросы, не стесняйтесь спрашивать. - person starmole; 02.06.2015
comment
Конечно, я буду держать вас в курсе, если столкнусь с какой-либо проблемой при ее реализации. Большое спасибо кстати. - person vincent911001; 02.06.2015
comment
Давайте продолжим обсуждение в чате. - person vincent911001; 03.06.2015