Mahotas 简明教程
Mahotas - Border Pixels
边界像素是指位于图像边界或边缘上的像素。边界像素至少有一个属于不同区域或具有不同值的相邻像素,表示感兴趣区域和背景之间的过渡。
例如,在对象由白色像素表示而背景由黑色像素表示的二值图像中,边界像素将与黑色像素相邻的那些白色像素。
Border Pixels in Mahotas
在 Mahotas 中,我们可以使用 labeled.border() 和 labeled.borders() 函数提取边界像素。这些函数通过检查具有不同标记的相邻像素并同时考虑由结构元素指定的连通性来检测边界。
Using the mahotas.labeled.border() Function
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 (optional) − 这是用于连接性的结构元素。
-
out (optional) − 这是输出数组(默认为等于标记形状的新数组)。
-
always_return (optional) − 是一个标志,表明在没有边界像素时是否返回输出(默认为 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()
以下是上面代码的输出: -
Using the mahotas.labeled.borders() Function
mahotas.labeled.borders() 函数从标记图像中提取 all 边界像素。它类似于 mahotas.labeled.border() 函数,它检查具有不同标记的相邻像素以检测边界。
它还生成一个二值图像,其中边界像素标记为 True(或 1),而非边界像素标记为 False(或 0)。
以下是 mahotas 中 borders() 函数的基本语法 −
mahotas.labeled.borders(labeled, Bc={3x3 cross}, out={np.zeros(labeled.shape,
bool)})
其中,
-
labeled − 这是输入数组。
-
Bc (optional) − 这是用于连接性的结构元素。
-
out (optional) − 这是输出数组(默认为等于标记形状的新数组)。
在这里,我们使用 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()
上述代码的输出如下:
Using Custom Structuring Element
我们还可以使用自定义结构元素更准确地检测边界像素。结构元素是由 1 和 0 组成的一个奇数维二进制数组。
它定义了识别边界像素时邻域像素的连通性模式。我们可以使用 numpy 库中的 array() 函数定义一个自定义结构元素。
例如,让我们考虑二进制数组: [[0, 1, 0],[0, 1, 0],[0, 1, 0]] 作为结构元素。此结构元素表示垂直连通性,这意味着对于每个像素,只有正上方和正下方的像素(在同一列中)被视为其邻居。
Example
以下示例显示了使用自定义结构元素提取边界像素。
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()
下面显示了产生的输出: