OpenCV-Python傅里叶变换的使用
傅里叶变换是一种将信号从时域转换到频域的方法,可以用于图像处理中的滤波、去噪、边缘检测等。OpenCV-Python提供了cv.dft()
和cv2.idft()
函数来实现傅里叶变换和反变换。本文将详细讲解OpenCV-Python傅里变换的使用,并提供两个示例。
傅里叶变换
在OpenCV-Python中,我们可以使用cv2.dft()
函数来实现傅里叶变换。cv2.dft()
函数接受一个输入图像和一个标志参数,该参数指定傅里叶变换的类型。下面是一个使用cv2.dft()
函数实现傅里叶变换的示例代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('lena.jpg', 0)
# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将低频部分移动到中心
dft_shift = np.fft.fftshift(dft)
# 取幅值
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# 显示原图和傅里叶变换后的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
上面的代码读取了一张灰度图像lena.jpg
,然后使用cv2.dft()
函数实现了傅里叶变换,并使用np.fft.fftshift()
函数将低频部分移动到中心,最后使用cv2.magnitude()
函数取幅值。使用matplotlib
库将原图和傅里叶变换后的图像显示出来。
反傅里叶变换
在OpenCV-Python中,我们可以使用cv2.idft()
函数来实现反傅里叶变换。cv2.idft()
函数接受一个输入图像和一个标志参数,该参数指定傅里叶变换的类型。下面是一个使用cv2.idft()
函数实现反傅里叶变换的示例代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('lena.jpg', 0)
# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将低频部分移动到中心
dft_shift = np.fft.fftshift(dft)
# 取幅值
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# 反傅里叶变换
idft = cv2.idft(dft, flags=cv2.DFT_SCALE | cv2.DFT_COMPLEX_OUTPUT)
# 取幅值
idft_mag = cv2.magnitude(idft[:, :, 0], idft[:, :, 1])
# 显示原图和反傅里叶变换后的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(idft_mag, cmap='gray')
plt.title('IDFT Magnitude'), plt.xticks([]), plt.yticks([])
plt.show()
上面的代码读取了一张灰度图像lena.jpg
,然后使用cv2.dft()
函数实现了傅里叶变换,并使用np.fft.fftshift()
将低频部分移动到中心,最后使用cv2.magnitude()
函数取幅值。接着使用cv2.idft()
函数实现反傅里叶变换,并使用cv2.magnitude()
函数取幅值。使用matplotlib
库将原图和反傅里叶变换后的图像显示出来。
示例一:使用傅里叶变换实现图像滤波
下面是一个使用傅里叶变换实现图像滤波的示例代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('lena.jpg', 0)
# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将低频部分移动到中心
dft_shift = np.fft.fftshift(dft)
# 创建一个掩膜
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1
# 应用掩膜
fshift = dft_shift * mask
# 将低频部分移回原位
f_ishift = np.fft.ifftshift(fshift)
# 反傅里叶变换
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
# 显示原图和滤波后的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()
上面的代码读取了一张灰度图像lena.jpg
,然后使用cv2.dft()
函数实现了傅里叶变换,并使用np.fft.fftshift()
函数将低频部分移动到中心。接着创建了一个掩膜,应用掩膜,将低频部分移回原位,最后使用cv2.idft()
函数实现反傅里叶变换。使用matplotlib
库将原图和滤波后的图像显示出来。
示例二:使用傅里叶变换实现图像去噪
下面是一个使用傅里叶变换实现图像去噪的示例代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('lena.jpg', 0)
# 添加高斯噪声
mean = 0
var = 100
sigma = var ** 0.5
gaussian = np.random.normal(mean, sigma, img.shape)
noisy_img = img + gaussian
# 傅里叶变换
dft = cv2.dft(np.float32(noisy_img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将低频部分移动到中心
dft_shift = np.fft.fftshift(dft)
# 创建一个掩膜
rows, cols = noisy_img.shape
crow, ccol = rows // 2, cols // 2
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1
# 应用掩膜
fshift = dft_shift * mask
# 将低频部分移回原位
f_ishift = np.fft.ifftshift(fshift)
# 反傅里叶变换
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
# 显示原图和去噪后的图像
plt.subplot(121), plt.imshow(noisy_img, cmap='gray')
plt.title('Noisy Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()
上面的代码读取了一张灰度图像lena.jpg
,然后添加了高斯噪声。接着使用cv2.dft()
函数实现了傅里叶变换,并使用np.fft.fftshift()
函数将低频部分移动到中心。接着创建了一个掩膜,应用掩膜,将低频部分移回原位,最后使用cv2.idft()
函数实现反傅里叶变换。使用matplotlib
库将原图和去噪后的图像显示出来。
总结
本文详细讲解了OpenCV-Python傅里叶变换的使用,包括使用cv2.dft()
函数实现傅里叶变换,使用cv2.idft()
函数实现反傅里叶变换,以及使用傅里叶变换实现图像滤波和去噪。本文提供了两个示例,分别演示了如何使用傅里叶变换实现图像滤波和去噪。掌握这些技巧可以帮助我们更好地处理图像处理中的滤波、去噪、边缘检测等问题。