如何用skimage、napari将blob_dog检测结果添加到3D图像堆栈并生成掩码
完整可运行实现代码
from skimage.data import binary_blobs as BBlobs import numpy as np import napari from skimage import feature from scipy import ndimage as ndi # 初始化napari查看器 viewer = napari.Viewer() # 测试用空间分辨率,按需替换为你的业务图像实际分辨率 spacing = (1, 1, 1) def add_to_viewer(layer_name, name): viewer.add_image( layer_name, name = name, scale = spacing ) # 生成3D测试样本 bblobs = BBlobs(n_dim=3) add_to_viewer(bblobs, '原始图像') # 3D斑点检测,可调整threshold、min_sigma、max_sigma参数适配你的业务图像 blobs = feature.blob_dog(bblobs, threshold=0.1) # -------------------------- # 需求1:检测结果添加到napari叠加查看 # -------------------------- # 提取斑点坐标、计算对应直径(3D下半径为sigma*sqrt(3),直径乘2) coords = blobs[:, :3] # 格式为(z, y, x) blob_radii = blobs[:, 3] * np.sqrt(3) blob_sizes = 2 * blob_radii # napari Points层size为直径 # 添加Points层,自定义颜色、透明度方便查看 viewer.add_points( coords, name='检测到的斑点', size=blob_sizes, scale=spacing, face_color='transparent', edge_color='red', edge_width=0.1 ) # -------------------------- # 需求2:生成二值掩码/标签图像 # -------------------------- # 生成和原图尺寸一致的空数组 binary_mask = np.zeros_like(bblobs, dtype=bool) label_mask = np.zeros_like(bblobs, dtype=np.uint16) # 生成3D坐标网格 z_grid, y_grid, x_grid = np.ogrid[:bblobs.shape[0], :bblobs.shape[1], :bblobs.shape[2]] for idx, blob in enumerate(blobs, start=1): z, y, x, sigma = blob r = sigma * np.sqrt(3) # 计算每个网格点到当前斑点中心的距离 dist = np.sqrt((z_grid - z)**2 + (y_grid - y)**2 + (x_grid - x)**2) # 距离小于半径的区域设为前景 binary_mask[dist <= r] = True label_mask[dist <= r] = idx # 把掩码也添加到napari查看 add_to_viewer(binary_mask, '斑点二值掩码') add_to_viewer(label_mask, '斑点标签图') napari.run()
关键说明
- 3D场景下
blob_dog/blob_log返回的sigma值不能直接作为半径使用,需要乘以sqrt(3)换算得到实际的3D球形斑点半径 - 业务图像测试时可调整
blob_dog的threshold、min_sigma、max_sigma参数,适配实际斑点的大小、对比度 - 生成的二值掩码、标签图可直接用
skimage.io.imsave导出为tif格式使用
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

