跟我学Python图像处理丨带你掌握傅里叶变换原理及实现

本文深入探讨图像傅里叶变换原理,通过Numpy和OpenCV实现傅里叶变换与逆变换。傅里叶变换将图像从时域转换到频域,有助于图像的除噪和增强。文章包含理论解释、公式展示及代码实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用——傅里叶变换和霍夫变换。其中,傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理。

图像傅里叶变换原理

傅里叶变换(Fourier Transform,简称FT)常用于数字信号处理,它的目的是将时间域上的信号转变为频率域上的信号。随着域的不同,对同一个事物的了解角度也随之改变,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理。同时,可以从频域里发现一些原先不易察觉的特征。傅里叶定理指出“任何连续周期信号都可以表示成(或者无限逼近)一系列正弦信号的叠加。”

下面引用李老师“Python+OpenCV图像处理”中的一个案例,非常推荐同学们去学习。如下图所示,他将某饮料的制作过程的时域角度转换为频域角度。

绘制对应的时间图和频率图如下所示:

傅里叶公式如下,其中w表示频率,t表示时间,为复变函数。它将时间域的函数表示为频率域的函数f(t)的积分。

傅里叶变换认为一个周期函数(信号)包含多个频率分量,任意函数(信号)f(t)可通过多个周期函数(或基函数)相加合成。从物理角度理解,傅里叶变换是以一组特殊的函数(三角函数)为正交基,对原函数进行线性变换,物理意义便是原函数在各组基函数的投影。如下图所示,它是由三条正弦曲线组合成。

傅里叶变换可以应用于图像处理中,经过对图像进行变换得到其频谱图。从谱频图里频率高低来表征图像中灰度变化剧烈程度。图像中的边缘信号和噪声信号往往是高频信号,而图像变化频繁的图像轮廓及背景等信号往往是低频信号。这时可以有针对性的对图像进行相关操作,例如图像除噪、图像增强和锐化等。

二维图像的傅里叶变换可以用以下数学公式(15-3)表达,其中f是空间域(Spatial Domain))值,F是频域(Frequency Domain)值

### Python 实现傅里叶变换图像压缩 #### 使用 NumPy 和 OpenCV 进行图像压缩 为了实现基于傅里叶变换图像压缩,可以利用快速傅里叶变换 (FFT) 将空间域中的图像转换到频率域,在此过程中保留低频分量并丢弃高频分量来达到压缩效果。以下是具体的操作方法: ```python import cv2 import numpy as np from matplotlib import pyplot as plt def fourier_transform_compression(image_path, compression_ratio=0.5): # 读取灰度图 img = cv2.imread(image_path, 0) # 执行二维离散傅里叶变换 f = np.fft.fft2(img) # 将零频率分量移动到中心位置 fshift = np.fft.fftshift(f) # 计算幅度谱用于可视化 magnitude_spectrum = 20 * np.log(np.abs(fshift)) # 创建掩码以应用高斯模糊或直接截断高频部分 rows, cols = img.shape crow, ccol = int(rows / 2), int(cols / 2) # 定义要保存的比例范围内的像素数量 mask_radius_row = int(rows * compression_ratio / 2) mask_radius_col = int(cols * compression_ratio / 2) # 构建遮罩矩阵 mask = np.zeros((rows, cols), np.uint8) mask[crow-mask_radius_row:crow+mask_radius_row, ccol-mask_radius_col:ccol+mask_radius_col] = 1 # 应用遮罩选取低频区域 fshift_masked = fshift * mask # 反向移位 f_ishift = np.fft.ifftshift(fshift_masked) # 执行逆傅里叶变换回到空间域 img_back = np.fft.ifft2(f_ishift) img_back = np.real(img_back) return img_back, magnitude_spectrum image_path = 'path_to_your_image.jpg' compressed_img, spectrum = fourier_transform_compression(image_path=image_path, compression_ratio=0.3) plt.figure(figsize=(12, 6)) # 显示原始图片 plt.subplot(131), plt.imshow(cv2.imread(image_path, 0), cmap='gray') plt.title('Original Image'), plt.xticks([]), plt.yticks([]) # 显示频谱图 plt.subplot(132), plt.imshow(spectrum, cmap='gray') plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) # 显示压缩后的图片 plt.subplot(133), plt.imshow(compressed_img, cmap='gray') plt.title('Compressed Image'), plt.xticks([]), plt.yticks([]) plt.show() ``` 上述代码展示了如何使用 `NumPy` 的 FFT 函数来进行图像傅里叶变换,并通过设置不同的 `compression_ratio` 参数控制压缩程度[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值