Mahotas - 移除带边框的标签
移除带边框的标签是指移除带标签图像中的边框区域。带标签图像由分配了唯一标签的不同区域组成。
带标签图像的边框区域是指沿图像边缘(边界)存在的区域。
边框区域通常会使图像分析变得困难,在某些情况下,还会表示明显的噪声。
因此,移除边框区域对于提高图像分割算法的准确性和减小图像的整体大小非常重要。
在 Mahotas 中移除带边框的标签
在 Mahotas 中,我们可以使用 mahotas.labeled.remove_bordering() 函数从图像中移除边框标签。它会分析图像以检查是否存在任何边框标签。如果找到边框标签,它会确定与该边框标签关联的值。
然后将边框标签的值更新为 0,以将其从图像中删除。由于值 0 与背景相关联,因此所有边框标签都成为背景的一部分。
有时,边框标签可能远离图像边界。如果我们想保留这些边框标签,我们需要指定边框区域和边界之间的最小距离。任何超出此距离的边界区域都将被该函数保留。
mahotas.labeled.remove_bordering() 函数
mahotas.labeled.remove_bordering() 函数将标记图像作为输入,并返回不带任何边界区域的标记图像作为输出。
该函数删除所有尺寸的边界,因此输出图像占用的空间明显小于输入图像。
语法
以下是 mahotas − 中 remove_bordering() 函数的基本语法;
mahotas.labeled.remove_bordering(labeled, rsize=1, out={np.empty_like(im)})
其中,
labeled − 它是输入的带标签图像。
rsize(可选) − 它确定区域与图像边界必须具有的最小距离,以避免被移除(默认值为 1)。
out(可选) −它指定存储输出图像的位置(默认为与标记大小相同的数组)。
示例
在下面的示例中,我们使用 mh.labeled.remove_bordering() 函数从图像中删除边框区域。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('nature.jpeg') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用高斯滤波 image = mh.gaussian_filter(image, 4) # 对图像进行阈值处理 image = image > image.mean() # 标记图像 labeled, num_objects = mh.label(image) # 删除边框标签 remove_border = mh.labeled.remove_bordering(labeled) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示无边框图像 axes[1].imshow(remove_border) axes[1].set_title('Border Removed Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
以下是输出上述代码的 −

移除特定距离的区域
我们还可以移除距离图像边界特定距离的带边框区域。这样,我们就可以移除任何可能因为靠近图像边界而被视为带边框区域的区域。
在 mahotas 中,rsize 参数确定边框区域必须距离图像多远才能保留在图像中。我们需要为此参数设置一个整数值,然后将其传递给 mh.labeled.remove_bordering() 函数。
例如,假设我们将 rsize 的值设置为"200"。然后,将仅保留距离图像边界至少 200 像素的边界区域。
示例
在下面提到的示例中,我们将删除距离图像边界特定距离内的边界区域。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用高斯滤波 image = mh.gaussian_filter(image, 4) # 对图像进行阈值处理 image = image > image.mean() # 标记图像 labeled, num_objects = mh.label(image) # 删除边框标签 remove_border = mh.labeled.remove_bordering(labeled, rsize=200) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示无边框图像 axes[1].imshow(remove_border) axes[1].set_title('Border Removed Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
上述代码的输出如下 −

从图像的特定部分移除区域
移除边界区域的另一种方法是从图像的特定部分移除它们。
图像的特定部分是指通过裁剪较大图像获得的较大图像的一小部分。
在 mahotas 中,要从图像的特定部分移除区域,我们首先从原始图像中识别感兴趣的区域。
然后,我们裁剪图像的已识别部分。然后我们从该部分移除边框区域。
例如,如果我们将值指定为 [:800, :800],则该区域将从 0 像素开始,并在垂直(y 轴)和水平(x 轴)方向上增加到 800 像素。
示例
在这里,我们从图像的特定部分移除边框区域。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('tree.tiff') # 将其转换为灰度 image = mh.colors.rgb2gray(image) image = image[:800, :800] # 应用高斯滤波 image = mh.gaussian_filter(image, 4) # 对图像进行阈值处理 image = image > image.mean() # 标记图像 labeled, num_objects = mh.label(image) # 删除边框标签 remove_border = mh.labeled.remove_bordering(labeled) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示无边框图像 axes[1].imshow(remove_border) axes[1].set_title('Border Removed Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
执行上述代码后,我们得到以下输出 −
