SciPy - 低通滤波器
SciPy - 低通滤波器
低通滤波器也被称为平滑滤波器,在图像处理中用于通过减少高频分量(如噪声或快速强度变化)来平滑或模糊图像。这些滤波器保留低频信息,即平滑变化,同时衰减高频细节如边缘或噪声。
数学上,我们可以通过将图像 I(x,y) 与一个 kernel K 进行卷积来定义低通滤波器,如下所示 −
SciPy 中可用的低通滤波器类型如下 −
SciPy 中的 Box Filter
Box filter也被称为均匀滤波器,它计算由 kernel 大小定义的邻域内所有像素的平均强度。它简单且快速,但可能会模糊边缘。在 SciPy 中,我们可以使用函数 scipy.ndimage.uniform_filter() 将 box filter 应用于图像。size 参数定义邻域大小,较大的尺寸会产生更多模糊并减少图像细节。
以下示例使用函数 scipy.ndimage.uniform_filter() 在图像上应用均匀滤波器 −
from scipy.ndimage import uniform_filter
import matplotlib.pyplot as plt
from skimage import data
# 加载示例图像
image = data.camera()
# 应用 5x5 大小的 box filter(均匀滤波器)
filtered_image = uniform_filter(image, size=5)
# 显示原始图像和滤波后图像
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title("原始图像")
plt.imshow(image, cmap="gray")
plt.subplot(1, 2, 2)
plt.title("Box Filter (5x5)")
plt.imshow(filtered_image, cmap="gray")
plt.show()
以下是 box filter 的输出 −
SciPy 中的 Gaussian Filter
Gaussian filter是最流行的低通滤波器之一。它使用 Gaussian kernel,其中靠近 kernel 中心的像素具有更高的权重。我们可以使用函数 scipy.ndimage.gaussian_filter() 将 Gaussian filter 应用于图像。
Gaussian kernel 的定义如下 −
其中,σ 是 Gaussian 的标准差,用于控制平滑量。
σ 用于控制平滑程度,较大的值会产生更大的模糊,Gaussian 平滑非常适合去除噪声而不严重模糊边缘。
以下示例展示如何使用函数 scipy.ndimage.gaussian_filter() 在图像上应用 gaussian filter −
from scipy.ndimage import gaussian_filter
import matplotlib.pyplot as plt
from skimage import data
# 加载示例图像
image = data.camera()
# 应用标准差 sigma=2 的 Gaussian filter
gaussian_blurred = gaussian_filter(image, sigma=2)
# 显示原始图像和模糊图像
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title("原始图像")
plt.imshow(image, cmap="gray")
plt.subplot(1, 2, 2)
plt.title("Gaussian Filter (sigma=2)")
plt.imshow(gaussian_blurred, cmap="gray")
plt.show()
以下是 Gaussian filter 的输出 −

SciPy 中的均值滤波器
均值滤波器 将每个像素替换为其邻域像素的平均值。虽然它对降噪有效,但无法很好地保留边缘。
该滤波核对像素强度进行平均化,从而产生简单的平滑效果,较大的滤波核会增强平滑效果,但会牺牲边缘细节。
在本示例中,我们使用函数 scipy.ndimage.convolve() 将均值滤波器应用到给定的输入图像上 −
from scipy.ndimage import convolve
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
# 加载示例图像
image = data.camera()
# 定义均值滤波器核 (3x3)
mean_kernel = np.ones((3, 3)) / 9
# 使用卷积应用均值滤波器
mean_filtered = convolve(image, mean_kernel)
# 显示原始图像和均值滤波后的图像
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(image, cmap="gray")
plt.subplot(1, 2, 2)
plt.title("Mean Filter (3x3)")
plt.imshow(mean_filtered, cmap="gray")
plt.show()
以下是均值滤波器的输出结果 −
以下示例比较了我们可以在给定输入图像上使用的三种不同类型的低通滤波器 −
from scipy import ndimage
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
# 加载示例图像
image = data.camera()
# 定义均值滤波器核 (3x3)
mean_kernel = np.ones((3, 3)) / 9
# 应用不同的滤波器并进行比较
gaussian = ndimage.gaussian_filter(image, sigma=2)
mean = ndimage.convolve(image, mean_kernel)
box = ndimage.uniform_filter(image, size=5)
# 显示结果
plt.figure(figsize=(15, 8))
plt.subplot(2, 2, 1)
plt.title("Original Image")
plt.imshow(image, cmap="gray")
plt.subplot(2, 2, 2)
plt.title("Gaussian Filter")
plt.imshow(gaussian, cmap="gray")
plt.subplot(2, 2, 3)
plt.title("Mean Filter")
plt.imshow(mean, cmap="gray")
plt.subplot(2, 2, 4)
plt.title("Box Filter")
plt.imshow(box, cmap="gray")
plt.tight_layout()
plt.show()
以下是上述代码比较不同低通滤波器的输出结果 −
