Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波

1、理论基础

时域角度:从时间节点告诉我们时间发生了什么。
频域角度:频率角度,多久发生一次。
Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第1张图片
相位:时间差的表述,
相位:不是同时开始的一组余弦函数,在叠加时要体现开始的时间。
Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第2张图片

2、numpy实现傅里叶变换

函数:
numpy.fft.fft2:实现傅里叶变换,返回一个复数数组(complex ndarray)

numpy.fft.fftshift:将零频率分量移到频谱中心。

20*np.log(np.abs(fshift)):设置频谱的范围[0,255];先取绝对值,再取log,再乘20
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'D:\image\lena.bmp',0)
f = np.fft.fft2(img)   #进行傅里叶变换
fshift =np.fft.fftshift(f)   #将零频率分量移到位置中心
result = 20*np.log(np.abs(fshift))  #设置范围[0,255]
plt.subplot(121)  #显示图像
plt.imshow(img,cmap='gray')  #灰度空间显示
plt.title('original')  #图像名称
plt.axis('off')      #关闭坐标轴
plt.subplot(122)
plt.imshow(result,cmap = 'gray')
plt.title('result')
plt.axis('off')
plt.show()  #显示

Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第3张图片
傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的。
傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像
在频域对图像进行处理,在频域的处理会反映在逆变换图像上。

3、numpy实现逆傅里叶变换

原图像通过傅里叶变换的到频谱图像
把频谱图像在变换成原图像称为逆傅里叶变换
傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像
可以在频域对图像进行处理,在频域的处理会反映在逆变换图像上。

函数
numpy.fft.ifft2:实现逆傅里叶变换,返回一个复数数组(complex ndarray)

numpy.fft.ifftshift:fftshift函数的逆函数。将零频率分量从频谱中心移到左上角

iimg = np.abs(逆傅里叶变换结果)
#先进行傅里叶变换,在逆变换
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'D:\image\boats.bmp',0)
f = np.fft.fft2(img)   #傅里叶变换
fshift = np.fft.fftshift(f)   #从左上角移动到中心
ishift = np.fft.ifftshift(fshift)  #从中心移动到左上角
iimg = np.fft.ifft2(ishift)  #逆傅里叶变换
iimg = np.abs(iimg)   #将逆变换的得到的负数进行去绝对值
plt.subplot(121),plt.imshow(img, cmap = 'gray')  #原始图像
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(img,cmap= 'gray')  #你傅里叶变换图像
plt.title('iimg'),plt.axis('off')
plt.show()

Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第4张图片

4、高通滤波演示

低频:对应图像内变化缓慢的灰度分量。
例如,在一幅大草原的图像中,低频对应着广袤的颜色趋于一致的草原。

高频:对应图像内变化越来越快的灰度分量,是由灰度的尖锐过渡造成的。
例如,在一幅大草原的图像中,其中狮子的边缘等信息。

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

滤波:接受(通过)或者拒绝一定频率的分量。
通过低频的滤波器称为低通滤波器
通过高频的滤波器称为高通滤波器

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

高通滤波器:去掉低频
把频谱中心位置设置成0:

rows,cols=img.shape   #计算出频谱图像的大小
crow,ccol = int(rows/2),int(cols/2)  #取图像中心位置,行列除以2,取整
fshift[crow-30:crow+30,c col-30:ccol+30] = 0  #以中心为原点,上取30,下取30设置成0
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'D:\image\boats.bmp',0)   #读取图像
#进行傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#高通滤波
rows,cols = img.shape
crow,ccol = int(rows/2),int(cols/2)
fshift[crow-30:crow+30,ccol-30:ccol+30] = 0
#逆傅里叶变换
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
#显示原始图像
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('original'),plt.axis('off')
#显示滤波图像
plt.subplot(122),plt.imshow(iimg, cmap = 'gray')
plt.title('iimg'),plt.axis('off')
plt.show()

Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第5张图片

5、Opencv实现傅里叶变换

函数:
1.返回结果=cv2.dft(原始图像,转换标识)
返回结果:是双通道的。第1个通道是结果的实数部分。第2个通道是结果的虚数部分。
原始图像:输入图像要首先转换成np.float32格式,使用;np.float32(img)
转换标识: flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列。

2.numpy.fft.fftshift:将零频率分量移到频谱中心。

3.返回值=cv2.magnitude(参数1,参数2)  #计算幅值
参数1 :浮点型X坐标值,也就是实部
参数2 :浮点型Y坐标值,也就是虚部
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread(r'D:\image\lena.bmp',0)  #读取图像
dft = cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)    #傅里叶变换
dftShift =np.fft.fftshift(dft)    #移动到中心
result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1]))  #计算幅度
plt.subplot(121),plt.imshow(img, cmap = 'gray')
#显示原始图像
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(result, cmap = 'gray')
#显示幅度
plt.title('result'), plt.axis('off')
plt.show()

Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第6张图片

6、opencv傅里叶逆变换

函数如下:
返回结果=cv2.idft(原始数据)
返回结果:取决于原始数据的类型和大小。
原始数据:实数或者复数均可。

返回值=cv2.magnitude(参数1, 参数2)  计算幅值
参数1 :浮点型X坐标值,也就是实部
参数2 :浮点型Y坐标值,也就是虚部

numpy.fft. ifftshift  移动
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread(r'D:\image\lena.bmp',0)   #读取图像
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])   #计算幅度
plt.subplot(121),plt.imshow(img,cmap = 'gray')  #显示原始图像
plt.title('original'), plt.axis('off')
plt.subplot(122),plt.imshow(iImg,cmap = 'gray')  #显示逆变换结果
plt.title('iverse'), plt.axis('off')
plt.show()

Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第7张图片

7、低通滤波

低通滤波器:衰减高频而通过低频,将模糊一幅图像。

低通滤波器:去掉高频
把频谱中心位置设置成1:

rows,cols=img.shape   #计算出频谱图像的大小
crow,ccol = int(rows/2),int(cols/2)  #取图像中心位置,行列除以2,取整
mask = np.zeros((rows,cols,2),np.uint8)  #构造数组
mask[crow-30:crow+30,c col-30:ccol+30] =1  #以中心为原点,上取30,下取30设置成1
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread(r'D:\image\lena.bmp',0)  #读取图像
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)  #傅里叶变换
dftShift = np.fft.fftshift(dft)  #移动到中心
#构造掩膜图像
rows, cols = img.shape
crow,ccol = int(rows/2),int(cols/2)
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+ 30,ccol-30:ccol+30] = 1

fShift = dftShift*mask  #低频滤波
#逆傅里叶变换
ishift =np.fft.fftshift(fShift) 
iImg = cv2.idft(ishift)
iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])
#显示图像
plt.subplot(121),plt.imshow(img,cmap= 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(iImg,cmap = 'gray')
plt.title('inverse'), plt.axis('off')
plt.show()

Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波_第8张图片

你可能感兴趣的:(openCV学习)