防止标签泄漏#

在使用膜染色对图像中的细胞进行分割时,一个常见的问题是标签_泄漏_。当使用诸如种子分水岭等算法时,可以通过过滤图像来防止这些泄漏,例如使用局部最大值滤波器。

import napari_segment_blobs_and_things_with_membranes as nsbatwm
from skimage.data import cells3d
import stackview
import pyclesperanto_prototype as cle
import matplotlib.pyplot as plt

为了演示目的,我们使用scikit-image的cells3d示例图像

image = cells3d()[:,0]
image.shape
(60, 256, 256)

我们在Z-Y平面查看它的一个切片。为了代码简洁,在此图之后我们将省略绘图轴标签。

cle.imshow(image[:,:,128], max_display_intensity=20000, continue_drawing=True)
plt.xlabel("Y")
plt.ylabel("Z")
Text(0, 0.5, 'Z')
../_images/5fa45f5ed25d6df1d1d1e5eca0e881b1d47ca58bbe1cca0c5add0ba00cfe573f.png

当对这个数据集应用种子分水岭算法(在3D中)时,我们可以看到一些标签在Z方向上泄漏。它们与组织层外部的区域合并。

reference_labels = nsbatwm.local_minima_seeded_watershed(image, spot_sigma=9)

cle.imshow(reference_labels[:,:,128], labels=True)
../_images/f6048e2e232798c17a508da020dd352d4bc6c7b3785fb2a528f5f348534b9479.png

通过对原始图像应用最大值滤波器,可以减少这个问题。它将导致更厚的膜,从而降低分水岭算法通过膜上的孔洞泄漏的机会。

thicker_membranes = nsbatwm.maximum_filter(image, radius=2)

cle.imshow(thicker_membranes[:,:,128], max_display_intensity=20000)
../_images/350917ec65b360445b829ffa2025ab5b612030518b175a660309156e1218c0d6.png

得到的标签图像有较少的泄漏标签,但在所有方向上都失去了标签边界的准确性。

labels1 = nsbatwm.local_minima_seeded_watershed(thicker_membranes, spot_sigma=9)

cle.imshow(labels1[:,:,128], labels=True)
../_images/37f206a6b54e091a596eec8ea4dfe63181e0ae2526100a4a2271d53b901bde9b.png

泄漏通常似乎只发生在Z方向,这是常见显微技术的点扩散函数效应。它通常是各向异性的,因此,显微镜在Z方向上捕捉膜的能力不如在X和Y方向上。

为了只处理X和Y方向的标签泄漏问题,并保留Z方向的一些准确性,我们需要应用一个可以在X、Y和Z方向上指定不同半径的最大值滤波器。

thinker_membranes_in_x_y = cle.maximum_sphere(image, radius_x=2, radius_y=2, radius_z=0)

cle.imshow(thinker_membranes_in_x_y[:,:,128], max_display_intensity=20000)
../_images/fbb9a54a49579cffa51f659276b4c70ee612eaac0b78c38ae138127c87e25226.png
labels2 = nsbatwm.local_minima_seeded_watershed(thinker_membranes_in_x_y, spot_sigma=9)

cle.imshow(labels2[:,:,128], labels=True)
../_images/18b2d6c94b8606c09c4827620fb1eb9d050a74b02dc569d5475a4e844feeef5d.png

在Z方向上排除图像边缘的标签#

单层组织的图像通常以一种方式采集,我们可以看到一些像素,后来在组织顶部和底部(在Z方向)分割出的标签。我们可以移除这些标签,同时明确保留那些在X和Y方向接触图像边界的标签。

corrected_labels = cle.exclude_labels_on_edges(labels2, 
                                               exclude_in_x=False, 
                                               exclude_in_y=False, 
                                               exclude_in_z=True)

cle.imshow(corrected_labels[:,:,128], labels=True)
../_images/49246fbac963a5fa880bde0c3bbc0426bf6b7e1673588e7c8adf41a3fc4d9951.png

显然,我们仍然失去了一个泄漏到组织下方区域的细胞。不过,要获得完美的结果可能是不可能的。