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

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