Как «заполнить» глубокие вогнутые области трехмерной формы в Python

введите описание изображения здесьУ меня есть данные, описывающие объем, содержащийся в трехмерных структурах клеточной стенки, как воксельные данные (1 внутри клеточной стенки, 0 снаружи клеточной стенки), так и поверхностные сетки (3D-координаты и связанные триангуляции) . То, что мне нужно, это просто общий контур формы ячейки.

Все ячейки имеют полую область в центре (заполненную 0 для вокселей, так как она находится за пределами клеточной стенки). Для большинства клеток он полностью заключен в клеточную стенку, так что и сетка, и воксели образуют трехмерную оболочку. Это нормально, так как мне несложно заполнить центральную область. Однако в некоторых случаях имеется отверстие, так что внутреннее отверстие имеет прямой «туннель» наружу из клетки, как показано на прикрепленном рисунке. Мне нужно закрыть это, так как мне просто нужен контур всей формы ячейки. Проблема в том, как мне закрыть этот туннель изнутри? Ячейка имеет шероховатую поверхность с множеством незначительных вогнутых областей, которые хорошо видны, хотя эта массивная вогнутая область, простирающаяся до центра ячейки, неприемлема.

Я пытался использовать алгоритм альфа-формы, но все примеры, которые я нашел в 3D, использовали триангуляцию Делоне, которая плохо работает с моими данными (я использовал код из верхнего ответа здесь: Альфа-фигуры в 3D). Может ли это быть возможным решением, если использовать его вместе с моей собственной триангуляцией поверхностной сетки? Или есть способы лучше? По сути, алгоритм трехмерного вогнутого корпуса - это то, что мне нужно, я думаю. Я работаю на Питоне.

Большое спасибо за любые идеи.


person harry    schedule 24.08.2020    source источник
comment
Вы действительно имеете в виду вогнутыйпещерный корпус?   -  person Davis Herring    schedule 25.08.2020
comment
Есть ли в библиотеке, которую вы используете для обработки этих 3D-данных, операции расширения/сжатия (увеличения/сжатия)? Расширьте на величину, превышающую половину диаметра нежелательного отверстия, затем сузьте на ту же величину. Это должно закрыть дыру, но приведет к размытию других деталей.   -  person jasonharper    schedule 25.08.2020
comment
Вы можете выполнять рейкаст из пустого местоположения вокселя в N равномерно распределенных направлениях. Если вы попали в воксель вашей модели во всех случаях, то воксель находится внутри такой дыры.   -  person Jan Schultke    schedule 25.08.2020
comment
Да, вогнутый корпус, я думаю, поэтому он допускает небольшие вогнутые области, но любые более глубокие вогнутые области, такие как центральное отверстие, будут закрыты (через некоторый порог «вогнутости»). Я считаю, что выпуклый корпус просто скроет все детали формы.   -  person harry    schedule 26.08.2020
comment
Метод расширения и сжатия работает хорошо. Он закрывает «туннель», и я могу легко заполнить образовавшуюся дыру. Как вы говорите, это связано с некоторым затемнением деталей, но я думаю, что это лучший метод. Большое спасибо   -  person harry    schedule 26.08.2020