Mahotas - 图像标记



图像标记是指将类别(标签)分配给图像的不同区域。标签通常用整数值表示,每个值对应于特定类别或区域。

例如,让我们考虑一个包含各种物体或区域的图像。每个区域都被分配一个唯一的值(整数)以将其与其他区域区分开来。背景区域的标签值为 0。

在 Mahotas 中标记图像

在 Mahotas 中,我们可以使用 label()labeled.label() 函数来标记图像。

这些函数通过为图像中不同的连通组件分配唯一的标签或标识符来将图像分割成不同的区域。每个连通组件是一组相邻的像素,它们共享一个共同的属性,例如强度或颜色。

标记过程创建一个图像,其中属于同一区域的像素被分配相同的标签值。

使用 mahotas.label() 函数

mahotas.label() 函数以图像作为输入,其中感兴趣的区域由前景(非零)值表示,背景由零表示。

该函数返回标记的数组,其中每个连通组件或区域都被分配一个唯一的整数标签。

label() 函数使用 8 连通性进行标记,这指的是图像中像素之间的关系,其中每个像素都与其周围的八个邻居(包括对角线)相连。

语法

以下是 mahotas 中 label() 函数的基本语法:

mahotas.label(array, Bc={3x3 cross}, output={new array})

其中:

  • array - 输入数组。

  • Bc (可选) - 用于连通性的结构元素。

  • output (可选) - 输出数组(默认为与 array 形状相同的新的数组)。

示例

在下面的示例中,我们使用 mh.label() 函数来标记图像。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image_rgb = mh.imread('sun.png')
image = image_rgb[:,:,0]
# Applying gaussian filtering
image = mh.gaussian_filter(image, 4)
image = (image > image.mean())
# Converting it to a labeled image
labeled, num_objects = mh.label(image)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original RGB image
axes[0].imshow(image_rgb)
axes[0].set_title('RGB Image')
axes[0].set_axis_off()
# Displaying the labeled image
axes[1].imshow(labeled)
axes[1].set_title('Labeled Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

RGB Label Image

使用 mahotas.labeled.label() 函数

mahotas.labeled.label() 函数为图像的不同区域分配从 1 开始的连续标签。它与 mahotas.label() 函数类似,用于将图像分割成不同的区域。

如果你的标记图像具有非连续的标签值,labeled.label() 函数会将标签值更新为连续顺序。

例如,假设我们有一个标记图像,其中四个区域的标签分别为 2、4、7 和 9。labeled.label() 函数会将图像转换为一个新的标记图像,其连续标签分别为 1、2、3 和 4

语法

以下是 mahotas 中 labeled.label() 函数的基本语法:

mahotas.labeled.label(array, Bc={3x3 cross}, output={new array})

其中:

  • array - 输入数组。

  • Bc (可选) - 用于连通性的结构元素。

  • output (可选) - 输出数组(默认为与 array 形状相同的新的数组)。

示例

以下示例演示了如何使用 mh.labeled.label() 函数将图像转换为标记图像。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image_rgb = mh.imread('sea.bmp')
image = image_rgb[:,:,0]
# Applying gaussian filtering
image = mh.gaussian_filter(image, 4)
image = (image > image.mean())
# Converting it to a labeled image
labeled, num_objects = mh.labeled.label(image)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original RGB image
axes[0].imshow(image_rgb)
axes[0].set_title('RGB Image')
axes[0].set_axis_off()
# Displaying the labeled image
axes[1].imshow(labeled)
axes[1].set_title('Labeled Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

RGB Label Image1

使用自定义结构元素

我们可以使用自定义结构元素和标签函数根据需要分割图像。结构元素是一个奇数维的二元数组,由 1 和 0 组成,它定义了图像标记过程中邻域像素的连接模式。

1 表示连接分析中包含的相邻像素,而 0 表示排除或忽略的邻居。

例如,让我们考虑自定义结构元素:[[1, 0, 0], [0, 1, 0], [0, 0, 1]]。 这个结构元素意味着对角线连接。这意味着对于图像中的每个像素,在标记或分割过程中,只有对角线向上和向下像素被认为是其邻居。

示例

在这里,我们定义了一个自定义结构元素来标记图像。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image_rgb = mh.imread('sea.bmp')
image = image_rgb[:,:,0]
# Applying gaussian filtering
image = mh.gaussian_filter(image, 4)
image = (image > image.mean())
# Creating a custom structuring element
binary_closure = np.array([[0, 1, 0],
[0, 1, 0],
[0, 1, 0]])
# Converting it to a labeled image
labeled, num_objects = mh.labeled.label(image, Bc=binary_closure)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original RGB image
axes[0].imshow(image_rgb)
axes[0].set_title('RGB Image')
axes[0].set_axis_off()
# Displaying the labeled image
axes[1].imshow(labeled)
axes[1].set_title('Labeled Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figure
mtplt.show()

输出

执行上述代码后,我们将得到以下输出:

RGB Label Image2
广告