opencv python 傅里叶变换的使用

  • Post category:Python

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()函数实现反傅里叶变换,以及使用傅里叶变换实现图像滤波和去噪。本文提供了两个示例,分别演示了如何使用傅里叶变换实现图像滤波和去噪。掌握这些技巧可以帮助我们更好地处理图像处理中的滤波、去噪、边缘检测等问题。