Mahotas - 设置阈值



设置阈值是指为图像定义一个阈值,以执行图像阈值化。图像阈值化是将灰度图像转换为二值图像的过程,其中像素被分为两类:前景或背景。

强度值高于阈值的像素被分配到前景,而低于阈值的像素被分配到背景类。

阈值范围从 0 到 255,其中值为 0 产生仅包含前景(白色)的图像,值为 255 产生仅包含背景(黑色)的图像。

在 Mahotas 中设置阈值

在 Mahotas 中,我们可以使用 **numpy.mean()** 函数设置图像的阈值。

此函数将灰度图像作为输入,并计算其像素的平均强度值。

然后将平均值设置为阈值。任何强度超过阈值的像素都被分类为前景,而强度低于阈值的像素则被分类为背景。

**注意** - Mahotas 没有提供直接设置阈值的方法,但是可以通过将 mahotas 与 numpy 结合使用来实现。

语法

以下是 numpy 中 mean() 函数的基本语法:

numpy.mean(image)

其中,

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

示例

在下面的示例中,我们使用 np.mean() 函数设置灰度图像的阈值。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('sun.png')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Calculating mean intensity value
mean_value = np.mean(image)
# Creating threshold image
threshold_image = image > mean_value
# 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('Threshold Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

以下是上述代码的输出:

Setting Threshold

设置反向阈值

我们还可以为图像设置反向阈值。在反向阈值中,强度大于阈值的像素被分类为背景,而强度小于阈值的像素被分类为前景。

在 mahotas 中,反向阈值化可以分两步完成。第一步是使用 numpy.mean() 函数计算图像的阈值。

第二步是使用小于运算符 (<) 而不是正常阈值化中使用的大于运算符 (>),将图像的像素强度与平均阈值进行比较。

示例

以下示例显示了如何从灰度图像创建反向阈值图像。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('sun.png')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Calculating mean intensity value
mean_value = np.mean(image)
# Creating inverse threshold image
threshold_image = image < mean_value
# 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('Threshold Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

上述代码的输出如下:

Inverse Threshold

设置自定义阈值

设置阈值的另一种方法是为图像设置自定义阈值。它是一个完全基于图像决定的随机数。

自定义阈值是一个任意数字,不是使用任何数学公式计算的。这就是为什么不应将自定义值用作阈值的原因。

另一个原因是,自定义值可能会产生噪声明显更大的图像。

在 mahotas 中,我们可以分配一个任意数字来设置自定义阈值。然后,我们可以使用此值并将图像的像素与其进行比较以生成阈值图像。

**注意** - 将阈值设置为 0 或 255 将导致最终图像仅包含前景像素或背景像素。

示例

在这里,我们设置了一个任意数字作为阈值。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('sun.png')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Setting threshold value
threshold_value = 200
# Creating threshold image
threshold_image = image > threshold_value
# 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('Threshold Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

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

Custom Threshold Value
广告