Mahotas - 图像的条件分水岭
"分水岭"一词源自物理分水岭的概念,即分隔不同流域的边界线。同样,分水岭算法旨在找到图像中的边界或分离区域。
分水岭算法是一种用于图像分割的常用方法,图像分割是将图像划分为不同区域的过程。
因此,在图像处理中,分水岭图像是指经过分水岭分割过程的图像。
分水岭分割技术将图像中的像素强度视为地形表面,其中明亮区域代表高海拔,黑暗区域代表低海拔。
Mahotas 中的分水岭
Mahotas 提供条件分水岭函数,而不是传统的分水岭算法。
Mahotas 中的条件分水岭是分水岭算法的增强版本,它允许我们通过提供特定标记来指导分割过程。
让我们一步一步地了解 Mahotas 中条件分水岭算法的工作原理 −
步骤 1 − 假设我们有一张图像,我们想将其划分为不同的区域。使用条件分水岭,我们可以将图像中的某些区域标记为代表我们感兴趣的区域的标记。
步骤 2 − 然后,算法首先用水填充这些标记区域。水只会在每个标记区域内流动,不会越过其他标记的边界。
步骤 3 −结果是分割图像,其中每个区域都由您提供的标记定义的边界划定。
mahotas.cwatershed() 函数
Mahotas 中的 cwatershed() 函数接受两个输入−输入图像和标记图像,并返回分割成不同区域的输出图像。
标记图像是二值图像,其中前景像素(布尔值 1)表示不同区域的边界。
语法
以下是 mahotas 中 cwatershed() 函数的基本语法 −
mahotas.cwatershed(surface, markers, Bc=None, return_lines=False) W, WL = cwatershed(surface, markers, Bc=None, return_lines=True)
参数
cwatershed() 函数接受的参数如下 −
surface −它表示将执行分水岭分割的输入图像。它通常是灰度图像。
markers − 它表示分水岭分割的标记。标记指示图像中的感兴趣区域。
Bc(可选) − 它表示用于邻域操作的结构元素。如果设置为 None,则使用默认连接。
return_lines − 它是一个布尔标志,指定是否除了标记图像外还返回分水岭线。如果为 True,则该函数将返回标记图像和分水岭线。
如果为 False,则仅返回标记图像。默认情况下,它设置为 False。
返回值
W 或 WL − 它表示从分水岭分割中获得的标记图像,其中每个区域都分配有一个唯一的标签。标记图像的形状与输入图像相同。
WL(可选) − 仅当 return_lines 参数设置为 True 时才返回。它表示分水岭线,即图像中分割区域之间的边界。
示例
在下面的示例中,我们尝试显示图像的基本条件分水岭分割 −
import mahotas as mh import matplotlib.pyplot as plt # 加载输入图像 image = mh.imread('sea.bmp') # 创建标记或种子 markers = mh.imread('tree.tiff') # 执行条件分水岭分割 segmented_image = mh.cwatershed(image, markers) # 在一个图中显示所有三幅图像 plt.figure(figsize=(10, 5)) # 显示图像 1 plt.subplot(1, 3, 1) plt.imshow(image) plt.title('Sea') plt.axis('off') # 显示图像 2 plt.subplot(1, 3, 2) plt.imshow(markers) plt.title('Tree') plt.axis('off') # 显示分割图像 plt.subplot(1, 3, 3) plt.imshow(segmented_image, cmap='gray') plt.title('Segmented Image') plt.axis('off') plt.tight_layout() plt.show()
输出
生成的输出如下 −

具有自定义结构元素的条件分水岭
结构元素是通常表示为矩阵的小二进制图像。它用于分析参考像素的局部邻域。
在条件分水岭的背景下,自定义结构元素允许我们在分水岭过程中定义像素之间的连通性。
通过自定义结构元素,我们可以控制每个像素的邻域如何影响图像的分割。
Example
import mahotas as mh import numpy as np from pylab import imshow, show # 加载图像 image = mh.imread('nature.jpeg') # 将图像转换为灰度 image_gray = mh.colors.rgb2grey(image).astype(np.uint8) # 对图像进行阈值处理 threshold = mh.thresholding.otsu(image_gray) image_thresholded = image_gray > threshold # 使用自定义结构元素执行条件分水岭 struct_element = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]]) labels, _ = mh.label(image_thresholded, struct_element) watershed = mh.cwatershed(image_gray.max() - image_gray, labels) # 显示结果 imshow(watershed) show()
输出
上述代码的输出如下 −
