目录
一、什么是傅里叶变换
二、代码编写:傅里叶变换与逆傅里叶变换
【一、OpenCV实现傅里叶变换】
【二、OpenCV实现逆傅里叶变换】
【三、Numpy实现傅里叶变换】
【四、Numpy实现逆傅里叶变换】
三、应用实践:低通滤波与高通滤波
一、低通滤波
二、高通滤波
频率越大,变化越剧烈,频率越小,信号越平缓,对应到图像中,高频信号往往是图像中的边缘信号和噪声信号,而低频信号包含图像变化频繁的图像轮廓及背景等信号。 因此,我们可以做相应的锐化和模糊的处理:提出其中的高频分量做傅里叶逆变换得到的就是锐化的结果(高通滤波器)。 提出其中的低频分量做傅里叶逆变换得到的就是模糊的结果(低通滤波器)。 |
【Numpy与OpenCV均可实现傅里叶变换与逆傅里叶变换】
OpenCV API: | |
dst = cv2.dft (src , flags) | |
参数:
|
其他函数:
【代码编写】
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 以灰度形式读入
img = cv2.imread('img\qiqiqi.png', 0)
# 使用cv2.dft()进行傅里叶变换
dst = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将变换后图像的低频部分转移到图像的中心
dst_center = np.fft.fftshift(dst)
# 使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
result = 20 * np.log(np.abs(cv2.magnitude(dst_center[:, :, 0], dst_center[:, :, 1])))
# 显示图像
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.subplot(122)
plt.axis("off")
plt.imshow(result, cmap="gray")
plt.show()
OpenCV API | |
dst= cv2.idft(src) | |
参数:
|
其他函数:
(同 【一、OpenCV实现傅里叶变换】)
【代码编写】
# %%opencv实现逆傅里叶变换
# 以灰度形式读入
img = cv2.imread('img\qiqiqi.png', 0)
# 使用cv2.dft()进行傅里叶变换
dst = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将变换后图像的低频部分转移到图像的中心
dst_center = np.fft.fftshift(dst)
#
# 中间可以定义相应的掩膜去留高频或者低频部分
#
# 使用np.fft.ifftshift将低频移动到原来的位置
dst_origin = np.fft.ifftshift(dst_center)
# 使用cv2.idft进行傅里叶的逆变化
img_idft = cv2.idft(dst_origin)
# 使用cv2.magnitude转化为空间域内
img_idft = cv2.magnitude(img_idft[:, :, 0], img_idft[:, :, 1])
# 显示图像
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title('原图')
plt.subplot(122)
plt.axis("off")
plt.imshow(img_idft, cmap=plt.cm.gray)
plt.title('逆傅里叶变换')
plt.show()
Numpy | |
np.fft.fft2(img) | |
参数:
|
其他函数:
(可参照 【一、OpenCV实现傅里叶变换】)
【代码编写】
# %%NumPy实现傅里叶变换
img = cv2.imread('img//qiqiqi.png', 0)
# 使用Numpy进行傅里叶变换
f = np.fft.fft2(img)
# 无处理(未把零频率分量移到中间)
mid_result = 20 * np.log(np.abs(f))
# 把零频率分量移到中间
fshift = np.fft.fftshift(f)
result = 20 * np.log(np.abs(fshift))
# 显示图像
plt.subplot(131)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title('原图')
plt.subplot(132)
plt.axis("off")
plt.imshow(mid_result, cmap=plt.cm.gray)
plt.title('Numpy傅里叶变换\n(未把零频率分量移到中心)')
plt.subplot(133)
plt.axis("off")
plt.imshow(result, cmap=plt.cm.gray)
plt.title('Numpy傅里叶变换\n(把零频率分量移到中心)')
plt.tight_layout()
plt.show()
Numpy | |
np.fft.ifft2(img) | |
参数:
|
【代码编写】
# %%Numpy实现逆傅里叶变换
img = cv2.imread('img//qiqiqi.png', 0)
# 进行傅里叶变换
f = np.fft.fft2(img)
# 逆傅里叶变换
f_center = np.fft.ifftshift(f)
f_origin = np.fft.ifft2(f_center)
# 设置区间
f_origin = np.abs(f_origin)
# 显示图像
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis("off")
plt.title('原图')
plt.subplot(122)
plt.axis("off")
plt.imshow(f_origin, cmap=plt.cm.gray)
plt.title('Numpy逆傅里叶变换')
plt.show()
——模糊图像(使用OpenCV)
【代码编写】
# %%OpenCV低通滤波
img = cv2.imread('img//qiqiqi.png', 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_center = np.fft.fftshift(dft)
# 定义掩模:生成的掩模中间为1周围为0
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1
# 将掩模与傅里叶变化后图像相乘,保留中间部分
mask_img = dft_center * mask
img_idf = np.fft.ifftshift(mask_img)
img_idf = cv2.idft(img_idf)
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])
plt.subplot(121)
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(img_idf, cmap='gray')
plt.show()
——锐化图像(使用OpenCV)
【代码编写】
将低通滤波的定义的掩膜由 中间0周围1 改为 中间1周围0 即可
# 定义掩模:生成的掩模中间为0周围为1
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0