我有下面的细胞核面具,我的目标是分割它们。然而,使用一种看似非常标准的方法,
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from skimage.segmentation import watershed
from skimage import measure
# load mask
mask = mpimg.imread('mask.png')
# find distance to nearest border
distance = scipy.ndimage.distance_transform_edt(mask)
# find local maxima based on distance to border
local_maxi = peak_local_max(distance, indices=False, footprint=np.ones((125, 125)), labels=mask)
# generate markers for regions
markers = measure.label(local_maxi)
# watershed segmentation
labeled = watershed(-distance, markers, mask=mask, watershed_line = True)
# plot figure
fig, axs = plt.subplots()
axs.imshow(labeled, cmap='flag')一些大的、连接的组件未分段,而较小的未连接的组件变得过度分割:


通过在StackOverflow上浏览答案,我还没有找到skimage.segmentation.watershed算法中哪些参数驱动“欠分割”和“过度分割”的讨论。
中哪个参数对分水岭算法中的“过分割”影响最大?我的直觉告诉我这可能是脚印大小?还是距离变换?确定分段邻域的最关键参数是什么?
EDIT1:下面我介绍了距离变换,其他人指出的距离变换是一个非常重要的步骤。然而,我仍然无法诊断出“坏”距离变换的症状,也不知道用于过滤所述变换的拇指规则。

发布于 2022-03-21 13:17:41
在您的特殊情况下,部分过度分割的起源是基于peak_local_max()的结果。
如果您运行以下代码,您将能够找到为您的图像选择的局部最大值。我正在使用OpenCV绘制点,您可能需要将它修改为另一个库。
import cv2
import numpy as np
import matplotlib.pyplot as plt
localMax_idx = np.where(local_maxi)
localMax_img = mask.copy()
localMax_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
for i in range(localMax_idx[0].shape[0]):
x = localMax_idx[1][i]
y = localMax_idx[0][i]
localMax_img = cv2.circle(localMax_img, (x,y), radius=5, color=(255, 0, 0), thickness=-1)
plt.imshow(localMax_img)
plt.show()您将看到有多个标记,为过度分割的细胞。有一些解决这个问题的建议方法(例如,这一个)。
https://stackoverflow.com/questions/62545593
复制相似问题