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
# Loading the input image
image = mh.imread('sea.bmp')
# Creating markers or seeds
markers = mh.imread('tree.tiff')
# Perform conditional watershed segmentation
segmented_image = mh.cwatershed(image, markers)
# Display all three images in one plot
plt.figure(figsize=(10, 5))
# Display image1
plt.subplot(1, 3, 1)
plt.imshow(image)
plt.title('Sea')
plt.axis('off')
# Display image2
plt.subplot(1, 3, 2)
plt.imshow(markers)
plt.title('Tree')
plt.axis('off')
# Display the segmented image
plt.subplot(1, 3, 3)
plt.imshow(segmented_image, cmap='gray')
plt.title('Segmented Image')
plt.axis('off')
plt.tight_layout()
plt.show()

输出

生成的输出如下:

Watershed Image Mohatas

使用自定义结构元素的条件分水岭

结构元素是一个小的二值图像,通常表示为矩阵。它用于分析参考像素的局部邻域。

在条件分水岭的上下文中,自定义结构元素允许我们在分水岭过程中定义像素之间的连接性。

通过自定义结构元素,我们可以控制每个像素的邻域如何影响图像的分割。

示例

import mahotas as mh
import numpy as np
from pylab import imshow, show
# Load the image
image = mh.imread('nature.jpeg')
# Convert the image to grayscale
image_gray = mh.colors.rgb2grey(image).astype(np.uint8)
# Threshold the image
threshold = mh.thresholding.otsu(image_gray)
image_thresholded = image_gray > threshold
# Perform conditional watershed with custom structuring element
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)
# Show the result
imshow(watershed)
show()

输出

上述代码的输出如下:

Watershed Image Mohatas1
广告