【计算机视觉】超简单!傅里叶变换的经典案例

ops/2024/12/24 0:37:06/

Hey小伙伴们!今天来给大家分享一个 计算机视觉 中非常经典且重要的技术——傅里叶变换(Fourier Transform, FT)。傅里叶变换在图像处理、信号分析等领域有着广泛的应用,它可以帮助我们从频域的角度理解图像的特性,进行滤波、去噪、边缘检测等操作。

如果你对计算机视觉感兴趣,或者想学习如何用 Python 实现傅里叶变换,那这篇笔记一定要收藏哦!🚀


👉 什么是傅里叶变换?

傅里叶变换是一种将时域或空域中的信号转换为频域表示的数学工具。在图像处理中,傅里叶变换可以将一幅图像从空间域(即像素值)转换为频率域(即不同频率分量的幅度和相位)。通过这种方式,我们可以更方便地分析图像中的低频和高频信息,并对其进行处理。

  • 低频分量:代表图像中的平滑区域或整体结构,通常对应于图像的背景或大尺度变化。
  • 高频分量:代表图像中的细节或边缘信息,通常对应于图像中的纹理、噪声或小尺度变化。

👉 傅里叶变换的应用场景
  1. 图像滤波:通过去除或增强特定频率分量,可以实现图像的低通滤波(去噪)、高通滤波(边缘检测)等效果。
  2. 图像压缩:JPEG 等图像压缩算法利用了傅里叶变换的思想,通过对图像的频域表示进行量化和编码,减少存储空间。
  3. 图像去噪:傅里叶变换可以帮助我们识别并去除图像中的噪声,尤其是周期性噪声。
  4. 图像配准与重建:在医学图像处理中,傅里叶变换常用于图像配准、重建等任务。

👉 案例场景:图像去噪与边缘检测

我们来实现一个经典的案例:使用傅里叶变换对图像进行去噪和边缘检测。我们将使用 Python 的 numpyopencv 库来处理图像,并展示如何通过傅里叶变换实现这些操作。


👉 代码实现
1. 安装依赖库

首先,确保你已经安装了以下依赖库:

pip install numpy opencv-python matplotlib
2. 加载并预处理图像

我们将使用一张带有噪声的图像作为示例。你可以从网上下载一张图片,或者使用 OpenCV 自带的测试图像。

import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像(灰度图像)
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)# 显示原始图像
plt.figure(figsize=(8, 6))
plt.imshow(image, cmap='gray')
plt.title('原始图像')
plt.axis('off')
plt.show()
3. 执行傅里叶变换

使用 np.fft.fft2 函数对图像进行二维傅里叶变换,将图像从空间域转换为频率域。

# 执行傅里叶变换
f_transform = np.fft.fft2(image)# 将频率分量移动到图像中心(shift)
f_transform_shifted = np.fft.fftshift(f_transform)# 计算频谱图(取对数,便于显示)
magnitude_spectrum = 20 * np.log(np.abs(f_transform_shifted))# 显示频谱图
plt.figure(figsize=(8, 6))
plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('频谱图')
plt.axis('off')
plt.show()
4. 创建低通滤波器

为了去除图像中的高频噪声,我们可以创建一个低通滤波器,只保留低频分量。

# 创建低通滤波器(圆形掩膜)
rows, cols = image.shape
crow, ccol = rows // 2, cols // 2  # 中心点
mask = np.zeros((rows, cols), np.uint8)
r = 50  # 滤波器半径
cv2.circle(mask, (ccol, crow), r, 1, -1)# 显示低通滤波器
plt.figure(figsize=(8, 6))
plt.imshow(mask, cmap='gray')
plt.title('低通滤波器')
plt.axis('off')
plt.show()# 应用低通滤波器
f_transform_filtered = f_transform_shifted * mask# 计算滤波后的频谱图
magnitude_spectrum_filtered = 20 * np.log(np.abs(f_transform_filtered) + 1e-6)# 显示滤波后的频谱图
plt.figure(figsize=(8, 6))
plt.imshow(magnitude_spectrum_filtered, cmap='gray')
plt.title('滤波后的频谱图')
plt.axis('off')
plt.show()
5. 执行逆傅里叶变换

使用 np.fft.ifft2 函数将滤波后的频率域图像转换回空间域,得到去噪后的图像。

# 执行逆傅里叶变换
f_ishift = np.fft.ifftshift(f_transform_filtered)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)# 显示去噪后的图像
plt.figure(figsize=(8, 6))
plt.imshow(img_back, cmap='gray')
plt.title('去噪后的图像')
plt.axis('off')
plt.show()
6. 边缘检测

除了去噪,我们还可以利用傅里叶变换进行边缘检测。通过创建高通滤波器,只保留图像中的高频分量,从而突出边缘信息。

# 创建高通滤波器(反向圆形掩膜)
mask_highpass = 1 - mask# 应用高通滤波器
f_transform_highpass = f_transform_shifted * mask_highpass# 执行逆傅里叶变换
f_ishift_highpass = np.fft.ifftshift(f_transform_highpass)
img_edge = np.fft.ifft2(f_ishift_highpass)
img_edge = np.abs(img_edge)# 显示边缘检测结果
plt.figure(figsize=(8, 6))
plt.imshow(img_edge, cmap='gray')
plt.title('边缘检测结果')
plt.axis('off')
plt.show()

👉 关键点解析
  1. 傅里叶变换:通过 np.fft.fft2 对图像进行二维傅里叶变换,将图像从空间域转换为频率域。np.fft.fftshift 用于将频率分量移动到图像中心,便于观察和处理。

  2. 频谱图:频谱图展示了图像中不同频率分量的分布情况。低频分量集中在图像中心,高频分量分布在图像边缘。通过观察频谱图,我们可以了解图像的频率特性。

  3. 低通滤波器:低通滤波器只保留低频分量,去除高频噪声。我们可以通过创建一个圆形掩膜来实现低通滤波器,并将其应用于傅里叶变换后的频率域图像。

  4. 逆傅里叶变换:通过 np.fft.ifft2 将滤波后的频率域图像转换回空间域,得到去噪后的图像。逆傅里叶变换的结果是一个复数矩阵,我们需要取其绝对值来获得最终的图像。

  5. 高通滤波器:高通滤波器只保留高频分量,突出图像中的边缘信息。我们可以通过创建一个反向圆形掩膜来实现高通滤波器,并将其应用于傅里叶变换后的频率域图像。


👉 更多扩展
  1. 自适应滤波器:除了固定的圆形滤波器,你还可以尝试实现自适应滤波器,根据图像的不同区域动态调整滤波器的参数,以获得更好的去噪效果。

  2. 多尺度分析:结合小波变换(Wavelet Transform),可以在多个尺度上分析图像的频率特性,进一步提升图像处理的效果。

  3. 图像配准:在医学图像处理中,傅里叶变换常用于图像配准。通过比较两幅图像的频谱图,可以找到它们之间的旋转、缩放和平移关系,从而实现图像的精确对齐。

  4. 图像重建:在一些应用中,傅里叶变换还可以用于图像重建。例如,在 CT 图像重建中,傅里叶变换可以帮助我们从投影数据中恢复出完整的三维图像。


👉 总结与应用

通过这个简单的图像去噪与边缘检测案例,我们可以看到傅里叶变换在计算机视觉中的强大功能。它不仅可以帮助我们从频域的角度理解图像的特性,还能通过滤波等操作实现图像的去噪、边缘检测等效果。

傅里叶变换是图像处理中非常重要的一项技术,广泛应用于图像滤波、去噪、压缩、配准等领域。希望这篇笔记能帮助大家更好地理解和应用傅里叶变换!


运行效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

👉 更多资源
  • NumPy 官方文档
  • OpenCV 官方文档
  • Matplotlib 官方文档

🌟 结语

今天的分享就到这里啦!希望这篇笔记能帮助大家更好地理解和应用傅里叶变换。如果你觉得有用,别忘了点赞、收藏哦!如果有任何问题或想法,欢迎在评论区留言交流,希望我的朋友请点赞,收藏并关注我,我们一起学习进步!💖


http://www.ppmy.cn/ops/144429.html

相关文章

遗传算法特征筛选和GA-BP

遗传算法特征筛选与 GA-BP(遗传算法优化BP神经网络) 遗传算法(GA)是一种模拟自然选择和遗传学的优化算法,它通过选择、交叉、变异等操作对解空间进行搜索,广泛应用于特征选择、优化问题等。结合遗传算法进…

Javaweb 在线考试系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

探索:为什么数组数据后端确要求前端传递,拼接的字符呢

你们好,我是金金金。 前言 撰写本文是因为好奇,好奇为什么,拼接的字符串数据过去能直接变成数组,好奇为什么让传,拼接的字符串而不是直接传递数组数据,好奇… 探索 首先看get请求,get请求参数一般都是携带在路径后面的…

科技查新报告需要多长时间能完成?

科技查新报告的完成时间通常取决于查新项目的复杂程度和查新机构的工作效率。具体来说,一般需要3到8个工作日左右,但也可能根据具体情况有所调整。以下是对科技查新报告完成时间的详细介绍: 基本工作周期 例如河南查新信息技术研究院 国内…

霍尔传感器在VR虚拟现实技术上的应用

在当今科技飞速发展的时代,虚拟现实(VR)技术正以前所未有的速度不断革新与拓展应用领域。 从沉浸式的游戏体验到专业的模拟训练,从虚拟的艺术创作空间到远程协作的工作场景,VR 已逐渐渗透到人们生活与工作的多个层面&…

如何使用 Python 连接 MySQL 数据库?

在Python开发中,连接MySQL数据库是一个常见的需求。 我们可以使用多种库来实现这一功能,其中最常用的是mysql-connector-python和PyMySQL。 下面我将详细介绍如何使用这两个库来连接MySQL数据库,并提供一些实际开发中的建议和注意事项。 1…

前端面试题整理-前端异步编程

1. 进程、线程、协程的区别 在并发编程领域,进程、线程和协程是三个核心概念,它们在资源管理、调度和执行上有着本质的不同。 首先,进程是操作系统进行资源分配和调度的独立单位(资源分配基本单位),每个进…

深入理解 Linux wc 命令

文章目录 深入理解 Linux wc 命令1. 基本功能2. 常用选项3. 示例3.1 统计文件的行、单词和字符数3.2 仅统计行数3.3 统计多个文件的总和3.4 使用管道统计命令输出的行数 4. 实用案例4.1 日志分析4.2 快速统计代码行数4.3 统计单词频率 5. 注意事项6. 总结 深入理解 Linux wc 命…