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

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

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

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. 示例对比

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

小结

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

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

相关推荐
用户9313560027429 分钟前
文件包含漏洞
笔记
KFCcrazy430 分钟前
嵌入式学习日记(39)51单片机
嵌入式硬件·学习·51单片机
MuMuMu#42 分钟前
JAVA NIO学习笔记基础强化学习总结
java·学习·nio
lingggggaaaa1 小时前
小迪安全v2023学习笔记(七十九讲)—— 中间件安全&IIS&Apache&Tomcat&Nginx&CVE
笔记·学习·安全·web安全·网络安全·中间件·apache
我登哥MVP1 小时前
Java File 类学习笔记
java·笔记·学习
mysla2 小时前
嵌入式学习day44-硬件—ARM体系架构
学习
微露清风2 小时前
系统性学习数据结构-第三讲-栈和队列
java·数据结构·学习
77qqqiqi4 小时前
学习字符串
学习
滴滴滴嘟嘟嘟.4 小时前
Qt动画功能学习
开发语言·qt·学习
淮北4944 小时前
计算机网络学习(七、网络安全)
学习·计算机网络·web安全