Mahotas - 均值滤波器
均值滤波器用于平滑图像以减少噪声。它的工作原理是计算指定邻域内所有像素的平均值,然后用平均值替换原始像素的值。
假设我们有一张灰度图像,其强度值各不相同。因此,某些像素的强度值可能高于其他像素。
因此,均值滤波器用于通过稍微模糊图像来创建像素的统一外观。
Mahotas 中的均值滤波器
要应用 mahotas 中的均值滤波器,我们可以使用 mean_filter() 函数。
Mahotas 中的均值滤波器使用结构元素来检查邻域中的像素。
结构元素将每个像素值替换为其相邻像素的平均值。
结构元素的大小决定了平滑的程度。邻域越大,平滑效果越强,同时会减少一些精细细节,而邻域越小,平滑效果越差,但会保留更多细节。
mahotas.mean_filter() 函数
mean_filter() 函数使用指定的邻域大小将均值滤波器应用于输入图像。
它将每个像素值替换为其邻居中的多数值。过滤后的图像存储在输出数组中。
语法
以下是 mahotas − 中均值 filter() 函数的基本语法
mahotas.mean_filter(f, Bc, mode='ignore', cval=0.0, out=None)
其中,
img − 它是输入图像。
Bc − 它是定义邻域的结构元素。
mode(可选) −它指定函数如何处理图像的边界。它可以采用不同的值,例如"reflect"、"constant"、"nearest"、"mirror"或"wrap"。
默认情况下,它设置为"ignore",这意味着过滤器会忽略图像边界之外的像素。
cval(可选) − 当 mode='constant' 时要使用的值。默认值为 0.0。
out(可选) − 它指定将存储过滤后的图像的输出数组。它必须与输入图像具有相同的形状。
示例
以下是使用 mean_filter() 函数过滤图像的基本示例 −
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt image=mh.imread('tree.tiff', as_grey = True) structuring_element = mh.disk(12) filtered_image = mh.mean_filter(image, structuring_element) # 显示原始图像 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('Mean Filtered') axes[1].axis('off') mtplt.show()
输出
执行上述代码后,我们得到以下输出 −

带反射模式的均值滤波器
当我们将均值滤波器应用于图像时,我们需要考虑每个像素周围的相邻像素来计算平均值。然而,在图像的边缘,有些像素在一侧或多侧没有邻居。
为了解决这个问题,我们使用"反射"模式。反射模式沿图像边缘创建镜像效果。它允许我们通过以镜像方式复制其像素来虚拟扩展图像。
这样,即使在边缘,我们也可以为均值滤波器提供相邻像素。
通过反射图像值,均值滤波器现在可以将这些镜像像素视为真实邻居。
它使用这些虚拟邻居计算平均值,从而在图像边缘实现更准确的平滑处理。
示例
在这里,我们尝试使用反射模式计算均值滤波器 −
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt image=mh.imread('nature.jpeg', as_grey = True) structuring_element = mh.morph.dilate(mh.disk(12), Bc=mh.disk(12)) filtered_image = mh.mean_filter(image, structuring_element, mode='reflect') # 显示原始图像 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('Mean Filtered') axes[1].axis('off') mtplt.show()
输出
上述代码的输出如下 −

通过将结果存储在输出数组中
我们也可以使用 Mahotas 将均值滤波器的结果存储在输出数组中。为此,我们首先需要使用 NumPy 库创建一个空数组。
此数组使用与输入图像相同的形状初始化,以存储结果滤波图像。数组的数据类型指定为浮点(默认)。
最后,我们将结果滤波图像作为参数传递给 mean_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) # 将结果存储在输出数组中 mh.mean_filter(image, Bc=mh.disk(12), 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('Mean Filtered') axes[1].axis('off') mtplt.show()
输出
以下是上述代码的输出 −
