введите описание изображения здесь
Я хочу сегментировать это трехмерное облако точек на три отдельных облака, например так: введите описание изображения здесь
Сегментация должна работать на различных моделях без необходимости вручную фиксировать маркеры или указывать количество сегментаций, которые должны быть выполнены.
Код ниже для того же результата, что и на рисунках:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
data = np.array([[[0, 0, 0, 0],
[0, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 0],
[0, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 0],
[0, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 0],
[0, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 0],
[0, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 0],
[0, 0, 0, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 1],
[0, 0, 0, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 1],
[0, 0, 0, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 1],
[0, 0, 0, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]], [[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 0, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 0]]])
data = 1-data
label_array = (label(data, neighbors = 4, connectivity=3))
highval = np.max(label_array)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
xs = []
ys = []
zs = []
cs = []
for s in range(highval):
straw = np.argwhere(label_array==s+1)
for i in range(len(straw)):
cs.append(s)
li = straw[i]
xs.append(li[0])
ys.append(li[1])
zs.append(li[2])
coord_1 = []
df = pd.DataFrame()
df['x'] = pd.Series(xs)
df['y'] = pd.Series(ys)
df['z'] = pd.Series(zs)
df['c'] = pd.Series(cs)
print(df)
ax.scatter(df['x'], df['y'], df['z'], c = df['c'],s = 50, cmap = plt.cm.spring)
plt.show()