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 (可选) - 输出数组(默认为与labeled形状相同的新的数组)。

  • always_return (可选) - 一个标志,指示是否在没有边界像素时返回输出(默认为True)。

示例

在下面的示例中,我们使用mh.labeled.border()函数提取标记区域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())
# Converting it to a labeled image
labeled, num_objects = mh.label(image)
# Getting border pixels
border_pixels = mh.labeled.border(labeled, 0, 1)
# 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 border pixels
axes[1].imshow(border_pixels)
axes[1].set_title('Border Pixels')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Show the figure
mtplt.show()
输出

以下是上述代码的输出:

Border Pixels Image

使用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 (可选) - 输出数组(默认为与labeled形状相同的新的数组)。

示例

在这里,我们使用mh.labeled.borders()函数提取标记图像的所有边界像素。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image_rgb = mh.imread('nature.jpeg')
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)
# Get border pixels
border_pixels = mh.labeled.borders(labeled)
# 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 border pixels
axes[1].imshow(border_pixels)
axes[1].set_title('Border Pixels')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

上述代码的输出如下:

Border Pixels Image1

使用自定义结构元素

我们还可以使用自定义结构元素来更精确地检测边界像素。结构元素是一个奇数维度的二值数组,由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
# 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 to a labeled image
labeled, num_objects = mh.label(image)
# Creating a custom structuring element
binary_closure = np.array([[0, 1, 0],
[0, 1, 0],
[0, 1, 0]])
# Getting border pixels
border_pixels = mh.labeled.borders(labeled, Bc=binary_closure)
# Create 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 border pixels
axes[1].imshow(border_pixels)
axes[1].set_title('Border Pixels')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

产生的输出如下所示:

Border Pixels Image2
广告