Как создать изогнутую трубку из 2D срезов путем смещения координат центра? - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь создать трехмерную матрицу с проходящей через нее трубной структурой. Я могу сделать трубу прямой, скопировав массив 2D numpy с окружностью в центре (x, y), и я могу сделать трубку наклонной, добавив int к оси x или y в каждом срезе, который я генерирую. У меня вопрос, как я могу переместить координаты (x, y), чтобы они могли сформировать кривую? Я не могу добавить размеры шагов изогнутых функций, таких как синус и косинус, к координатам, поскольку для индексации массива numpy это должно быть целое число. Что такое умный способ для создания изогнутой трубы из 2D срезов путем смещения координат центра?

Вот код, который я использую для создания прямой трубы в качестве 3D-матрицы:

import numpy as np 
import cv2
import matplotlib.pyplot as plt

slice_2d = np.zeros((128,128))
circle_center = (50,50)
radius=10

slice_2d = cv2.circle(slice_2d, circle_center, radius, color=1, thickness=-1)
plt.imshow(slice_2d)

# then we repeat the slice 128 times to create a straight tube in a 3D matrix of 128,128,128
tube_matrix = []
for i in range(0,128):
    tube_matrix.append(slice_2d)

tube_matrix = np.array(tube_matrix)

1 Ответ

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

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

Я использовал кривую для этого поста .

Вот l oop, который добавляет кусочки:

tube_matrix = []
for i in range(128):    
    circle_center = np.round(curve[i]*12 + 15).astype(int)
    slice_2d = cv2.circle(np.zeros((128,128)), tuple(circle_center), radius, color=1, thickness=-1)
    tube_matrix.append(slice_2d)

Каждая итерация центра круга изменяется в соответствии со значением curve[i].
Обратите внимание, что curve[i] масштабируется и округляется (и преобразуется в int).


Вот полный код (с некоторым тестовым кодом):


Тестовое изображение (img):

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