Mahotas - 边界像素
边界像素是位于图像边界或边缘的像素。边界像素至少有一个相邻像素属于不同的区域或具有不同的值,表示感兴趣区域和背景之间的过渡。
例如,在二进制图像中,对象由白色像素表示,背景由黑色像素表示,边界像素将是与黑色像素相邻的白色像素。
Mahotas 中的边界像素
在 Mahotas 中,我们可以使用 labeled.border() 和 labeled.borders() 函数提取边界像素。这些函数通过检查具有不同标签的相邻像素来检测边界,同时还考虑结构元素指定的连接性。
使用 mahotas.labeled.border() 函数
mahotas.labeled.border() 函数将标记图像作为输入,并返回显示边界像素的相同大小的二进制图像。此函数提取标记图像的两个指定区域之间的边界像素。
在生成的图像中,边界像素标记为 True(或 1),非边界像素标记为 False(或 0)。
语法
以下是 mahotas − 中 border() 函数的基本语法
mahotas.labeled.border(labeled, i, j, Bc={3x3 cross}, out={np.zeros(labeled.shape, bool)}, always_return=True)
其中,
labeled − 它是输入数组。
i − 它是第一个区域的标签。
j − 它是第二个区域的标签。
Bc(可选) − 它是用于连接的结构元素。
out(可选) −它是输出数组(默认为与标记形状相同的新数组)。
always_return(可选) − 它是一个标志,用于指示在没有边框像素时是否返回输出(默认为 True)。
示例
在下面的示例中,我们使用 mh.labeled.border() 函数提取标记区域 1 的边框像素。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image_rgb = mh.imread('sea.bmp') image = image_rgb[:,:,0] # 应用高斯滤波 image = mh.gaussian_filter(image, 4) image = (image > image.mean()) # 将其转换为带标签的图像 labeled, num_objects = mh.label(image) # 获取边框像素 border_pixels = mh.labeled.border(labeled, 0, 1) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始 RGB 图像 axes[0].imshow(image_rgb) axes[0].set_title('RGB Image') axes[0].set_axis_off() # 显示边框像素 axes[1].imshow(border_pixels) axes[1].set_title('Border Pixels') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
以下是上述代码的输出 −

使用 mahotas.labeled.borders() 函数
mahotas.labeled.borders() 函数从标记图像中提取所有边框像素。它类似于 mahotas.labeled.border() 函数,因为它会检查具有不同标签的相邻像素以检测边界。
它还会生成一个二进制图像,其中边界像素标记为 True(或 1),非边界像素标记为 False(或 0)。
语法
以下是 mahotas 中 borders() 函数的基本语法 −
mahotas.labeled.borders(labeled, Bc={3x3 cross}, out={np.zeros(labeled.shape, bool)})
其中,
labeled − 它是输入数组。
Bc(可选) − 它是用于连接的结构元素。
out(可选) −它是输出数组(默认为与标记形状相同的新数组)。
示例
在这里,我们使用 mh.labeled.borders() 函数提取标记图像的所有边框像素。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image_rgb = mh.imread('nature.jpeg') image = image_rgb[:,:,0] # 应用高斯滤波 image = mh.gaussian_filter(image, 4) image = (image > image.mean()) # 将其转换为标记图像 labeled, num_objects = mh.label(image) # 获取边框像素 border_pixels = mh.labeled.borders(labeled) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始 RGB 图像 axes[0].imshow(image_rgb) axes[0].set_title('RGB Image') axes[0].set_axis_off() # 显示边框像素 axes[1].imshow(border_pixels) axes[1].set_title('Border Pixels') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
上述代码的输出如下 −

使用自定义结构元素
我们还可以使用自定义结构元素更准确地检测边界像素。结构元素是由 1 和 0 组成的奇数维二进制数组。
它定义了识别边界像素时邻域像素的连接模式。我们可以使用 numpy 库中的 array() 函数定义自定义结构元素。
例如,让我们将二进制数组:[[0, 1, 0],[0, 1, 0],[0, 1, 0]]视为结构元素。此结构元素意味着垂直连接,即对于每个像素,只有其正上方和正下方(在同一列中)的像素才被视为其邻居。
默认情况下,mahotas.labeled.border() 和 mahotas.labeled.borders() 都使用 3×3 十字形结构元素。此结构元素在确定连接性时会考虑每个像素的四个直接邻居(顶部、底部、左侧和右侧)。
示例
以下示例显示了使用自定义结构元素提取边框像素。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image_rgb = mh.imread('sun.png') image = image_rgb[:,:,0] # 应用高斯滤波 image = mh.gaussian_filter(image, 4) image = (image > image.mean()) # 转换为带标签的图像 labeled, num_objects = mh.label(image) # 创建自定义结构元素 binary_closure = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]]) # 获取边框像素 border_pixels = mh.labeled.borders(labeled, Bc=binary_closure) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始 RGB 图像 axes[0].imshow(image_rgb) axes[0].set_title('RGB Image') axes[0].set_axis_off() # 显示边框像素 axes[1].imshow(border_pixels) axes[1].set_title('Border Pixels') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
生成的输出如下所示 −
