Mahotas - 中值滤波器
中值滤波器是另一种常用的图像降噪技术。它的工作原理是计算相邻像素之间的中间值,并用该中间值替换原始像素值。
为了理解中值滤波器,让我们考虑相同的黑白图像场景,其中小黑点代表噪声。图像中的每个像素都有一个二进制值减去白色(代表感兴趣的对象)或黑色(代表背景)。
对于每个像素,中值滤波器都会获取窗口内相邻像素的像素值。然后根据它们的强度值按升序排列它们。
之后,它选择中间值,即中值,并用该中值替换原始像素值。
Mahotas 中的中值滤波器
要在 Mahotas 中应用中值滤波器,您可以使用 median_filter() 函数。
Mahotas 中的中值滤波器函数使用结构元素来检查邻域中的像素。
结构元素通过计算邻域内的中间值来替换每个像素的值。
结构元素的大小决定了中值滤波器应用的平滑程度。
邻域越大,平滑效果越强,同时减少图像的精细细节。另一方面,较小的邻域会导致平滑度降低,但会保留更多细节。
mahotas.median_filter() 函数
median_filter() 函数使用指定的邻域大小将中值滤波器应用于输入图像。它将每个像素值替换为其邻居之间计算的中值。过滤后的图像存储在输出数组中。
语法
以下是 mahotas − 中中值滤波器函数的基本语法
mahotas.median_filter(img, Bc={square}, mode='reflect', cval=0.0, out={np.empty(f.shape, f.dtype})
其中,
img − 它是输入图像。
Bc − 它是定义邻域的结构元素。默认情况下,它是边长为 3 的正方形。
mode(可选) − 它指定函数如何处理图像的边界。它可以采用不同的值,例如"reflect"、"constant"、"nearest"、"mirror"或'wrap'。默认情况下,它设置为 'reflect'。
cval(可选) − 当 mode='constant' 时要使用的值。默认值为 0.0。
out(可选) − 它指定将存储过滤后的图像的输出数组。它必须与输入图像具有相同的形状和数据类型。
示例
以下是使用 median_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.median_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('Median 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.median_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('Median Filtered') axes[1].axis('off') mtplt.show()
输出
上述代码的输出如下 −

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