8.0傅里叶变化
实现结果:
检测
源码:
import cv2 import numpy as np from matplotlib import pyplot as plt import math #基本的傅里叶变换 def burBase(): # 第一步读取图像 img=cv2.imread("./image/lena.jpg",0) #1.数据变为float32的类型 img_float=np.float32(img) # 第三步: 使用 cv2.dft 进行傅里叶变换 dft=cv2.dft(img_float,flags=cv2.DFT_COMPLEX_OUTPUT) # 第四步:使用 np.fft.shiftfft()将变换后的图像的低频转移到中心位置 dft_shift=np.fft.fftshift(dft) # 第五步:使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大 mag_ape = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) #6.显示,1行2列,第一张121. plt.subplot(121),plt.imshow(img,cmap='gray') plt.subplot(122), plt.imshow(mag_ape, cmap='gray') plt.show() #使用傅里叶变换实现低通滤波 def fourier_idft(): # 第一步读取图像 img = cv2.imread("./image/lena.jpg", 0) # 1.数据变为float32的类型 img_float = np.float32(img) # 第三步: 使用 cv2.dft 进行傅里叶变换 dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT) # 第四步:使用 np.fft.shiftfft()将变换后的图像的低频转移到中心位置 dft_shift = np.fft.fftshift(dft) # 第五步:使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大 mag_ape = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) #6.构建mask row,col=int(img.shape[0]/2),int(img.shape[1]/2) mask=np.zeros((img.shape[0],img.shape[1],2),np.uint8) mask[row-30:row+30,col-30:col+30]=1 # 7.掩模和傅里叶结果乘法运算 mask_img = dft_shift* mask # 8.反向复位 mask_ape = 20 * np.log(cv2.magnitude(mask_img[:, :, 0], mask_img[:, :, 1])) # 使用 np.fft.iffshift 将低频移动到原来的位置 img_idf = np.fft.ifftshift(mask_img) # 使用 cv2.idft 进行傅里叶的反变换 img_idf = cv2.idft(img_idf) # 使用 cv2.magnitude 转换为空间域内 img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1]) # 显示图像 plt.subplot(221),plt.imshow(mag_ape, cmap='gray') plt.subplot(222), plt.imshow(mask_ape, cmap='gray') plt.subplot(223),plt.imshow(img, cmap='gray') plt.subplot(224),plt.imshow(img_idf, cmap='gray') plt.show() #使用傅里叶变换实现高通滤波 def fourier_hdft(): # 读取图像 img = cv2.imread("./image/lena.jpg", 0) # 进行 float32 形式转换 img_float = np.float32(img) # 使用 cv2.dft 进行傅里叶变换 dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT) # 使用 np.fft.shiftfft()将变换后的图像的低频转移到中心位置 dft_center = np.fft.fftshift(dft) # 使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大,用于显示 mag_ape = 20 * np.log(cv2.magnitude(dft_center[:, :, 0], dft_center[:, :, 1])) # 定义掩模,生成掩模中间为 1 周围为 0 row, col = int(img.shape[0] / 2), int(img.shape[1] / 2) mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8) mask[row - 10:row + 10, col - 10:col + 10] = 0 # 掩模和傅里叶结果乘法运算 mask_img = dft_center * mask # 掩模后的结果使用 cv2.magnitude 将实部和虚部转换为实部,乘以 20 是为了使得结果更大,用于显示 mask_ape = 20 * np.log(cv2.magnitude(mask_img[:, :, 0], mask_img[:, :, 1])) # 使用 np.fft.iffshift 将低频移动到原来的位置 img_idf = np.fft.ifftshift(mask_img) # 使用 cv2.idft 进行傅里叶的反变换 img_idf = cv2.idft(img_idf) # 使用 cv2.magnitude 转换为空间域内 img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1]) # 显示图像 plt.subplot(221),plt.imshow(mag_ape, cmap='gray') plt.subplot(222),plt.imshow(mask_ape, cmap='gray') plt.subplot(223),plt.imshow(img, cmap='gray') plt.subplot(224),plt.imshow(img_idf, cmap='gray') plt.show() if __name__ == '__main__': # burBase() # fourier_idft() fourier_hdft()
解析:
-
导入模块:
import cv2
:导入opencv
库,用于图像处理操作。import numpy as np
:导入numpy
库并使用np
作为别名,用于处理数组数据。from matplotlib import pyplot as plt
:导入matplotlib
的pyplot
模块,用于图像显示。import math
:导入math
库,用于数学计算。
-
函数定义:
-
burBase()
:- 功能:对图像进行基本的傅里叶变换并显示结果。
- 实现:
- 读取图像
./image/lena.jpg
并转换为灰度图像。 - 将图像数据类型转换为
np.float32
。 - 使用
cv2.dft
进行傅里叶变换。 - 使用
np.fft.fftshift
将低频部分移到中心。 - 使用
cv2.magnitude
将傅里叶变换结果的实部和虚部转换为幅值,并乘以 20 进行放大。 - 使用
plt.subplot
和plt.imshow
显示原始图像和变换后的幅值图像。
- 读取图像
-
fourier_idft()
:- 功能:使用傅里叶变换实现低通滤波。
- 实现:
- 读取图像
./image/lena.jpg
并转换为灰度图像。 - 将图像数据类型转换为
np.float32
。 - 使用
cv2.dft
进行傅里叶变换。 - 使用
np.fft.fftshift
将低频部分移到中心。 - 使用
cv2.magnitude
将傅里叶变换结果的实部和虚部转换为幅值,并乘以 20 进行放大。 - 构建低通滤波的掩模,中心为 1,其余为 0。
- 将掩模与傅里叶变换结果相乘。
- 使用
np.fft.ifftshift
将低频部分移回原位。 - 使用
cv2.idft
进行反傅里叶变换。 - 使用
cv2.magnitude
将反变换结果的实部和虚部转换为幅值。 - 使用
plt.subplot
和plt.imshow
显示傅里叶变换幅值图像、掩模后的幅值图像、原始图像和滤波后的图像。
- 读取图像
-
fourier_hdft()
:- 功能:使用傅里叶变换实现高通滤波。
- 实现:
- 读取图像
./image/lena.jpg
并转换为灰度图像。 - 将图像数据类型转换为
np.float32
。 - 使用
cv2.dft
进行傅里叶变换。 - 使用
np.fft.fftshift
将低频部分移到中心。 - 使用
cv2.magnitude
将傅里叶变换结果的实部和虚部转换为幅值,并乘以 20 进行放大。 - 构建高通滤波的掩模,中心为 0,其余为 1。
- 将掩模与傅里叶变换结果相乘。
- 使用
np.fft.ifftshift
将低频部分移回原位。 - 使用
cv2.idft
进行反傅里叶变换。 - 使用
cv2.magnitude
将反变换结果的实部和虚部转换为幅值。 - 使用
plt.subplot
和plt.imshow
显示傅里叶变换幅值图像、掩模后的幅值图像、原始图像和滤波后的图像。
- 读取图像
-
-
主程序部分:
-
if __name__ == '__main__':
:- 功能:确保代码作为脚本运行时执行相应的函数。
- 调用
fourier_hdft()
函数。
-