SciPy 高通滤波器怎么实现?

文章导读
Previous Quiz Next 高通滤波器 High-pass Filter 在图像处理中用于强调图像的高频分量,如边缘、细微细节和快速强度变化,同时抑制低频分量,如平滑区域或渐变强度变化。这使得高通滤波器特别适用于边缘检测、图像锐化和特征增强等任务。
📋 目录
  1. A 高通滤波器
  2. B 高通滤波器的关键概念
  3. C 高通滤波器的类型
  4. D 空间域高通滤波器
  5. E 基于梯度的滤波器
  6. F Sobel 滤波器
  7. G Prewitt Filter
  8. H Roberts Cross 滤波器
  9. I Scharr 滤波器
  10. J 中心差分滤波器
A A

SciPy - 高通滤波器



Previous
Quiz
Next

高通滤波器

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): 这表示强度变化的强度,即边缘强度。
  • Magnitude Gradient Formula
  • Direction(θ): 这表示边缘的方向。
  • Direction Gradient Formula

其中 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 滤波器后的图像输出 −

Sobel Filter

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() 函数的输出 −

prewitt Filter example

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 滤波器 −

Roberts Cross Filter example

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 滤波器 的输出 −

Scharr Filter example

中心差分滤波器

中心差分滤波器 是一种用于图像处理的梯度算子,用于近似像素强度的导数。它对称地计算相邻像素之间的差值,有助于检测强度变化,因此适用于边缘检测任务。该滤波器简单,常用于只需基本梯度近似即可满足的应用场景。

该滤波器使用小型卷积核来计算水平和垂直方向的梯度。

在 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() 函数的输出结果,该函数用于应用 中心差分滤波器 −

Central Difference Filter example