首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >skimage分水岭“过度分割”背后的关键参数

skimage分水岭“过度分割”背后的关键参数
EN

Stack Overflow用户
提问于 2020-06-24 00:04:13
回答 1查看 520关注 0票数 0

我有下面的细胞核面具,我的目标是分割它们。然而,使用一种看似非常标准的方法,

代码语言:javascript
复制
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:下面我介绍了距离变换,其他人指出的距离变换是一个非常重要的步骤。然而,我仍然无法诊断出“坏”距离变换的症状,也不知道用于过滤所述变换的拇指规则。

EN

回答 1

Stack Overflow用户

发布于 2022-03-21 13:17:41

在您的特殊情况下,部分过度分割的起源是基于peak_local_max()的结果。

如果您运行以下代码,您将能够找到为您的图像选择的局部最大值。我正在使用OpenCV绘制点,您可能需要将它修改为另一个库。

代码语言:javascript
复制
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()

您将看到有多个标记,为过度分割的细胞。有一些解决这个问题的建议方法(例如,这一个)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62545593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档