首页 > 解决方案 > 来自 skimage.measure.marching_cubes 的平滑值

问题描述

skimage.measure.marching_cubes用来提取表面,定义为facesverticesmarching_cubes还输出values每个面。

我如何“平滑”这些values(实际的平滑可能是低通滤波器、中值滤波器等)?我认为实现此目的的一种方法是投影或以 2D 形式表示此表面,然后应用标准过滤器,但我想不出如何从面和顶点列表中做到这一点。

这种“平滑”的原因是因为这些值不是在表面的单个面的尺度上提供信息,而是在由许多面表示的表面的更大区域上提供信息。

提前致谢!

标签: pythonnumpygraph-theoryscikit-imagesurface

解决方案


基于本文中的 MATLAB 代码,我最终找到了一种方法:

韦尔夫等人。“受控 3D 微环境中的定量多尺度细胞成像”,载于发育细胞,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

推荐阅读