合并重叠的标签对象并修改标签值

combine overlapping labelled objects and modify label values

我有一个 2D 共聚焦显微镜图像(2D 切片)的 Z 轴堆栈,我想分割细胞。 2D 图像的 Z-stack 实际上是 3D 数据。在 Z 轴的不同切片中,我看到相同的细胞确实出现在多个切片中。我对 XY 中的细胞形状感兴趣,因此我想保留来自不同 Z 轴切片的最大细胞区域。我想在将连续的 2D 切片转换为标记的二进制图像后将它们组合起来,但我遇到的问题很少,我需要一些帮助才能继续进行。

我有两张图片 img_aimg_b。我首先使用 OTSU 将它们转换为二值图像,然后应用一些形态学操作,然后使用 cv2.connectedComponentsWithStats() 获得标记的对象。标记图像后,我使用 cv2.bitwise_or() 将它们组合在一起,但它弄乱了标签。您可以在附加的处理图像中看到这一点(红色圆圈突出显示的单元格)。我看到重叠单元格的多个标签。但是,我想为每个组合的重叠对象分配一个唯一标签。

最后我想要的是,当我合并两个标记图像时,我想为合并的重叠对象分配一个标签(唯一值)并通过合并两个图像来保持最大的单元格区域。有人知道怎么做吗?

代码如下:

from matplotlib import pyplot as plt
from skimage import io, color, measure
from skimage.util import img_as_ubyte
from skimage.segmentation import clear_border
import cv2
import numpy as np

cells_a=img_a[:,:,1] # get the green channel
#Threshold image to binary using OTSU.
ret_a, thresh_a = cv2.threshold(cells_a, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Morphological operations to remove small noise - opening
kernel = np.ones((3,3),np.uint8)
opening_a = cv2.morphologyEx(thresh_a,cv2.MORPH_OPEN,kernel, iterations = 2)
opening_a = clear_border(opening_a) #Remove edge touchingpixels

numlabels_a, labels_a, stats_a, centroids_a = cv2.connectedComponentsWithStats(opening_a)
img_a1 = color.label2rgb(labels_a, bg_label=0)

## now do the same with image_b
cells_b=img_b[:,:,1] # get the green channel
#Threshold image to binary using OTSU.
ret_b, thresh_b = cv2.threshold(cells_b, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Morphological operations to remove small noise - opening
opening_b = cv2.morphologyEx(thresh_b,cv2.MORPH_OPEN,kernel, iterations = 2)
opening_b = clear_border(opening_b) #Remove edge touchingpixels

numlabels_b, labels_b, stats_b, centroids_b = cv2.connectedComponentsWithStats(opening_b)
img_b1 = color.label2rgb(labels_b, bg_label=0)

## Now combined two images
combined = cv2.bitwise_or(labels_a, labels_b) ## combined both labelled images to get maximum area per cell
combined_img = color.label2rgb(combined, bg_label=0)
plt.imshow(combined_img)

可以找到图片here:

根据 Christoph Rackwitz 和 beaker 的评论,我开始四处寻找 3D 连接组件标记。我找到了一个可以处理此类事情的 python 库,我安装了它并试一试。好像做的还不错。它确实在每个切片中分配标签,并为不同切片中的相同单元格保持相同的标签。这正是我想要的。

这是我用来标记 3D 对象的库的 link。 https://pypi.org/project/connected-components-3d/