3d координаты x, y, z в 3d массив numpy - PullRequest
0 голосов
/ 12 марта 2019

У меня есть 3d маска, которая является эллипсоидом.Я извлек координаты маски, используя np.argwhere.Координаты могут быть назначены как x, y, z как в примере кода.Мой вопрос заключается в том, как я могу вернуть свою маску (в виде трехмерного массива или логического массива той же формы) по координатам x, y, z?

import numpy as np
import scipy
import skimage
from skimage import draw

mask = skimage.draw.ellipsoid(10,12,18)
print mask.shape 

coord = np.argwhere(mask)

x = coord[:,0]
y = coord[:,1]
z = coord[:,2]

Приведенный выше код дает мне логическую маскуформы (23, 27, 39), и теперь я хочу построить ту же маску точно такой же формы, используя координаты X, Y, Z.Как это можно сделать?

Я бы хотел немного изменить приведенный выше вопрос.Теперь, если я поверну мои координаты, используя кватернион, который даст мне новый набор координат, а затем с новыми координатами x1, y1, z1, я хочу построить свою логическую маску формы (23,27,39) как маску исходной маски?Как это можно сделать?

import quaternion
angle1 = 90
rotation = np.exp(quaternion.quaternion(0,0, 1) * angle1*(np.pi/180) / 2)
coord_rotd = quaternion.rotate_vectors(rotation, coord)
x1 = coord_rotd[:,0]
y1 = coord_rotd[:,1]
z1 = coord_rotd[:,2]

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Вы можете напрямую использовать x, y и z для восстановления вашей маски. Сначала используйте новый массив той же формы, что и ваша маска. Я предварительно заполнил все нулями (т. Е. False). Затем установите для каждой координаты, определенной x, y и z, значение True:

new_mask = np.zeros_like(mask)
new_mask[x,y,z] = True

# Check if mask and new_mask is the same
np.allclose(mask, new_mask)
# True

Если вы спросите, можете ли вы восстановить свою маску только , зная x, y и z, это невозможно. Потому что вы теряете информацию о том, что не заполнено. Просто представьте, что ваш эллипсоид находится в углу огромного куба. Как бы вы узнали (только зная, как выглядит эллипсоид), насколько велик куб?

Относительно вашего второго вопроса:

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

def fixCoordinates(coord, shape):
    # move to the positive edge
    #  remove negative indices
    #  you can also add now +1 to 
    #  have a margin around your ellipse
    coord -= coord.min(0)

    # trim coordinates outside of scene
    for i, s in enumerate(shape):
        coord[coord[:,i] >= s] = s-1

    # Return coordinates and change dtype
    return coord.astype(np.int)

И если вы немного измените свой код, вы можете использовать ту же стратегию, что и раньше:

# your code
import quaternion
angle1 = 90
rotation = np.exp(quaternion.quaternion(0,0, 1) * angle1*(np.pi/180) / 2)
coord_rotd = quaternion.rotate_vectors(rotation, coord_rotd)

# Create new mask
new_mask2 = np.zeros_like(new_mask)
# Fix coordinates
coord_rotd = fixCoordinates(coord_rotd, mask.shape)

x1 = coord_rotd[:,0]
y1 = coord_rotd[:,1]
z1 = coord_rotd[:,2]

# create new mask, similar as before
new_mask2[x1, y1, z1] = True

Учитывая ваш пример поворота, теперь вы можете строить обе маски (одинаковой формы) бок о бок:

old mask and new mask

0 голосов
/ 12 марта 2019

Если вы знаете форму своей старой маски, попробуйте это:

new_mask = np.full(old_mask_shape, True) # Fill new_mask with True everywhere
new_mask[x,y,z] = False                  # Set False for the ellipsoid part alone

Примечание:

  1. old_mask_shape должно совпадать с формой изображения , к которому вы собираетесь применить маску .
  2. Если вам нужна маска True вместо False (если вы хотите, чтобы часть эллипсоида была True, а где-то еще False), просто поменяйте местами True и False в двух предыдущих строки кода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...