Mahotas 简明教程

Mahotas - Median Filter

中值滤波器是另一种用于图像降噪的常用技术。它的工作原理是计算相邻像素之间的中间(中值)值,并用该中间值替换原始像素值。

为了理解中值滤波器,让我们考虑带黑色小圆点的黑白图像场景,这些小圆点表示噪声。图像中的每个像素都具有二进制值——白色(表示感兴趣的对象)或黑色(表示背景)。

对于每个像素,中值滤波器获取窗口内相邻像素的像素值。然后,它根据这些像素的强度值将它们按升序排列。

之后,它选择中间值(中值),并用该中值替换原始像素值。

Median Filter in Mahotas

要在 Mahotas 中应用中值滤波器,可以使用 median_filter() 函数。

Mahotas 中的中值滤波函数使用结构元素来检查邻域中的像素。

结构元素通过计算其邻域内的中间值来替换每个像素的值。

结构元素的大小决定了中值滤波器应用的平滑程度。

较大的邻域将产生更强的平滑效果,同时减少图像的较精细细节。另一方面,较小的邻域将导致较少的平滑效果,但保留更多细节。

The mahotas.median_filter() function

median_filter() 函数使用指定邻域大小将中值滤波器应用于输入图像。它用在相邻像素之间计算出的中值替换每个像素值。过滤后的图像存储在输出数组中。

以下是 mahotas 中中值滤波器函数的基本语法:

mahotas.median_filter(img, Bc={square}, mode='reflect', cval=0.0,
out={np.empty(f.shape, f.dtype})

其中,

  1. img − 输入图片。

  2. Bc − 它是定义邻域的结构元素。默认情况下,它是一个边长为 3 的正方形。

  3. mode (optional) − 它指定了函数如何处理图像的边界。它可以采用不同的值,如“反射”、“常量”、“最近”、“镜像”或“包裹”。默认情况下,它设置为“反射”。

  4. cval (optional) − 在 mode='constant' 时要使用默认值。默认值为 0.0。

  5. out (optional) − 它指定了将存储过滤图像的输出数组。它必须与输入图像具有相同的形状和数据类型。

以下是用 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)
# Displaying the original image
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')
# Displaying the median filtered image
axes[1].imshow(filtered_image, cmap='gray')
axes[1].set_title('Median Filtered')
axes[1].axis('off')
mtplt.show()

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

median filter

Median Filter with Reflect Mode

当我们对图像应用中值滤波器时,我们需要考虑每个像素周围的相邻像素来计算中值。

但是,在图像的边缘处,有一些像素在一侧或多侧没有相邻像素。

为了解决这个问题,我们使用 'reflect' 模式。Reflect 模式在图片的边缘创建镜面效果。它允许我们通过镜像的方式复制图片的像素,从而虚拟扩展图片。

这样,我们可以在边缘处也为中值滤波器提供相邻像素。

通过反射图像值,中值滤波器现在可以将这些镜像像素视为真实相邻像素。

它使用这些虚拟相邻像素计算中值,从而在图像边缘产生更准确的平滑过程。

Example

在这里,我们尝试使用反射模式计算中值滤波器 −

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')
# Displaying the original image
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')
# Displaying the median filtered image
axes[1].imshow(filtered_image, cmap='gray')
axes[1].set_title('Median Filtered')
axes[1].axis('off')
mtplt.show()

上述代码的输出如下:

median filter reflect mode

By Storing Result in an Output Array

我们还可以使用马霍塔斯将中值滤波器结果存储在输出数组中。为了实现这一点,我们首先需要使用 NumPy 库创建一个空数组。

该数组使用与输入图像相同的形状和数据类型进行初始化,以存储最终的过滤图像。

最后,我们将最终的过滤图像存储在输出数组中,方法是将其作为参数传递给 median_filter() 函数。

Example

现在,我们尝试将中值滤波器应用于灰度图像,并将结果存储在特定的输出数组中 −

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
image=mh.imread('pic.jpg', as_grey = True)
# Create an output array for the filtered image
output = np.empty(image.shape)
# store the result in the output array
mh.median_filter(image, Bc=mh.disk(12), out=output)
# Displaying the original image
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')
# Displaying the median filtered image
axes[1].imshow(output, cmap='gray')
axes[1].set_title('Median Filtered')
axes[1].axis('off')
mtplt.show()

以下是上面代码的输出: -

storing result output array mohatas