Уменьшить объемную маску 3D с помощью одинакового поля в python - PullRequest
0 голосов
/ 30 августа 2018

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

Есть ли простой способ сделать это с помощью некоторых распространенных библиотек (numpy, scipy, pandas и т. Д.)?

Я нашел в сети некоторый код , который использует несколько циклов for для расширения маски на одно измерение. Это работает для случая расширения, но я чувствую, что есть более компактный выход.

Вот минимальный пример того, что я ищу в 2D.

Оригинал

array([[0., 0., 1., 0., 0.],
       [0., 1., 1., 1., 0.],
       [1., 1., 1., 1., 1.],
       [0., 1., 1., 1., 0.],
       [0., 0., 1., 0., 0.]])

Равномерное уменьшение на 1 пиксель

array([[0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 1., 1., 1., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0.]])

Но я хочу, чтобы это было в трехмерном пространстве. Спасибо за любой вклад.

1 Ответ

0 голосов
/ 30 августа 2018

Возможно, вы ищете scipy.ndimage.binary_erosion(a):

a = np.array([
    [0., 0., 1., 0., 0.],
    [0., 1., 1., 1., 0.],
    [1., 1., 1., 1., 1.],
    [0., 1., 1., 1., 0.],
    [0., 0., 1., 0., 0.]
])
b = scipy.ndimage.binary_erosion(a)  # returns an array of bool

Обратите внимание, что это также приведет к разрушению внутренних поверхностей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...