Python 为什么scikit图像中的分水岭函数在我的种子点和我想要填充的血管一样大的情况下不起作用

Python 为什么scikit图像中的分水岭函数在我的种子点和我想要填充的血管一样大的情况下不起作用,python,scikit-image,watershed,Python,Scikit Image,Watershed,好的,情况就是这样,我想对这幅二值血管图像进行分水岭处理 我想用这些彩色血管作为算法的种子点 当我使用原始彩色图像时,分水岭似乎不会比彩色图像更远 目标就是要有这样的形象。 使用的代码就是这个 distances = distance_transform_edt(vessels) segmentation = watershed(-distances, markers, mask=vessels). 我找到的唯一解决方案是腐蚀标记数据(第一张彩色图像) 你们有办法解决为什么要这么做吗?我

好的,情况就是这样,我想对这幅二值血管图像进行分水岭处理

我想用这些彩色血管作为算法的种子点

当我使用原始彩色图像时,分水岭似乎不会比彩色图像更远

目标就是要有这样的形象。

使用的代码就是这个

distances = distance_transform_edt(vessels)
segmentation = watershed(-distances, markers, mask=vessels).
我找到的唯一解决方案是腐蚀标记数据(第一张彩色图像)

你们有办法解决为什么要这么做吗?我们甚至在其他计算机上尝试相同的代码,并且它可以在没有腐蚀的情况下工作

编辑:

这是距离的图像。当我取负数时,每1变成-1。因此,图像中的最高值变为0


欢迎来到SO的scikit镜像线程!下面是一个小的可重复的例子,显示了即使有触摸标记,流域也表现良好

import matplotlib.pyplot as plt
import numpy as np
from skimage import segmentation
from scipy import ndimage

img = np.zeros((20, 20), dtype=np.bool)
img[3:-3, 3:-3] = True

distance = ndimage.distance_transform_edt(img)

markers = np.zeros_like(img, dtype=np.uint8)
markers[7:-7, 5:10] = 1
markers[7:-7, 10:15] = 2

ws = segmentation.watershed(-distance, markers, mask=img)
fig, ax = plt.subplots(1, 3)
ax[0].imshow(img)
ax[1].imshow(markers)
ax[2].imshow(ws)
plt.show()
标记数组中未标记的血管像素是否会改为1而不是0?分水岭仅标记0值像素

一个可复制的独立脚本可能会有所帮助,您链接到的不同图像具有不同的维度,因此很难从它们开始工作


最后,您可能会有兴趣在这里尝试,它可以为您的图像(您想要分离的区域之间没有强梯度)产生非常好的效果。

欢迎使用SO的scikit图像线程!下面是一个小的可重复的例子,显示了即使有触摸标记,流域也表现良好

import matplotlib.pyplot as plt
import numpy as np
from skimage import segmentation
from scipy import ndimage

img = np.zeros((20, 20), dtype=np.bool)
img[3:-3, 3:-3] = True

distance = ndimage.distance_transform_edt(img)

markers = np.zeros_like(img, dtype=np.uint8)
markers[7:-7, 5:10] = 1
markers[7:-7, 10:15] = 2

ws = segmentation.watershed(-distance, markers, mask=img)
fig, ax = plt.subplots(1, 3)
ax[0].imshow(img)
ax[1].imshow(markers)
ax[2].imshow(ws)
plt.show()
标记数组中未标记的血管像素是否会改为1而不是0?分水岭仅标记0值像素

一个可复制的独立脚本可能会有所帮助,您链接到的不同图像具有不同的维度,因此很难从它们开始工作


最后,您可能有兴趣在此尝试,它可以为您的图像(要分离的区域之间没有强梯度)产生非常好的结果。

您知道您使用的算法是淹没整个图像还是仅来自标记?标记通常是小的点,而不是完整的区域。你能发布距离变换的图像吗?你应该提供一个简短的复制示例。使用区域作为标记应该不会有问题,但是你永远不会达到想要的结果(如果你的图像是2D的),因为有一些断开连接的组件(深绿色和其他一些孤立的像素)。好的,我的图像是3D的。我只是做了一个最大强度的投影,让它在2D中可视化。你知道你使用的算法是淹没整个图像还是仅从标记中?标记通常是小的点,而不是完整的区域。你能发布距离变换的图像吗?你应该提供一个简短的复制示例。使用区域作为标记应该不会有问题,但是你永远不会达到想要的结果(如果你的图像是2D的),因为有一些断开连接的组件(深绿色和其他一些孤立的像素)。好的,我的图像是3D的。我只是做了一个最大强度的投影,让它在2D中可视化。