Mahotas - Bernsen 局部阈值化



Bernsen 局部阈值化是一种用于将图像分割成前景和背景区域的技术。它利用局部邻域的强度变化为图像中的每个像素分配阈值。

局部邻域的大小使用窗口确定。较大的窗口大小在阈值化过程中考虑更多的邻域像素,从而在区域之间创建更平滑的过渡,但会去除更精细的细节。

另一方面,较小的窗口大小可以捕获更多细节,但可能容易受到噪声的影响。

Bernsen 局部阈值化与其他阈值化技术的区别在于,Bernsen 局部阈值化使用动态阈值,而其他阈值化技术使用单个阈值来分离前景和背景区域。

Mahotas 中的 Bernsen 局部阈值化

在 Mahotas 中,我们可以使用 **thresholding.bernsen()** 和 **thresholding.gbernsen()** 函数将 Bernsen 局部阈值化应用于图像。这些函数创建一个固定大小的窗口,并计算窗口内每个像素的局部对比度范围以分割图像。

局部对比度范围是窗口内的最小和最大灰度值。

然后将阈值计算为最小和最大灰度值的平均值。如果像素强度高于阈值,则将其分配给前景(白色),否则将其分配给背景(黑色)。

然后窗口在图像上移动以覆盖所有像素,以创建二值图像,其中前景和背景区域根据局部强度变化进行分离。

mahotas.tresholding.bernsen() 函数

mahotas.thresholding.bernsen() 函数以灰度图像作为输入,并对其应用 Bernsen 局部阈值化。它输出一个图像,其中每个像素被分配 0(黑色)或 255(白色)的值。

前景像素对应于图像中具有相对较高强度的区域,而背景像素对应于图像中具有相对较低强度的区域。

语法

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

mahotas.thresholding.bernsen(f, radius, contrast_threshold, gthresh={128})

其中,

  • **f** - 输入灰度图像。

  • **radius** - 每个像素周围窗口的大小。

  • **contrast_threshold** - 局部阈值。

  • **gthresh(可选)** - 全局阈值(默认为 128)。

示例

以下示例显示了使用 mh.thresholding.bernsen() 函数将 Bernsen 局部阈值化应用于图像。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('nature.jpeg')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Creating Bernsen threshold image
threshold_image = mh.thresholding.bernsen(image, 5, 200)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the threshold image
axes[1].imshow(threshold_image, cmap='gray')
axes[1].set_title('Bernsen Threshold Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

Bernsen Local Thresholding

mahotas.thresholding.gbernsen() 函数

mahotas.thresholding.gbernsen() 函数也对输入灰度图像应用 Bernsen 局部阈值化。

它是 Bernsen 局部阈值化算法的广义版本。它输出一个分割图像,其中每个像素被分配 0 或 255 的值,具体取决于它是背景还是前景。

gbernsen() 和 bernsen() 函数的区别在于,gbernsen() 函数使用结构元素来定义局部邻域,而 bernsen() 函数使用固定大小的窗口来定义像素周围的局部邻域。

此外,gbernsen() 根据对比度阈值和全局阈值计算阈值,而 bernsen() 仅使用对比度阈值来计算每个像素的阈值。

语法

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

mahotas.thresholding.gbernsen(f, se, contrast_threshold, gthresh)

其中,

  • **f** - 输入灰度图像。

  • **se** - 结构元素。

  • **contrast_threshold** - 局部阈值。

  • **gthresh(可选)** - 全局阈值。

示例

在这个例子中,我们使用 mh.thresholding.gbernsen() 函数将广义 Bernsen 局部阈值化应用于图像。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('nature.jpeg')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Creating a structuring element
structuring_element = np.array([[0, 0, 0],[0, 0, 0],[1, 1, 1]])
# Creating generalized Bernsen threshold image
threshold_image = mh.thresholding.gbernsen(image, structuring_element, 200,
128)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the threshold image
axes[1].imshow(threshold_image, cmap='gray')
axes[1].set_title('Generalized Bernsen Threshold Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

上述代码的输出如下:

Bernsen Local Thresholding1

使用均值的 Bernsen 局部阈值化

我们可以使用像素强度的平均值作为阈值来应用 Bernsen 局部阈值化。它指的是图像的平均强度,通过将所有像素的强度值求和,然后除以像素总数来计算。

在 mahotas 中,我们可以首先使用 numpy.mean() 函数找到所有像素的平均像素强度。然后,我们定义一个窗口大小以获取像素的局部邻域。

最后,我们将平均值设置为阈值,将其传递给 bernsen() 或 gbernsen() 函数的 **contrast_threshold** 参数。

示例

这里,我们正在对图像应用 Bernsen 局部阈值化,其中阈值是所有像素强度的平均值。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('nature.jpeg')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Calculating mean pixel value
mean = np.mean(image)
# Creating bernsen threshold image
threshold_image = mh.thresholding.bernsen(image, 15, mean)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the threshold image
axes[1].imshow(threshold_image, cmap='gray')
axes[1].set_title('Bernsen Threshold Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

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

Bernsen Local Thresholding Mean
广告