У меня есть трехмерное изображение в виде многослойного файла TIF, это двоичный том, показывающий пятна в определенных местах.У меня также есть выходные данные из алгоритма прогнозирования, который предсказывает координаты упомянутых BLOB-объектов на изображении.
До сих пор я читал и записывал файлы tif, используя imageio.volread
и imageio.volwrite
, но яЯ хочу увидеть, насколько точно работает алгоритм прогнозирования, поэтому я хотел бы нанести координаты на изображение.Координаты - это значения [x,y,z]
, где количество строк равно количеству BLOB-объектов.
Я искал и обнаружил, что для Python нет простого способа добиться этого в 3D.принимая руководство отсюда: https://www.raddq.com/dicom-processing-segmentation-visualization-in-python/, я попытался использовать skimage.measure.marching_cubes
для преобразования изображения в двухмерную сетку поверхности, чтобы его можно было построить с помощью matplotlib
, а затем использовать его для построения моего изображения.
def make_mesh(image):
print('Transposing surface')
p = image.transpose(2, 1, 0)
print('Calculating surface')
verts, faces, norm, val = measure.marching_cubes_lewiner(p, allow_degenerate=True)
return verts, faces
def plt_3d(verts, faces):
print('Drawing')
x, y, z = zip(*verts)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
# Fancy indexing: `verts[faces]` to generate a collection of triangles
mesh = Poly3DCollection(verts[faces], linewidths=0.05, alpha=1)
face_color = [1, 1, 0.9]
mesh.set_facecolor(face_color)
ax.add_collection3d(mesh)
ax.set_xlim(0, max(x))
ax.set_ylim(0, max(y))
ax.set_zlim(0, max(z))
# ax.set_axis_bgcolor((0.7, 0.7, 0.7))
plt.show()
img_gt = io.volread(gt_path)
v, f = make_mesh(img_gt)
plt_3d(v, f)
Изображение представляет собой [21,512,1024]
и состоит из 5 «больших объектов», но plot_3d
создает следующее:
правильно ли я не использую функцию marching_cubes
?Почему сюжет настолько искажен?Оригинальные капли - это чистые сферы, совсем не растянутые.
Кроме того, если это единственный способ нанести мое изображение, как я могу нанести мои [x,y,z]
координаты поверх этого?