Преобразование выпуклой оболочки в бинарную маску

Я хочу сгенерировать бинарную маску, которая имеет единицы для всех вокселей внутри и нули для всех вокселей вне объема. Объем определяется выпуклой оболочкой вокруг набора трехмерных координат (<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 точка установлена.

Уже поздно, поэтому только очень отрывочное предложение:

  1. С помощью точек из вашего выпуклого корпуса создайте тесселяцию Делоне.
  2. Используя метод pointLocation класса DelaunayTri, проверьте каждую точку в вашем массиве пикселей.

Я ожидаю, что это будет очень медленно, и что есть лучшие решения, если кто-то придет в мои мечты, я опубликую завтра.

Это проблема преобразования сканирования. Ознакомьтесь с разделом 8 " Алгоритмы 3D-сканирования-преобразования для воксельной графики".

Требуемый алгоритм является сплошным и несколько проще, так как вы вокселизуете выпуклый многогранник, грани которого - треугольники - каждый "воксельный" прогон ограничен двумя треугольниками.

Другие вопросы по тегам