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 # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 计算平均强度值 mean_value = np.mean(image) # 创建阈值图像 threshold_image = image > mean_value # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示阈值图像 axes[1].imshow(threshold_image, cmap='gray') axes[1].set_title('Threshold Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
以下是上述代码的输出 −

设置逆阈值
我们还可以为图像设置逆阈值。在逆阈值中,强度大于阈值的像素被归类为背景,而强度小于阈值的像素被归类为前景。
在 mahotas 中,逆阈值可以分两步完成。第一步是使用 numpy.mean() 函数计算图像的阈值。
第二步是使用小于运算符 (<) 而不是正常阈值中使用的大于运算符 (>) 将图像的像素强度与平均阈值进行比较。
示例
以下示例显示了从灰度图像创建逆阈值图像。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 计算平均强度值 mean_value = np.mean(image) # 创建逆阈值图像 threshold_image = image < mean_value # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示阈值图像 axes[1].imshow(threshold_image, cmap='gray') axes[1].set_title('Threshold Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
上述代码的输出如下 −

设置自定义阈值
设置阈值的另一种方法是为图像设置自定义阈值。这是一个完全基于图像决定的随机数。
自定义阈值是一个任意数,不是使用任何数学公式计算的。这就是为什么不应将自定义值用作阈值的原因。
另一个原因是自定义值可能会产生噪声明显更多的图像。
在 mahotas 中,我们可以分配一个任意数来设置自定义阈值。然后我们可以使用该值并比较图像的像素以生成阈值图像。
注意 −将阈值设置为 0 或 255 将导致最终图像仅由前景像素或背景像素组成。
示例
在这里,我们设置了一个任意数字作为阈值。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 设置阈值 threshold_value = 200 # 创建阈值图像 threshold_image = image >阈值值 # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示阈值图像 axes[1].imshow(threshold_image, cmap='gray') axes[1].set_title('Threshold Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
执行上述代码后,我们得到以下输出 −
