SciPy - 高通滤波器
高通滤波器
High-pass Filter 在图像处理中用于强调图像的高频分量,如边缘、细微细节和快速强度变化,同时抑制低频分量,如平滑区域或渐变强度变化。这使得高通滤波器特别适用于边缘检测、图像锐化和特征增强等任务。
高通滤波器的关键概念
以下是 SciPy 中高通滤波器的关键概念 −
- High Frequencies: 这些表示尖锐的强度过渡,如边缘、噪声或细微纹理。
- Low Frequencies: 这些表示平滑过渡,如均匀区域或渐变阴影。
- Purpose: 这些滤波器的目的是保留高频细节,同时衰减低频背景信息。
高通滤波器的类型
在 High Pass Filters 中,有不同类型,每种滤波器都有其独特特性,适用于特定任务。它们是 −
- Gradient-Based Filters
- Sobel Filter
- Prewitt Filter
- Roberts Cross Filter
- Charr Filter
- Central Difference Filter
让我们详细了解每种滤波器 −
空间域高通滤波器
在图像处理中,spatial domain high-pass filters 通过直接修改像素强度来强调高频分量,如边缘、细微细节和快速强度过渡。这些滤波器使用与特定 kernel 或操作的卷积来实现所需效果。
在 spatial domain high-pass filters 中,有不同类型的滤波器,如下所示 −
基于梯度的滤波器
Gradient-based filters 是边缘检测技术,通过计算图像中的梯度(即一阶导数)来强调强度变化。它们广泛用于图像处理中的特征提取、边缘检测和对象识别等任务。
图像在某一点的梯度是一个向量,表示强度变化的速率和方向,可以表示为幅度 (G) 和方向 (θ)。
- Magnitude(G): 这表示强度变化的强度,即边缘强度。
- Direction(θ): 这表示边缘的方向。
其中 Gx 和 Gy 分别是水平和垂直方向的梯度。
在 Gradient Filters 中,又有不同类型,可以列为如下 −
Sobel 滤波器
Sobel 滤波器 是一种基于梯度的边缘检测技术,用于图像处理中检测边缘并突出显示高空间频率区域。它计算图像强度在水平 Gx 和垂直 Gy 方向上的梯度,并将结果组合生成边缘图。
在 SciPy 中,我们可以使用 scipy.ndimage.sobel() 函数对给定图像应用 Sobel 滤波器。
语法
以下是使用 scipy.ndimage.sobel() 函数对图像应用 Sobel 滤波器的语法 −
scipy.ndimage.sobel(input, axis=-1, output=None, mode='reflect', cval=0.0)
以下是 scipy.ndimage.sobel() 函数的参数 −
- input (array_like): 应用 Sobel 滤波器的输入图像或数组,通常这是一个 2D 灰度图像。
- axis (int, optional): 计算导数的轴,当值为 1 时在水平方向(Gx)应用 Sobel 滤波器,当值为 0 时在垂直方向(Gy)应用 Sobel 滤波器。
- output (array or dtype, optional): 指定输出存储位置,如果为 None,则创建一个新数组并返回。
- mode (str, optional): 定义输入数组超出边界时的扩展方式。模式包括 reflect、constant、nearest、mirror 和 wrap。
- cval (scalar, optional): 当 mode='constant' 时使用的常数值。默认值为 0.0。
以下是使用 scipy.ndimage.sobel() 函数对给定图像的示例 −
from scipy.ndimage import sobel
from skimage import data
import matplotlib.pyplot as plt
# 加载示例灰度图像
image = data.camera()
# 应用 Sobel 滤波器
sobel_x = sobel(image, axis=0) # 水平边缘
sobel_y = sobel(image, axis=1) # 垂直边缘
sobel_combined = sobel_x + sobel_y
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 1), plt.title("Original")
plt.imshow(image, cmap='gray')
plt.subplot(1, 3, 2), plt.title("Sobel X (Horizontal Edges)")
plt.imshow(sobel_x, cmap='gray')
plt.subplot(1, 3, 3), plt.title("Sobel Y (Vertical Edges)")
plt.imshow(sobel_y, cmap='gray')
plt.tight_layout()
plt.show()
以下是应用 Sobel 滤波器后的图像输出 −

Prewitt Filter
Prewitt filter 是一种边缘检测算子,用于图像处理,通过计算像素强度的梯度来突出图像中的边缘。它类似于 Sobel filter,但其卷积掩码使用不同的系数。Prewitt filter 强调水平和垂直方向上强度变化的速率。
该滤波器通常涉及两个卷积核(掩码),用于计算水平和垂直方向的梯度。
In scipy 的 scipy.ndimage 模块中没有内置的 Prewitt filter 函数,就像 Sobel filter 一样,但可以通过直接应用 Prewitt kernels 使用 convolve() 函数轻松实现。
以下是用于应用 Prewitt filter 的函数 scipy.ndimage.convolve() 的语法 −
scipy.ndimage.convolve( input, weights, output=None, mode='reflect', cval=0.0, origin=0 )
以下是 scipy.ndimage.convolve() 函数的参数 −
- input (array_like): 应用卷积操作的输入图像或数组。通常这是一个 2D 灰度图像或多维数组。
- weights (array_like): 卷积过程中应用的滤波器或核。它应具有与输入相同的维度数,或可广播。
- output (array or dtype, optional): 该参数指定输出将存储的位置。如果为 None,则创建一个新数组并返回。
- mode (str, optional): 该参数定义输入数组超出边界时的扩展方式。可用模式包括 'reflect'、'constant'、'nearest'、'mirror' 和 'wrap'。默认值为 'reflect'。
- cval (scalar, optional): 当 mode='constant' 时用于填充的常数值。默认值为 0.0。
- origin (int or tuple of ints, optional): 该参数控制核相对于输入元素的位置。默认值为 0,表示将核置于中心。
以下示例使用 scipy.ndimage.convolve() 函数应用 Prewitt filter,基于强度梯度在图像中检测水平和垂直边缘 −
import numpy as np
from scipy.ndimage import convolve
from skimage import data
import matplotlib.pyplot as plt
# 加载示例灰度图像
image = data.camera()
# 定义用于检测垂直和水平边缘的 Prewitt kernels
prewitt_vertical = np.array([[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]])
prewitt_horizontal = np.array([[-1, -1, -1],
[ 0, 0, 0],
[ 1, 1, 1]])
# 在垂直方向应用 Prewitt filter(检测水平边缘)
edges_vertical = convolve(image, prewitt_vertical)
# 在水平方向应用 Prewitt filter(检测垂直边缘)
edges_horizontal = convolve(image, prewitt_horizontal)
# 通过取梯度幅值组合结果
edges_magnitude = np.sqrt(edges_vertical**2 + edges_horizontal**2)
# 显示结果
plt.figure(figsize=(15, 5))
# 原始图像
plt.subplot(1, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis('off')
# 垂直边缘(水平梯度)
plt.subplot(1, 3, 2)
plt.title("Prewitt - Vertical Edges")
plt.imshow(edges_vertical, cmap='gray')
plt.axis('off')
# 边缘幅值
plt.subplot(1, 3, 3)
plt.title("Prewitt - Edge Magnitude")
plt.imshow(edges_magnitude, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
以下是用于应用 prewitt filter 的 convolve() 函数的输出 −

Roberts Cross 滤波器
Roberts Cross 滤波器 是一种用于图像处理的边缘检测算子,通过计算像素强度的对角梯度来突出图像中的边缘。它通过使用小的 2x2 卷积核来实现计算高效,但对噪声敏感。Roberts Cross 滤波器 强调沿对角线的强度变化,从而有效检测这些方向上的边缘。
该滤波器使用两个卷积核(掩码)来计算对角方向上的梯度。
在 scipy.ndimage 模块中没有内置的 Roberts Cross 滤波器 函数。然而,可以使用 convolve() 函数直接应用 Roberts Cross 核来实现。
以下示例使用 scipy.ndimage.convolve() 函数应用 Roberts Cross 滤波器 来检测图像中的边缘 −
import numpy as np
from scipy.ndimage import convolve
from skimage import data
import matplotlib.pyplot as plt
# 加载示例灰度图像
image = data.camera()
# 定义用于对角梯度的 Roberts Cross 核
roberts_cross_vertical = np.array([[1, 0],
[0, -1]])
roberts_cross_horizontal = np.array([[0, 1],
[-1, 0]])
# 应用 Roberts Cross 滤波器计算对角梯度
edges_vertical = convolve(image, roberts_cross_vertical)
edges_horizontal = convolve(image, roberts_cross_horizontal)
# 通过计算梯度的幅值来组合结果
edges_magnitude = np.sqrt(edges_vertical**2 + edges_horizontal**2)
# 显示结果
plt.figure(figsize=(15, 5))
# 原始图像
plt.subplot(1, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis('off')
# 垂直边缘(水平梯度)
plt.subplot(1, 3, 2)
plt.title("Roberts Cross - Vertical Edges")
plt.imshow(edges_vertical, cmap='gray')
plt.axis('off')
# 边缘幅值
plt.subplot(1, 3, 3)
plt.title("Roberts Cross - Edge Magnitude")
plt.imshow(edges_magnitude, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
以下是 convolve() 函数的输出结果,该函数用于应用 Roberts Cross 滤波器 −

Scharr 滤波器
Scharr 滤波器 是一种用于图像处理的边缘检测算子,它是 Sobel 滤波器 的变体,设计目的是实现更好的旋转对称性和准确性。它计算像素强度在水平和垂直方向上的梯度,以突出图像中的边缘。Scharr 滤波器 特别适用于需要精确边缘检测的应用。
In SciPy 中没有直接应用 Scharr 滤波器的函数,但我们可以使用 scipy.ndimage.convolve() 函数来实现它。
以下示例使用 scipy.ndimage.convolve() 函数应用 Scharr 滤波器并检测图像中的边缘 −
import numpy as np
from scipy.ndimage import convolve
from skimage import data
import matplotlib.pyplot as plt
#加载示例灰度图像
image = data.camera()
#定义用于检测垂直和水平边缘的 Scharr 核
scharr_vertical = np.array([[-3, 0, 3],
[-10, 0, 10],
[-3, 0, 3]])
scharr_horizontal = np.array([[-3, -10, -3],
[0, 0, 0],
[3, 10, 3]])
#在垂直方向应用 Scharr 滤波器(检测水平边缘)
edges_vertical = convolve(image, scharr_vertical)
#在水平方向应用 Scharr 滤波器(检测垂直边缘)
edges_horizontal = convolve(image, scharr_horizontal)
#通过计算梯度幅值来组合结果
edges_magnitude = np.sqrt(edges_vertical + edges_horizontal)
#显示结果
plt.figure(figsize=(15, 5))
#原始图像
plt.subplot(1, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis('off')
#垂直边缘(水平梯度)
plt.subplot(1, 3, 2)
plt.title("Scharr - Vertical Edges")
plt.imshow(edges_vertical, cmap='gray')
plt.axis('off')
#边缘幅值
plt.subplot(1, 3, 3)
plt.title("Scharr - Edge Magnitude")
plt.imshow(edges_magnitude, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
以下是使用 convolve() 函数应用 Scharr 滤波器 的输出 −

中心差分滤波器
中心差分滤波器 是一种用于图像处理的梯度算子,用于近似像素强度的导数。它对称地计算相邻像素之间的差值,有助于检测强度变化,因此适用于边缘检测任务。该滤波器简单,常用于只需基本梯度近似即可满足的应用场景。
该滤波器使用小型卷积核来计算水平和垂直方向的梯度。
在 scipy.ndimage 中,中心差分滤波器可以通过 convolve() 函数应用适当的中心差分核来实现。
以下示例使用 scipy.ndimage.convolve() 函数应用 中心差分滤波器 来检测图像中的边缘 −
import numpy as np
from scipy.ndimage import convolve
from skimage import data
import matplotlib.pyplot as plt
# 加载示例灰度图像
image = data.camera()
# 定义用于水平和垂直梯度的中心差分核
central_diff_horizontal = np.array([[-1, 0, 1]])
central_diff_vertical = np.array([[-1], [0], [1]])
# 在水平方向应用中心差分滤波器
edges_horizontal = convolve(image, central_diff_horizontal)
# 在垂直方向应用中心差分滤波器
edges_vertical = convolve(image, central_diff_vertical)
# 通过计算梯度幅值来组合结果
edges_magnitude = np.sqrt(edges_horizontal**2 + edges_vertical**2)
# 显示结果
plt.figure(figsize=(15, 5))
# 原始图像
plt.subplot(1, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis('off')
# 水平边缘
plt.subplot(1, 3, 2)
plt.title("Central Difference - Horizontal Edges")
plt.imshow(edges_horizontal, cmap='gray')
plt.axis('off')
# 边缘幅值
plt.subplot(1, 3, 3)
plt.title("Central Difference - Edge Magnitude")
plt.imshow(edges_magnitude, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
以下是 convolve() 函数的输出结果,该函数用于应用 中心差分滤波器 −
