本文介绍如何使用k3d模块在jupyter notebook中绘制三维点云。

在 jupyter notebook 中虽然可以使用 matplotlib 来绘制三维数据,但是matplotlib在三维可视化方面性能比较差,功能也少。相比之下,k3d这个模块就好用多了。

k3d是欧盟资助的一个研究基础设施项目,可用于交互式的三维作图。k3d通过调用three.js底层来执行前端的三维渲染,性能和效果都还不错。

最近使用zeiss共聚焦拍摄了包埋了荧光小球的凝胶样品,得到一个三维的成像数据。这里尝试将信号转换为点云并使用 k3d 模块来作图显示。

from aicsimageio import AICSImage
from glob import glob
import numpy as np
import k3d
# pip install k3d

# 读取数据文件
fps = glob("*.czi")
a = AICSImage(fps[0])
data = a.get_image_data("ZYX", C=0)

# 将信号强度大于0的像素坐标提取出来
zs, ys, xs = np.where(data>0)
locs = np.vstack([xs, ys, zs]).T

# 使用k3d进行作图
pts = k3d.points(locs, point_size=0.2, color=0xff0000, name='pixel')
plot = k3d.plot(name='PSF')
plot += pts 
plot.display()

提取信号像素坐标时我使用的是 np.where 方法,然后通过 np.vstack 加上转置把坐标整理成为 k3d 作图时符合要求的 input。作图结果如下:

注意到,这里存在很多噪声点,我们可以在 np.where 中使用更大的 threshold 来去除,但这样也会损失一些弱信号。所以一个更好的办法是采用聚类的方式来处理,这里我使用的是 sklearn 模块中的 DBSCAN,聚类后去除 label 为 -1 的非cluster噪点,再进行作图。

使用DBSCAN的方法非常简单,其中主要参数是 eps和 min_samples,eps是成簇最小点间距,min_samples是成簇最小点数量,更准确的参数说明详见官方文档。这里的具体代码如下:

from sklearn.cluster import DBSCAN

# 聚类
clustering = DBSCAN(eps=3, min_samples=3).fit(locs)
# 根据聚类得到的标签来筛选
inds = np.where(clustering.labels_>-1)
locs2 = locs[inds]
# 作图
pts = k3d.points(locs2, point_size=1, color=0xff0000, name='pixel')
plot = k3d.plot(name='PSF')
plot += pts 
plot.display()

作图效果如下:

更多k3d模块的用法,可以参考其 gallery中提供的示例。

源数据文件分享链接:https://pan.baidu.com/s/1zGxq_AOzRSU3Dka6h1yJhA
提取码:

该部分仅登录用户可见

最后修改:2024 年 09 月 26 日
请大力赞赏以支持本站持续运行!