老师提供的试玩代码
#Segmentation Function
def Watershed(image, number):
"""
Perform Otsu Segmentation and Watershed,
Show Original and Segmented Image side by side
Return Segmented Objects
:param image: Image to Segment
:param number: Image Identifier (Int)
:return: Segmented Objects
需要先调成灰度图
"""
#ski.filters库,自动阈值分割,识别细胞
threshold = filters.threshold_otsu(image)
cells = image >= threshold/2
#Scipy.ndimage库,计算细胞间距离
distance = ndi.distance_transform_edt(cells)
#ski.feature库,返回图像中局部峰值坐标,创建mask
local_max_coords = feature.peak_local_max(distance, min_distance=7)
local_max_mask = np.zeros(distance.shape, dtype=bool)
local_max_mask[tuple(local_max_coords.T)] = True
#ski.measure库进行连通区域标记
markers = measure.label(local_max_mask)
#分水岭分割算法
segmented_cells = segmentation.watershed(-distance, markers, mask=cells)
#有颜色的标记
color_labels = color.label2rgb(segmented_cells, image, alpha=0.4, bg_label=0)
io.imsave('Image_'+str(number)+'.tif', color_labels)
fig, ax = plt.subplots(ncols=2, figsize=(5, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title("Image "+str(number))
ax[1].imshow(color_labels)
ax[1].set_title("Image "+str(number)+" Segmented")
plt.show(block=False)
return segmented_cells
先用ski.filters库 图像自动阈值分割自动指定一个阈值,从而来实现分割。
用Scipy.ndimage库,计算细胞间距离
用ski.feature库,返回图像中局部峰值坐标,创建mask
用ski.measure库进行连通区域标记
用ski.segmentation库的分水岭分割算法对图像,标记,mask进行分割。
结果如下: