Воксели внутри 3D выпуклой оболочки

У меня есть кубическая матрица вокселей значения 1 (остальное 0). Мне нужна матрица того же размера, где воксели ВНУТРИ выпуклой оболочки имеют все значение 1, Я видел похожий пример и адаптировал его: если я сделаю это для следующего, это сработает?

% im3D - кубическая матрица нулей и единиц

**[x,y,z]=ind2sub(size(im3D), find(im3D==value));
pointMatrix(:,1) = x;
pointMatrix(:,2) = y;
pointMatrix(:,3) = z;
[K,V] = convhull(x,y,z);
dt = DelaunayTri(pointMatrix);
[X,Y,Z] = meshgrid(1:size(im3D));   
simplexIndex = pointLocation(dt,X(:),Y(:),Z(:));
filled_chull = ~isnan(simplexIndex);
filled_chull = reshape(filled_chull,size(X));**

Второй вопрос: воксели внутри выпуклой оболочки должны быть все связаны, верно? тогда почему следующая функция дает мне два связанных объекта: евклидовый или манхэттеноподобный / восьмиугольник?

**function [nEL, nVOX] = im3D_countobj(im3D,METRIC)
% set METRIC either 'euclidean' or 'octagon'
ES = mmsedisk(1,'3D',METRIC);
q = bwlabeln(im3D,mmseshow(ES));
nEL = max(max(max(q)));
nVOX = size(find(im3D),1);
end**

1 ответ

При условии, что:
- разрешение не слишком высокое (что я предполагаю, поскольку вы используете 3D-воксели)
- вы удовлетворены приблизительным решением
- скорость не проблема

тогда вы можете попробовать вариант использования морфологических операторов. Утолщая ваши воксели с помощью набора вращающихся утолщающих структурных элементов, вы получаете приблизительный выпуклый корпус.

Пример такого расчета в 2D показан на:

http://homepages.inf.ed.ac.uk/rbf/HIPR2/thick.htm

В противном случае ваш вариант генерации трехмерных точек и вычисления Делоне также является обоснованным вариантом. Вы можете попробовать код, который вы показали.

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