分离接触对象#

分水岭算法的一个常见用例是分离接触的对象。在本笔记本中,我们将分离二值图像中具有圆形形状且相互接触的对象。

from skimage.io import imread
import napari_segment_blobs_and_things_with_membranes as nsbatwm
import napari_simpleitk_image_processing as nsitk
import stackview

这个过程的起点是一个二值图像,例如使用阈值分割制作的图像。

nuclei = imread('../../data/mitosis_mod.tif')

stackview.insight(nuclei)
shape(70, 70)
dtypeuint8
size4.8 kB
min8
max255
binary = nsbatwm.threshold_otsu(nuclei).astype(bool)

binary
<__array_function__ internals>:180: RuntimeWarning: Converting input from bool to <class 'numpy.uint8'> for compatibility.
nsbatwm made image
shape(70, 70)
dtypebool
size4.8 kB
minFalse
maxTrue

然后,我们可以通过仅考虑二值图像来分离接触的对象。底层算法旨在产生与ImageJ的二值分水岭算法类似的结果,这里的实现也适用于3D图像。

split_objects = nsbatwm.split_touching_objects(binary)
split_objects
nsbatwm made image
shape(70, 70)
dtypebool
size4.8 kB
minFalse
maxTrue

split_touching_objects函数还有一个参数sigma,用于控制对象应该被分割得多激进。要进行更多分割,输入一个小于默认值3.5的数字。

split_objects2 = nsbatwm.split_touching_objects(binary, sigma=2)
split_objects2
nsbatwm made image
shape(70, 70)
dtypebool
size4.8 kB
minFalse
maxTrue

也可以获取标签图像作为结果。注意,在这种情况下,对象之间的黑线/间隙将不会存在。

touching_labels = nsitk.touching_objects_labeling(binary)
touching_labels
n-sitk made image
shape(70, 70)
dtypeuint32
size19.1 kB
min0
max13