目录
前言
一、频域变换
1.傅里叶变换
2.代码实现
二、频域中图像处理
1.理解数字图片的频谱
2.频域图像处理步骤
3.使用低通滤波器实现图像平滑
4.使用高通滤波器实现图像锐化
三、总结
前言
数字图像处理的方法有两大类:一种是空间域处理法,另一种是频域处理法。把图像信号从空间域变化到频域,可以从另外一个角度来分析图像信号的特性。
一、频域变换
1.傅里叶变换
说到频域变化,就不得不提到傅里叶变化了,傅里叶变化是将时域信号转化到频域的一种方法,当然对应的傅里叶反变化就是将频域信号转化到时域的方法。关于傅里叶变化的原理就不在过多解释了,这里给大家推荐一个讲傅里叶变化的Bilibili视频
【知识拼图】傅里叶变换从零到一 03集 从爱因斯坦和梦露讲起。傅里叶变换还能这么用?美颜的底层原理是什么?_哔哩哔哩_bilibili
感谢Bilibili up主
@有趣的理工男
2.代码实现
OpenCv提供了离散傅里叶变换的方法以及频谱平移:
import cv2 import numpy as np from matplotlib import pyplot as plt # 读取图像 # 'pic.png'是图像文件的路径,0表示加载图像时使用灰度模式 image = cv2.imread('pic.png', 0) # 傅里叶变换 # cv2.dft()函数执行二维傅里叶变换,返回的是复数图像 # np.float32(image)将图像数据转换为浮点数,以便进行复杂的数学运算 # flags=cv2.DFT_COMPLEX_OUTPUT指定返回复数图像 dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT) # np.fft.fftshift()对变换后的复数图像进行中心偏移,以便后面创建低通滤波器 dft_shift = np.fft.fftshift(dft)
频谱平移之后得到就得到可以使用的频谱了
二、频域中图像处理
1.理解数字图片的频谱
数字图像平移后的频谱中,图像的能量将集中到频谱中心(低频成分),图像上的边缘,线条细节信息(高频成分)将分散在图像频谱的边缘。也就是说,频谱中低频成分代表了图像的概貌,高频成分代表了图像中的细节。
2.频域图像处理步骤
频域处理大概分以下步骤:
1.计算图像的DFT,得到F(u,v)
2.用滤波函数与H(u,v)与F(u,v)相乘,得到结果G(u,v)
3.计算IDFT
4.取IDFT的实部,即为处理后的图像
H(u,v)就是我们常说的滤波器,滤波器一般分为低通滤波器,高通滤波器,带通滤波器,带阻滤波器
3.使用低通滤波器实现图像平滑
顾名思义,低通滤波器允许低频通过而抑制高频。因此它可以去除图片中的噪音,实现图片平滑,当然也会引起图像模糊。这里低通的操作与上文提到的视频中的操作相同:
import cv2 import numpy as np from matplotlib import pyplot as plt # 读取图像 # 'pic.png'是图像文件的路径,0表示加载图像时使用灰度模式 image = cv2.imread('img.png', 0) # 傅里叶变换 # cv2.dft()函数执行二维傅里叶变换,返回的是复数图像 # np.float32(image)将图像数据转换为浮点数,以便进行复杂的数学运算 # flags=cv2.DFT_COMPLEX_OUTPUT指定返回复数图像 dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT) # np.fft.fftshift()对变换后的复数图像进行中心偏移,以便后面创建低通滤波器 dft_shift = np.fft.fftshift(dft) # 低通滤波器 # 获取图像的尺寸 rows, cols = image.shape # 计算图像中心的坐标 crow, ccol = rows // 2, cols // 2 # 创建一个与图像大小相同的掩码,初始值为0 mask = np.zeros((rows, cols, 2), np.uint8) # 设置低通滤波器的半径 r = 100 # 定义滤波器的中心坐标 center = [crow, ccol] # 创建一个坐标网格 x, y = np.ogrid[:rows, :cols] # 定义滤波器的区域,即圆形区域 mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r # 将滤波器区域的值设置为1,其余区域为0 mask[mask_area] = 1 # 应用低通滤波器 # 将掩码与复数图像相乘,实现低通滤波 f_shift = dft_shift * mask # 傅里叶反变换 # 将滤波后的图像进行中心偏移,以便进行反变换 f_ishift = np.fft.ifftshift(f_shift) # cv2.idft()函数执行二维傅里叶反变换 img_back = cv2.idft(f_ishift) # 对反变换后的复数图像的实部和虚部取平方根,得到幅度图像 img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1]) # 显示原始图像和处理后的图像 # 使用matplotlib库显示图像 plt.subplot(121), plt.imshow(image, cmap='gray') plt.title('Input Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(img_back, cmap='gray') plt.title('Low Pass Filtered Image'), plt.xticks([]), plt.yticks([]) plt.show()
4.使用高通滤波器实现图像锐化
import cv2 import numpy as np # 读取图像 image = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE) # 确保图像维度是2,如果是3通道图像,需要转换为灰度图像 if image.ndim == 3: image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 定义高通滤波器的参数 # 这里使用高斯滤波器作为高通滤波器,大小为(5,5),sigmaX为1.5 # 高斯滤波器的标准差sigmaX决定了滤波器的截止频率 # 值越大,截止频率越低,滤波效果越接近低通滤波器 kernel_size = (5, 5) sigmaX = 1.5 # 应用高通滤波器 filtered_image = cv2.GaussianBlur(image, kernel_size, sigmaX) # 显示原始图像和滤波后的图像 cv2.imshow('Original Image', image) cv2.imshow('Filtered Image', filtered_image) # 等待按键后退出 cv2.waitKey(0) cv2.destroyAllWindows()
三、总结
对信号的频域处理已经应用到了各个领域,傅里叶的大名想必也已经那些被傅里叶变化折磨过的大学生深深的记在了脑海中了。