《数字图像处理》第四章 频率域滤波简要学习笔记以及频率域滤波与空间域滤波的区别

请注意:笔记内容片面粗浅,请读者批判着阅读

一、频率域基础与傅里叶变换

1.1 频率域的核心思想

频率域滤波基于傅里叶变换,将图像从空间域 (像素位置)转换到频率域(频率分量)。在频率域中,低频分量对应图像中灰度变化缓慢的区域(如背景),高频分量对应灰度剧烈变化的区域(如边缘和噪声)。这种转换使得滤波操作可以通过调整不同频率分量的幅值来实现,例如抑制噪声(高频)或模糊图像(低频)。

1.2 傅里叶变换原理

一维傅里叶变换:

F ( u ) = ∫ − ∞ + ∞ f ( t ) e − j 2 π u t d t F(u) = \int_{-\infty}^{+\infty} f(t)e^{-j2\pi ut}dt F(u)=∫−∞+∞f(t)e−j2πutdt

二维傅里叶变换(图像处理核心公式):

F ( u , v ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x / M + v y / N ) F(u,v) = \sum_{x=0}^{M-1}\sum_{y=0}^{N-1} f(x,y)e^{-j2\pi(ux/M + vy/N)} F(u,v)=x=0∑M−1y=0∑N−1f(x,y)e−j2π(ux/M+vy/N)

逆变换则为:
f ( x , y ) = 1 M N ∑ u = 0 M − 1 ∑ v = 0 N − 1 F ( u , v ) e j 2 π ( u x / M + v y / N ) f(x,y) = \frac{1}{MN}\sum_{u=0}^{M-1}\sum_{v=0}^{N-1} F(u,v)e^{j2\pi(ux/M + vy/N)} f(x,y)=MN1u=0∑M−1v=0∑N−1F(u,v)ej2π(ux/M+vy/N)

其中 F ( u , v ) F(u,v) F(u,v)为频域表示, f ( x , y ) f(x,y) f(x,y)为空间域图像。

1.3 傅里叶变换的Python实现

此部分通过Python代码展示了如何将图像转换到频率域并可视化其频谱,中心亮区代表低频分量,边缘亮点对应高频分量。

python 复制代码
import numpy as np
import cv2
import matplotlib.pyplot as plt

# 读取图像并转换为灰度图
img = cv2.imread('lena.jpg', 0)
rows, cols = img.shape

# 傅里叶变换及中心化
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))

# 显示原图与频谱
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original')
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray'), plt.title('Magnitude Spectrum')
plt.show()

二、频率域滤波核心步骤

2.1 滤波流程

  1. 图像填充:避免混叠效应,通常扩展为2的幂次方尺寸。
  2. 傅里叶变换:得到复数形式的频域表示。
  3. 滤波器构建:生成与频谱尺寸相同的滤波器矩阵。
  4. 频域相乘:滤波器矩阵与频谱逐点相乘。
  5. 逆变换与裁剪:返回空间域并截取原始尺寸区域。

2.2 关键概念

  • 混淆现象:欠采样导致高频伪装成低频,需通过抗混淆处理(如高斯平滑)缓解。
  • 振铃效应:理想滤波器在频域截断会导致空间域震荡,高斯滤波器可避免此问题。

三、经典滤波器原理与实现

3.1 低通滤波器(图像平滑)

1) 理想低通滤波器(ILPF)

H ( u , v ) = { 1 D ( u , v ) ≤ D 0 0 D ( u , v ) > D 0 H(u,v) = \begin{cases} 1 & D(u,v) \leq D_0 \\ 0 & D(u,v) > D_0 \end{cases} H(u,v)={10D(u,v)≤D0D(u,v)>D0
特性:锐利截止,但会产生明显振铃。

2) 高斯低通滤波器(GLPF)

H ( u , v ) = e − D 2 ( u , v ) / ( 2 D 0 2 ) H(u,v) = e^{-D^2(u,v)/(2D_0^2)} H(u,v)=e−D2(u,v)/(2D02)
特性:平滑过渡,无振铃效应,适用于医学图像处理。

python 复制代码
import numpy as np
import cv2
import matplotlib.pyplot as plt


def gaussian_lpf(image, D0=30):
    """生成高斯低通滤波器
    Args:
        image: 输入图像(用于获取尺寸)
        D0: 截止频率(控制滤波强度)
    Returns:
        H: 滤波器矩阵
    """
    rows, cols = image.shape
    crow, ccol = rows // 2, cols // 2  # 频谱中心坐标

    H = np.zeros((rows, cols))
    for u in range(rows):
        for v in range(cols):
            # 计算到频谱中心的距离
            D = np.sqrt((u - crow) ** 2 + (v - ccol) ** 2)
            # 高斯低通公式
            H[u, v] = np.exp(-(D ** 2) / (2 * D0 ** 2))
    return H


# 读取测试图像
img = cv2.imread(r"D:\software\opencv\opencv\sources\samples\data\lena.jpg", 0)  # 读取灰度图
img = img.astype(np.float32) / 255  # 转换为浮点型并归一化
# ------------------ 主流程 ------------------
# 1. 傅里叶变换
f = np.fft.fft2(img)  # 快速傅里叶变换
fshift = np.fft.fftshift(f)  # 频谱中心化

# 2. 生成滤波器
lpf_filter = gaussian_lpf(img, D0=30)

# 3. 频域滤波
filtered_shift = fshift * lpf_filter  # 逐点相乘

# 4. 逆变换
f_ishift = np.fft.ifftshift(filtered_shift)
img_filtered = np.fft.ifft2(f_ishift)  # 逆FFT
img_filtered = np.abs(img_filtered)  # 取模值

# 5. 频谱可视化
magnitude_spectrum = 20 * np.log(np.abs(fshift) + 1e-5)
filtered_spectrum = 20 * np.log(np.abs(filtered_shift) + 1e-5)

plt.figure(figsize=(12, 6))

plt.subplot(131), plt.imshow(img, cmap='gray'),
plt.title('Original Image'), plt.axis('off')

plt.subplot(132), plt.imshow(magnitude_spectrum, cmap='gray'),
plt.title('Original Spectrum'), plt.axis('off')

plt.subplot(133), plt.imshow(img_filtered, cmap='gray'),
plt.title('Filtered Image (D0=30)'), plt.axis('off')

plt.tight_layout()
plt.show()

3.2 高通滤波器(边缘增强)

1) 理想高通滤波器(IHPF)

H ( u , v ) = { 0 D ( u , v ) ≤ D 0 1 D ( u , v ) > D 0 H(u,v) = \begin{cases} 0 & D(u,v) \leq D_0 \\ 1 & D(u,v) > D_0 \end{cases} H(u,v)={01D(u,v)≤D0D(u,v)>D0

2) 高斯高通滤波器(GHPF)

H ( u , v ) = 1 − e − D 2 ( u , v ) / ( 2 D 0 2 ) H(u,v) = 1 - e^{-D^2(u,v)/(2D_0^2)} H(u,v)=1−e−D2(u,v)/(2D02)

python 复制代码
import numpy as np
import cv2
import matplotlib.pyplot as plt

# 读取测试图像
img = cv2.imread(r"D:\software\opencv\opencv\sources\samples\data\lena.jpg", 0)  # 读取灰度图
img = img.astype(np.float32) / 255  # 转换为浮点型并归一化


def gaussian_hpf(image, D0=15):
    """生成高斯高通滤波器
    Args:
        image: 输入图像(用于获取尺寸)
        D0: 截止频率(控制边缘增强强度)
    Returns:
        H: 滤波器矩阵
    """
    rows, cols = image.shape
    crow, ccol = rows // 2, cols // 2  # 频谱中心坐标

    H = np.ones((rows, cols))
    for u in range(rows):
        for v in range(cols):
            # 计算到频谱中心的距离
            D = np.sqrt((u - crow) ** 2 + (v - ccol) ** 2)
            # 高斯高通公式(1 - 高斯低通)
            H[u, v] = 1 - np.exp(-(D ** 2) / (2 * D0 ** 2))
    return H


# ------------------ 主流程 ------------------
# 1. 傅里叶变换
f = np.fft.fft2(img)  # 快速傅里叶变换
fshift = np.fft.fftshift(f)  # 频谱中心化

# 2. 生成滤波器
hpf_filter = gaussian_hpf(img, D0=15)

# 3. 频域滤波
filtered_shift = fshift * hpf_filter  # 逐点相乘

# 4. 逆变换
f_ishift = np.fft.ifftshift(filtered_shift)
img_filtered = np.fft.ifft2(f_ishift)  # 逆FFT
img_filtered = np.abs(img_filtered)  # 取模值

# 5. 频谱可视化
magnitude_spectrum = 20 * np.log(np.abs(fshift) + 1e-5)
filtered_spectrum = 20 * np.log(np.abs(filtered_shift) + 1e-5)

plt.figure(figsize=(15,6))

plt.subplot(141), plt.imshow(img, cmap='gray'),
plt.title('Original Image'), plt.axis('off')

plt.subplot(142), plt.imshow(magnitude_spectrum, cmap='gray'),
plt.title('Original Spectrum'), plt.axis('off')

plt.subplot(143), plt.imshow(filtered_spectrum, cmap='gray'),
plt.title('Filtered Spectrum'), plt.axis('off')

plt.subplot(144), plt.imshow(img_filtered, cmap='gray'),
plt.title('HPF Result (D0=15)'), plt.axis('off')

plt.tight_layout()
plt.show()

四、扩展应用与注意事项

4.1 混合滤波技术

  • 同态滤波:分离光照(低频)与反射分量(高频),用于增强暗区细节。
  • 带通滤波:保留特定频率范围,常用于纹理分析。

4.2 实践建议

  1. 参数调优 :截止频率 D 0 D_0 D0需根据图像内容动态调整。
  2. 计算优化 :OpenCV的cv2.dft()比Numpy实现更快,且支持原位计算。
  3. 可视化技巧 :频谱显示时需对数变换(20*np.log())以增强对比度。

五、小结

频率域滤波通过傅里叶变换将图像处理转化为频域操作,其核心在于选择合适的滤波器函数。高斯滤波器因无振铃效应成为首选,而理想滤波器在需要锐利截止时仍具价值。实际应用中需权衡计算效率与效果质量,结合空间域方法(如卷积优化)实现高效处理。

六、频率域滤波与空间域滤波的区别

频率域滤波和空间域滤波是数字图像处理中两种主要的滤波方法,它们在处理方式、数学基础和适用场景等方面有显著区别。

以下是两者的主要区别:


1. 处理方式

  • 空间域滤波 :直接在图像像素上进行操作。通过对图像中的每个像素及其邻域进行加权求和(如卷积操作)来实现滤波。
    • 例如:均值滤波、高斯滤波、中值滤波等。
  • 频率域滤波 :将图像转换到频率域(通过傅里叶变换),在频域中对图像的频率分量进行操作(如增强或抑制某些频率),然后再转换回空间域。
    • 例如:理想低通滤波、高斯高通滤波等。

2. 数学基础

  • 空间域滤波 :基于卷积运算,使用滤波器核(如高斯核、拉普拉斯核等)与图像进行卷积。
    • 公式: g ( x , y ) = ∑ i = − a a ∑ j = − b b h ( i , j ) ⋅ f ( x + i , y + j ) g(x,y) = \sum_{i=-a}^a \sum_{j=-b}^b h(i,j) \cdot f(x+i, y+j) g(x,y)=i=−a∑aj=−b∑bh(i,j)⋅f(x+i,y+j)
  • 频率域滤波 :基于傅里叶变换,将图像从空间域转换到频率域,通过滤波器函数对频谱进行调制,再通过逆傅里叶变换返回空间域。
    • 公式: G ( u , v ) = H ( u , v ) ⋅ F ( u , v ) G(u,v) = H(u,v) \cdot F(u,v) G(u,v)=H(u,v)⋅F(u,v),其中 H ( u , v ) H(u,v) H(u,v) 是滤波器函数。

3. 计算效率

  • 空间域滤波
    • 对于小尺寸滤波器核(如3x3、5x5),计算效率较高。
    • 对于大尺寸滤波器核,计算复杂度显著增加。
  • 频率域滤波
    • 对于大尺寸滤波器核或全局操作,计算效率更高,因为卷积在频域中变为逐点乘法。
    • 需要进行傅里叶变换和逆变换,对于小尺寸滤波器核,计算开销较大。

4. 适用场景

  • 空间域滤波
    • 适合局部操作,如边缘检测(Sobel、Canny)、去噪(中值滤波)、平滑(高斯滤波)等。
    • 适合实时处理,因为计算速度快。
  • 频率域滤波
    • 适合全局操作,如纹理分析、周期性噪声去除、图像增强等。
    • 适合处理复杂滤波器,如带通滤波、同态滤波等。

5. 实现效果

  • 空间域滤波
    • 直观且易于实现,效果直接体现在空间域中。
    • 对于某些滤波器(如理想低通滤波),可能产生振铃效应。
  • 频率域滤波
    • 可以精确控制频率分量,适合处理特定频率范围的问题。
    • 对于高斯滤波器等平滑过渡的滤波器,可以避免振铃效应。

6. 滤波器设计

  • 空间域滤波:滤波器核的设计直接反映在空间域中,通常基于目标效果(如平滑、锐化)设计。
  • 频率域滤波:滤波器函数的设计基于频率响应,通常通过频域特性(如截止频率)定义。

7. 示例对比

  • 空间域滤波
    • 均值滤波:通过对像素邻域取平均值来平滑图像。
    • 拉普拉斯滤波:通过二阶导数增强边缘。
  • 频率域滤波
    • 理想低通滤波:通过抑制高频分量来平滑图像。
    • 高斯高通滤波:通过增强高频分量来突出边缘。

小结

特性 空间域滤波 频率域滤波
操作对象 像素及其邻域 频率分量
数学基础 卷积运算 傅里叶变换
计算效率 小核高效,大核低效 大核高效,小核低效
适用场景 局部操作、实时处理 全局操作、复杂滤波
实现效果 直观,可能产生振铃效应 精确控制频率,避免振铃效应
滤波器设计 基于空间域特性 基于频率响应

频率域滤波和空间域滤波各有优势,实际应用中常根据具体需求选择合适的方法,或结合两者以达到更好的效果。

相关推荐
Qwertyuiop20163 小时前
搭建开源笔记平台:outline
笔记·开源
白夜易寒3 小时前
Docker学习之私有仓库(day10)
学习·docker·容器
淮北4943 小时前
ros调试工具foxglove使用指南三:在3d空间写写画画(Panel->3D ->Scene entity)
python·学习·3d·机器人
山河君5 小时前
音频进阶学习二十四——IIR滤波器设计方法
学习·算法·音视频·信号处理
Vic·Tory5 小时前
Go语言学习笔记
笔记·学习·golang
Small踢倒coffee_氕氘氚5 小时前
Python实现3D贴图渲染:解锁数字艺术新维度
经验分享·笔记
吴梓穆6 小时前
UE5学习笔记 FPS游戏制作28 显式玩家子弹数
笔记·学习·ue4
KevinRay_6 小时前
从零开始学习SQL
数据库·学习·mysql
虾球xz7 小时前
游戏引擎学习第195天
c++·学习·游戏引擎
上等猿7 小时前
Elasticsearch笔记
java·笔记·elasticsearch