分割多个细胞的图像并分裂成单个细胞

Segmenting image of multiple cells and splitting into single cells

假设我有这张图片:

可以通过

获得
from skimage.data import human_mitosis
image = human_mitosis()

我想通过自动将每个单个细胞裁剪成它自己的图像,将这个多个细胞的图像变成每个单独细胞的多个图像(理想情况下,每个细胞的裁剪大小相同 size/shape) .因此,例如,这些将是一些预期的图像:

虽然 scikit 有一些用于分割细胞的代码,但您如何使用这种分割(或其他一些可能更简单的方法)将单个细胞分成它们自己的图像或对象?

下面是一些用于分割细胞的代码(取自 scikit 的教程和这张图片 https://scikit-image.org/docs/dev/auto_examples/applications/plot_human_mitosis.html#sphx-glr-auto-examples-applications-plot-human-mitosis-py):

import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage as ndi
from skimage import (
    color, feature, filters, measure, morphology, segmentation, util
)

thresholds = filters.threshold_multiotsu(image, classes=3)
cells = image > thresholds[0]

distance = ndi.distance_transform_edt(cells)

local_max_coords = feature.peak_local_max(distance, min_distance=7)
local_max_mask = np.zeros(distance.shape, dtype=bool)
local_max_mask[tuple(local_max_coords.T)] = True
markers = measure.label(local_max_mask)

segmented_cells = segmentation.watershed(-distance, markers, mask=cells)

fig, ax = plt.subplots(ncols=2, figsize=(10, 5))
ax[0].imshow(cells, cmap='gray')
ax[0].set_title('Overlapping nuclei')
ax[0].axis('off')
ax[1].imshow(color.label2rgb(segmented_cells, bg_label=0))
ax[1].set_title('Segmented nuclei')
ax[1].axis('off')
plt.show()

您可以为此使用 skimage.measure.regionprops

props = measure.regionprops(
        segmented_cells, intensity_image=image
        )

现在props[i].image_intensity将包含第i个单元格的图像,props[i].label将包含该单元格分割图像中的标签值。您可以在 regionprops 文档字符串中查看其他可用属性。

编辑: 这个答案的早期版本说 props[i].image 包含裁剪后的图像。它实际上只包含与该区域对应的布尔掩码。