добро пожаловать в ветку scikit-image SO! Ниже приведен небольшой воспроизводимый пример, показывающий, что водораздел ведет себя хорошо даже при касании маркеров.
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()
Может ли случиться, что пиксели немаркированного судна в вашем массиве маркеров не установлены на 0, а на 1? Водораздел помечает только пиксели с нулевым значением.
Может помочь воспроизводимый автономный скрипт, разные изображения, с которыми вы связались, имели разные размеры, поэтому с ними было трудно работать.
Наконец, вы могли здесь вам будет интересно попробовать алгоритм случайного блуждания , который может дать действительно хорошие результаты для изображений, таких как ваш (без сильных градиентов между областями, которые вы хотите разделить).