给三维点云上色

在k3d绘制点云时增加attribute以实现不同cluster的上色

基于k3d绘制三维点云

本文介绍如何使用k3d模块在jupyter notebook中绘制三维点云。 在 jupyter notebook 中虽然可以使用 matplotlib 来绘制三维数据,但是matplotlib在三维可视化方面性能比较差,功能也少。相比之下,https://k3d jupyter.org/user/...

之前的文章中包含了多团点云,但是作图时只有一个颜色,那么如何让不同的cluster呈现不同的颜色呢?

Pasted-image-20240926160002.png-3d7f9ebfb0.png

核心作图代码和效果直接奉上。控制颜色时,我们增加了一个参数是 attribute,也就是这个数据点的属性,这里参数传入的是 DBSCAN 聚类所得到的标签,然后就按照默认的colormap为不同的属性值映射不同的颜色。关于 k3d.points 更详细的参数和用法,在 jupyter lab 中可以通过 ?k3d.points 来查看:

Pasted-image-20240926160506.png-b677d9bb9d.png

另外需要注意的是,DBSCAN的时候要调整相关参数,以避免cluster太小。我这里使用的代码如下:

from aicsimageio import AICSImage
from glob import glob
import numpy as np
from sklearn.cluster import DBSCAN
import k3d
fps = glob("*.czi")
a = AICSImage(fps[1])
data = a.get_image_data("ZYX", C=0)
zs, ys, xs = np.where(data>0)
locs = np.vstack([xs, ys, zs]).T
# 第一次聚类用于去噪
clustering = DBSCAN(eps=3, min_samples=3).fit(locs)
inds = np.where(clustering.labels_>-1)
locs2 = locs[inds]
# 第二次聚类用于分开不同的大cluster
clustering2 = DBSCAN(eps=10, min_samples=3).fit(locs2)
pts = k3d.points(locs2, point_size=1, attribute=clustering2.labels_, name='pixel')
plot = k3d.plot(name='PSF')
plot += pts
plot.display()

类似的 DBSCAN 也有还其它参数可以调节,可以通过 ?DBSCAN 在 jupyterlab 中查看:

Pasted-image-20240926160806.png-c23c17759f.png