Плавные значения из skimage.measure.marching_cubes - PullRequest
0 голосов
/ 06 июня 2018

Я использую skimage.measure.marching_cubes для извлечения поверхности, определенной как faces и vertices.marching_cubes также выводит values для каждой грани.

Как мне "сгладить" эти values (фактическим сглаживанием может быть фильтр нижних частот, медианный фильтр и т. Д.)?Я думал, что одним из способов добиться этого будет проецирование или представление этой поверхности в 2D, а затем применение стандартных фильтров, но я не могу придумать, как это сделать из списка граней и вершин.

Причина этого "сглаживания" заключается в том, что значения не информативны в масштабе одной грани поверхности, а в более широких областях поверхности, представленных многими гранями.

Заранее спасибо!

1 Ответ

0 голосов
/ 05 июля 2018

В конце концов я нашел способ сделать это, основываясь на коде MATLAB из этой статьи:

Welf et al.«Количественная многокамерная клеточная визуализация в контролируемых трехмерных микроокружениях» в Developmental Cell, 2016, том 36, выпуск 4, p462-475

def median_filter_surface(faces, verts, measure, radius, p_norm=2):

    from scipy import spatial
    import numpy as np

    # INPUT:
    # faces: triangular surface faces - defined by 3 vertices
    # verts: the above vertices, defined by x,y,z coordinates
    # measure: the value related to each face that needs to be filtered
    # radius: the radius for median filtering (larger = more filtering)
    # p_norm: distance metric for the radius, default 2 (euclidian)

    # OUTPUT:
    # measure_med_filt: the "measure" after filtering

    num_faces = len(faces)
    face_centres = np.zeros((num_faces, 3))

    # get face centre positions in 3D space (from vert coordinates)
    for face in range(0, num_faces):
        face_centres[face, :] = np.mean(verts[faces[face, :], :], 0)

    # return all other points within a radius
    tree = spatial.KDTree(face_centres)
    faces_in_radius = tree.query_ball_point(face_centres, radius, p_norm)

    measure_med_filt = np.zeros(len(faces))
    for face in range(0, len(faces)):
        measure_med_filt[face] = np.median(measure[faces_in_radius[face]])

    return measure_med_filt
...