Mahotas - 多数滤波器
多数滤波器用于去除图像中的噪声。它的工作原理是查看图像中的像素并考虑其相邻像素。
多数滤波器计算其邻居中最常见的像素值,并用该常见值替换原始像素值。
假设您有一张黑白图像,其中白色代表您感兴趣的对象,黑色代表背景。
但是,由于各种原因,物体周围可能会散布一些小黑点(噪声)。
因此,为了减少噪声,它会计算有多少个相邻像素是黑色的,有多少个是白色的。然后,它将原始像素值替换为其邻居中最常出现的颜色(黑色或白色)。
Mahotas 中的多数滤波器
要应用 mahotas 中的多数滤波器,我们可以使用 major_filter() 函数。
Mahotas 中的多数滤波器使用结构元素来检查邻域中的像素。
结构元素计算邻域内的像素值,并用最常见的值替换每个像素的值以减少噪音。
结构元素的大小决定了平滑的程度。邻域越大,平滑效果越强,同时会减少一些更精细的细节,而邻域越小,平滑效果越差,但会保留更多细节。
mahotas.majority_filter() 函数
mahotas.majority_filter() 函数使用指定的邻域大小将多数滤波器应用于输入图像。
它将每个像素值替换为其邻居中的多数值。过滤后的图像存储在输出数组中。
语法
以下是 mahotas − 中多数过滤器的基本语法
mahotas.majority_filter(img, N=3, out={np.empty(img.shape, bool)})
其中,
img − 它是输入图像。
N − 它是过滤器的大小。它必须是一个奇数整数。默认值为 3。
Out(可选) − 它指定将存储过滤后的图像的输出数组。它必须是一个与输入图像大小相同的空布尔数组。
示例
以下是使用 major_filter() 函数过滤图像的基本示例 −
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt image=mh.imread('picture.jpg', as_grey = True) filtered_image = mh.majority_filter(image) # 显示原始图像 fig, axis = mtplt.subplots(1, 2, figsize=(9, 4)) axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].axis('off') # 显示多数滤波后的图像 axes[1].imshow(filtered_image, cmap='gray') axes[1].set_title('Majority Filtered') axes[1].axis('off') mtplt.show()
输出
执行上述代码后,我们得到以下输出 −

通过指定窗口大小
要在 Mahotas 中指定窗口大小,我们需要将其作为参数传递给 major_filter() 函数。
窗口大小是用于确定图像中每个像素的多数值的像素数。
窗口大小必须是奇数整数。这是因为多数过滤器通过查找像素邻域中最常见的值来工作。
如果窗口大小为偶数,则窗口中心将有两个像素具有相同的值,多数过滤器将无法确定哪个值是最常见的。
示例
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt image=mh.imread('picture.jpg', as_grey = True) # 指定过滤器大小 filter_size = 19 # 应用具有指定过滤器大小的多数过滤器 filtered_image = mh.majority_filter(image, N=filter_size) # 显示原始图像 fig,axes = mtplt.subplots(1, 2, figsize=(9, 4)) axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].axis('off') # 显示大多数过滤后的图像 axes[1].imshow(filtered_image, cmap='gray') axes[1].set_title('Majority Filtered') axes[1].axis('off') mtplt.show()
输出
以下是上述代码的输出 −

通过将结果存储在输出数组中
我们也可以使用 Mahotas 将多数过滤器的结果存储在输出数组中。为此,我们首先需要使用 NumPy 库创建一个空数组。
此数组使用与输入图像相同的形状初始化,以存储生成的过滤图像。数组的数据类型指定为 bool,假设为布尔图像。
最后,我们将过滤后的图像作为参数传递给 major_filter() 函数,将其存储在输出数组中。
示例
在这里,我们尝试将多数滤波器应用于灰度图像,并将结果存储在特定的输出数组 − 中。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt image=mh.imread('pic.jpg', as_grey = True) # 为过滤后的图像创建输出数组 output = np.empty(image.shape, dtype=bool) # 应用 3x3 邻域的多数过滤器 # 将结果存储在输出数组中 mh.majority_filter(image, N=3, out=output) # 显示原始图像 fig, axis = mtplt.subplots(1, 2, figsize=(9, 4)) axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].axis('off') # 显示多数过滤后的图像图像 axes[1].imshow(output, cmap='gray') axes[1].set_title('Majority Filtered') axes[1].axis('off') mtplt.show()
输出
上述代码的输出如下 −
