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

简介: 文章目录1. 傅里叶变换的理论基础2. numpy实现傅里叶变换2.1. 相关的函数2.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()

结果

4.4 低通滤波代码实现


#%%在频域中低通滤波代码实现
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()

结果

5. OpenCV实现傅里叶变换

5.1 OpenCV实现傅里叶变换函数

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

返回结果:是双通道的,第一个的结果是虚数部分,第二个通道的结果是实数部分。原始图像:输入的图像首相应该转换为np.float32格式,np.float(img)转换标识:flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列函数:numpy.fft.fftshift将零频率分量移到频谱中心。如下图所示:

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

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

dst(I)=x(I)2+y(I)2

5.2 代码实现

#%%OpenCV实现傅里叶变换函数
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)
#进行傅里叶变换
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
result = 20*np.log(np.abs(cv2.magnitude(dftshift[:,:,0],dftshift[:,:,1])))
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(result,cmap="gray")
plt.show()

结果:

6. OpenCV实现傅里叶逆变换

6.1 OpenCV实现傅里叶逆变换函数

函数:返回结果=cv2.idft(原始数据)

  • 返回结果:取决于原始数据的类型和大小
  • 原始数据:实数或者复数均可以

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

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

dst(I)=x(I)2+y(I)2

6.2 代码实现

#%%OpenCV实现傅里叶逆变换函数
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)
#进行傅里叶变换
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
#变换之后移动到中心
dftshift = np.fft.fftshift(dft)
#移动到最初的位置
ishift = np.fft.ifftshift(dftshift)
#逆变换
iimg = cv2.idft(ishift)
iimg = cv2.magnitude(iimg[:,:,0],iimg[:,:,1])
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()

结果

相关文章
|
3月前
|
机器学习/深度学习 算法 Python
傅里叶变换算法和Python代码实现
傅立叶变换是物理学家、数学家、工程师和计算机科学家常用的最有用的工具之一。本篇文章我们将使用Python来实现一个连续函数的傅立叶变换。
68 8
|
3月前
|
存储 计算机视觉 Python
【python版CV】-直方图 & 傅里叶变换
【python版CV】-直方图 & 傅里叶变换
|
3月前
|
存储 计算机视觉
【OpenCV】—离散傅里叶变换
【OpenCV】—离散傅里叶变换
|
10月前
|
计算机视觉
OpenCV-离散傅里叶变换cv::dft&cv::idft
OpenCV-离散傅里叶变换cv::dft&cv::idft
100 0
|
计算机视觉
OpenCV_10 傅里叶变换:频域滤波+CV的应用
傅里叶变换是由法国的一位数学家Joseph Fourier在18世纪提出来的,他认为:任何连续周期的信号都可以由一组适当的正弦曲线组合而成。
142 0
OpenCV_10 傅里叶变换:频域滤波+CV的应用
|
计算机视觉 Python
cv2实现傅里叶变换---OpenCV-Python开发指南(32)
cv2实现傅里叶变换---OpenCV-Python开发指南(32)
133 0
cv2实现傅里叶变换---OpenCV-Python开发指南(32)
|
数据安全/隐私保护 计算机视觉 Python
傅里叶变换原理---OpenCV-Python开发指南(31)
傅里叶变换原理---OpenCV-Python开发指南(31)
219 0
傅里叶变换原理---OpenCV-Python开发指南(31)
|
计算机视觉 Python
python-opencv(13)傅里叶变换(上)
文章目录 1. 傅里叶变换的理论基础 2. numpy实现傅里叶变换 2.1. 相关的函数 2.1 代码实现
83 0
python-opencv(13)傅里叶变换(上)
|
数据安全/隐私保护 计算机视觉 Python
opencv 傅里叶变换(python)
opencv 傅里叶变换(python)