首页 > 解决方案 > 使用 skimage 和 napari 将 blob_dog 中的 blob 添加到 3D 图像堆栈

问题描述

我正在尝试使用 blob log 或 blog dog 在使用 skimage 的 3D 图像中进行 blob 检测。我使用 napari 和二进制 blob (3D) 图像作为示例(但这不是我稍后将使用的图像,它只是具有清晰的 blob)。但是,我无法将 blob 应用到图像/将其添加到查看器。

Skimage 有一个使用 matplotlib 向图像添加圆圈的 2D 图像示例,但我想用它来识别 3D 图像上的斑点并创建二值图像(本质上是蒙版)或标签。

这就是我所拥有的,但我不确定从这里去哪里:

from skimage.data import binary_blobs as BBlobs
import pandas as pd
import imageio as io
import numpy as np
import napari  
from skimage import filters, morphology, measure, exposure, segmentation, restoration, feature
import skimage.io as skio
from scipy import ndimage as ndi


def add_to_viewer(layer_name, name):
    viewer.add_image(
        layer_name,
        name = name,
        scale = spacing
    )

bblobs = BBlobs(n_dim=3)
add_to_viewer(bblobs, 'image')

blobs = feature.blob_dog(bblobs)

for blob in blobs:
    z,y,x,area = blob

这是 skimage 的 blob 特征检测示例。

任何帮助,将不胜感激。

标签: pythonscikit-imagepython-napari

解决方案


之后你想做什么?你需要blob大小还是只需要位置?答案很大程度上取决于问题。以下是三个答案:

  1. 只需将 blob 可视化为点:
viewer.add_points(
    blobs[:, :-1], size=blobs[:, -1], name='points', scale=spacing
)
  1. 忽略大小(假设您稍后进行分水岭,这没关系),创建一个标签卷,每个坐标一个标签:
from skimage.util import label_points

labels = label_points(blobs[:, :-1], bblobs.shape)
viewer.add_labels(labels, scale=spacing)

请注意,它label_points依赖于 scikit-image 的当前主分支(未发布),但您可以同时复制源代码。scikit-image 0.19 应该会在这篇文章发布后不久发布。

  1. 制作一个标签层并直接使用 napari 的标签层 API在每个点绘制一个 blob,包括 blob 检测的大小:
labels_layer = viewer.add_labels(
    np.zeros_like(bblobs, dtype=np.int32), name='blobs', scale=spacing
)
for i, blob in enumerate(blobs, start=1):
    labels_layer.selected_label = i
    labels_layer.brush_size = blob[-1]
    labels_layer.paint(blob[:-1], refresh=False)
labels_layer.refresh()

场景 1 和 3 中的一个小警告是,我认为 blob 大小是“sigma”,这意味着大多数 blob 都在中心的2 sigma 范围内,因此您可能需要将所有大小乘以 2 以获得良好的显示效果.


推荐阅读