Преобразование выпуклой оболочки в бинарную маску
Я хочу сгенерировать бинарную маску, которая имеет единицы для всех вокселей внутри и нули для всех вокселей вне объема. Объем определяется выпуклой оболочкой вокруг набора трехмерных координат (<100; некоторые из координат находятся внутри объема).
Я могу получить выпуклую оболочку, используя CONVHULLN, но как мне преобразовать это в двоичную маску?
В случае, если нет хорошего способа пройти через выпуклую оболочку, есть ли у вас какие-либо другие идеи, как я мог бы создать бинарную маску?
3 ответа
Вы можете решить эту проблему, используя классDelaunayTri и методpointLocation. Вот пример:
pointMatrix = rand(20,3); %# A set of 20 random 3-D points
dt = DelaunayTri(pointMatrix); %# Create a Delaunay triangulation
[X,Y,Z] = meshgrid(0:0.01:1); %# Create a mesh of coordinates for your volume
simplexIndex = pointLocation(dt,X(:),Y(:),Z(:)); %# Find index of simplex that
%# each point is inside
mask = ~isnan(simplexIndex); %# Points outside the convex hull have a
%# simplex index of NaN
mask = reshape(mask,size(X)); %# Reshape the mask to 101-by-101-by-101
Вышеприведенный пример создает логическую маску для сетки 101 на 101 на 101, охватывающую единичный объем (от 0 до 1 в каждом измерении), с 1 (true) для точек сетки внутри выпуклой оболочки 3-D точка установлена.
Уже поздно, поэтому только очень отрывочное предложение:
- С помощью точек из вашего выпуклого корпуса создайте тесселяцию Делоне.
- Используя метод pointLocation класса DelaunayTri, проверьте каждую точку в вашем массиве пикселей.
Я ожидаю, что это будет очень медленно, и что есть лучшие решения, если кто-то придет в мои мечты, я опубликую завтра.
Это проблема преобразования сканирования. Ознакомьтесь с разделом 8 " Алгоритмы 3D-сканирования-преобразования для воксельной графики".
Требуемый алгоритм является сплошным и несколько проще, так как вы вокселизуете выпуклый многогранник, грани которого - треугольники - каждый "воксельный" прогон ограничен двумя треугольниками.