欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Python OpenCV中的傅里叶变换(第13部分)

最编程 2024-08-14 14:19:31
...


python-opencv(13)傅里叶变换

文章目录

  • 1. 傅里叶变换的理论基础
  • 2. numpy实现傅里叶变换
  • 2.1. 相关的函数
  • 2.1 代码实现
  • 3. numpy实现逆傅里叶变换
  • 3.1 相关的函数
  • 3.2 代码实现
  • 4. 在频域进行高通滤波
  • 4.1 对高频、低频和滤波的理解
  • 4.2 频域滤波
  • 4.3 高通滤波代码实现
  • 4.4 低通滤波代码实现
  • 5. OpenCV实现傅里叶变换
  • 5.1 OpenCV实现傅里叶变换函数
  • 5.2 代码实现
  • 6. OpenCV实现傅里叶逆变换
  • 6.1 OpenCV实现傅里叶逆变换函数
  • 6.2 代码实现

1. 傅里叶变换的理论基础

离散的傅里叶变换建立的函数从空间域之间的转换关系,把空间域难以显示的特征在频率域中十分清楚的显示出来。在数字图像处理中,经常需要这种转换关系和转换规律。具体请看数字图像处理一书。
注意:

  • 傅里叶得到高频和低频的信息,针对低频,高频处理能够实现不同的目的。
  • 傅里叶过程是可逆的,图像经过傅里叶变换,逆傅里叶变换后,能够恢复到原始的图像。
  • 在频率对图像进行处理,在频域的处理会反映在逆变换图像上。

2. numpy实现傅里叶变换

2.1. 相关的函数

函数:numpy.fft.fft2

  • 实现傅里叶变换
  • 返回的是一个复数数组

函数:numpy.fft.fftshift 将零频率分量移动到频谱中心,有下图所示。

python-opencv(13)傅里叶变换_opencv


函数:20*np.log(np.abs(fshift))

经傅里叶变换的计算结果映射到[0,255]这个区间内。

2.1 代码实现

#%%傅里叶变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\lena.bmp',cv2.IMREAD_GRAYSCALE)
#进行傅里叶变换
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))
fig,ax = plt.subplots(1,3,figsize=(10,3))
ax1 = plt.subplot(131)
ax1.imshow(img,cmap="gray")
ax1.axis("off")
ax2 = plt.subplot(132)
ax2.axis("off")
ax2.imshow(mid_result,cmap="gray")
ax3 = plt.subplot(133)
ax3.axis("off")
ax3.imshow(result,cmap="gray")
plt.show()

结果

python-opencv(13)傅里叶变换_opencv_02

3. numpy实现逆傅里叶变换

3.1 相关的函数

函数:numpy.fft.ifft2

  • 实现一个逆变换
  • 返回的是一个复数数组
    函数:numpy.fft.ifftshift fftshift函数的逆函数。如下图所示:
  • python-opencv(13)傅里叶变换_代码实现_03

  • 函数:iimg = np.abs 将逆傅里叶变换结果设置到[0,255]

3.2 代码实现

#%%傅里叶逆变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boat.bmp',cv2.IMREAD_GRAYSCALE)
#进行傅里叶变换
f = np.fft.fft2(img)
ishift = np.fft.ifftshift(f)
#逆变换
iimg = np.fft.ifft2(ishift)
#设置区间
iimg = np.abs(iimg)
fig,ax = plt.subplots(1,2,figsize=(7,3))
ax1 = plt.subplot(121)
ax1.imshow(img,cmap="gray")
ax1.axis("off")
ax2 = plt.subplot(122)
ax2.axis("off")
ax2.imshow(iimg,cmap="gray")
plt.show()

结果

python-opencv(13)傅里叶变换_opencv_04

4. 在频域进行高通滤波

4.1 对高频、低频和滤波的理解

  • 低频对应图像内变化缓慢的灰度分量。例如,在一幅大草原的图像中,低频对应着广袤的颜色趋于一致的草原。
  • 高频对应图像内变化越来越快的灰度分量,是由灰度的尖锐过渡造成的。例如,在一幅大草原的图像中,其中狮子的边缘等信息。
  • 滤波就是接受(通过)或者拒绝一定频率的分量。通过低频的滤波器称为低通滤波器;通过高频的滤波器称为高通滤波器。

4.2 频域滤波

修改傅里叶变换以达到特殊目的,然后计算IDFT返回到图像域。
特殊目的:图像增强、图像去噪、边缘检测、特征提取、压缩、加密等。

  • 衰减高频而通过低频,低通滤波器,将模糊一幅图像。
  • 衰减低频而通过高频,高通滤波器,将增强尖锐的细节,但是会导致图像
    的对比度降低。

4.3 高通滤波代码实现

#%%傅里叶逆变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boat.bmp',cv2.IMREAD_GRAYSCALE)
r,c = img.shape
r,c = int(r/2),int(c/2)
#进行傅里叶变换
f = np.fft.fft2(img)
ishift = np.fft.ifftshift(f)
ishift[r-30:r+30,c-30:c+30] = 0
#逆变换
iimg = np.fft.ifft2(ishift)
#设置区间
iimg = np.abs(iimg)
fig,ax = plt.subplots(1,2,figsize=(7,3))
ax1 = plt.subplot(121)
ax1.imshow(img,cmap="gray")
ax1.axis("off")
ax2 = plt.subplot(122)
ax2.axis("off")
ax2.imshow(iimg,cmap="gray")
plt.show()

结果

python-opencv(13)傅里叶变换_计算机视觉_05

4.4 低通滤波代码实现

python-opencv(13)傅里叶变换_代码实现_06

#%%在频域中低通滤波代码实现
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boat.bmp',cv2.IMREAD_GRAYSCALE)
#构建掩模
mask = np.zeros_like(img,dtype=np.uint8)
r,c = mask.shape
r,c = int(r/2),int(c/2)
mask[r-30:r+30,c-30:c+3] = 1 
#进行傅里叶变换
f = np.fft.fft2(img)
ishift = np.fft.ifftshift(f)
ishift = ishift*mask
#逆变换
iimg = np.fft.ifft2(ishift)
#设置区间
iimg = np.abs(iimg)
fig,ax = plt.subplots(1,2,figsize=(7,3))
ax1 = plt.subplot(121)
ax1.imshow(img,cmap="gray")
ax1.axis("off")
ax2 = plt.subplot(122)
ax2.axis("off")
ax2.imshow(iimg,cmap="gray")
plt.show()

结果

python-opencv(13)傅里叶变换_傅里叶变换_07

5. OpenCV实现傅里叶变换

5.1 OpenCV实现傅里叶变换函数

函数:返回结果=cv2.dft(原始图像,转换标识)

  • 返回结果:是双通道的,第一个的结果是虚数部分,第二个通道的结果是实数部分。
  • 原始图像:输入的图像首相应该转换为np.float32格式,np.float(img)
  • 转换标识:flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列

函数:numpy.fft.fftshift 将零频率分量移到频谱中心。如下图所示:

python-opencv(13)傅里叶变换_代码实现_08


函数:返回值=cv2.magnitude(参数1,参数2)

计算幅值。参数1:浮点型X坐标值,也就是实部;参数2:浮点型Y坐标值,也就是虚部。

上一篇: Python示例:使用torch.fft.fftshift进行傅里叶转换位移-注意事项

下一篇: 使用Python实现图像的傅里叶变换

推荐阅读