python - 来自 skimage.measure.marching_cubes 的平滑值
问题描述
我skimage.measure.marching_cubes
用来提取表面,定义为faces
和vertices
。marching_cubes
还输出values
每个面。
我如何“平滑”这些values
(实际的平滑可能是低通滤波器、中值滤波器等)?我认为实现此目的的一种方法是投影或以 2D 形式表示此表面,然后应用标准过滤器,但我想不出如何从面和顶点列表中做到这一点。
这种“平滑”的原因是因为这些值不是在表面的单个面的尺度上提供信息,而是在由许多面表示的表面的更大区域上提供信息。
提前致谢!
解决方案
基于本文中的 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
推荐阅读
- flutter - 如何标记图像抖动上的各个点
- servlets - 在 POST 期间访问 SAML 断言时遇到问题
- javascript - 如何在 openssl 中解密使用 CryptoJs3+ 库加密的文件,并使用自定义迭代和密钥大小
- android - 始终在后台运行前台服务
- terraform - 如何从 vpc terraform 模块创建单个公共和私有路由表
- python - 根据另一个单元格中的字符串在 DataFrame 单元格的列表中插入值
- amazon-web-services - Redshift 数据库用户无权担任 IAM 角色
- c# - 以与非 API 异常不同的方式处理 API 异常。将代码移动到外部类库时出错
- amazon-web-services - 使用 Let's Encrypt 时,是否需要为 443 提供额外的 VirtualHost 条目?
- android - Android Studio 无法启动,原因是 Check Point 防病毒软件将 kotlin-stdlib.jar 移动到隔离区